当前位置: 首页 > 图灵资讯 > 行业资讯> Python和单元测试那些事儿

Python和单元测试那些事儿

发布时间:2025-09-29 11:05:43

让我们谈谈与测试相关的几件事(整个过程) Python 3)。

Mock

Mock是一件好事。如果在测试中遇到不可预测或不稳定的因素,请使用它 Mock 来代 替换。例如,查询数据库(当然,就像我们目前使用的MongoDB一样,它可以直接在代码中,因为它非常灵活 替换相应的collection),如异步任务等。例如:

importlogging
fromunittest.mockimportMock
logging.basicConfig(level=logging.DEBUG)
#code
classASpecificException(Exception):
pass
deffoo():
pass
defbar():
try:
logging.info("enterfunction<foo>now")
foo()
exceptASpecificException:
logging.exception("wecaughtaspecificexception")
#unittest
deftest_foo():
foo=Mock(side_effect=ASpecificException())#noqa
logging.info("enterfunction<bar>now")
bar()
logging.info("everythingjustbefine")
if__name__=="__main__":
test_foo()

运行一下

root@archtests:pythontest_demo.py
INFO:root:enterfunction<bar>now
INFO:root:enterfunction<foo>now
INFO:root:everythingjustbefine

就这样写了一个简单的测试。来,和我一起读,Mock 大法好呀!

doctest

doctest是一个相对简单的测试,写在 docstring 在里面,它不仅可以测试,还可以用作文档 例如,它非常容易使用。缺点是,如果测试过于复杂,doctest就会显得过于臃肿(例如 如果在测试前导入一堆东西)。例如:

importlogging
logging.basicConfig(level=logging.DEBUG)
deffoo():
"""AutilityfunctionthatreturnsTrue
>>>foo()
True
"""
returnTrue
if__name__=="__main__":
importdoctest
logging.debug("startoftest...")
doctest.testmod()
logging.debug("endoftest...")

测试结果

root@archtests:pythontest_demo.py
DEBUG:root:startoftest...
DEBUG:root:endoftest...

unittest

这个文档真的有点长。我觉得最好仔细阅读文档。

importunittest
classTestStringMethods(unittest.TestCase):
defsetUp(self):
self.alist=[]
deftearDown(self):
print(self.alist)
deftest_list(self):
foriinrange(5):
self.alist.append(i)
if__name__='__main__':
unittest.main()

输出结果

root@archtests:pythontest_demo.py
[0,1,2,3,4]
.
----------------------------------------------------------------------
Ran1testin.001s

OK

Unittest框架配合Mock,单元测试基本无忧。

pytest

上述单元测试运行起来比较麻烦,当然也可以写一个脚本遍历所有单元测试文件,但是 然后执行。但是 pytest 更好地支持unittest。

默认支持pytest 函数 风格测试,但我们不能使用这一块(而且很多时候 还是很有用的)。进入项目根目录,输入 pytest 就可以了。它会自动发现。 test_ 开头的文件,然后执行 test_ 开头的函数和 unittest 的 test_ 开头的 方法。

root@archtests:pytest
=============================================testsessionstarts==============================================
platformlinux--Python3.5.2,pytest-3.0.5,py-1.4.31,pluggy-0.4.0
rootdir:/root/tests,inifile:
collected1items
test_afunc.py.
====================================1pasedin0.03secondssecondssedssedin0.03=======================================================
root@archtests:

总结

如果编译器没有检查python,我们只能手写测试 :(

另外其实 pytest 和 unittest 有很多强大的特点,比如 fixture,例如 skip 测试的某一部分。

相关文章

Python中lambda表达式的优缺点及使用场景

Python中lambda表达式的优缺点及使用场景

2025-09-29
详解json.dumps中文乱码问题

详解json.dumps中文乱码问题

2025-09-29
Python和单元测试那些事儿

Python和单元测试那些事儿

2025-09-29
Python的高级特性:容易忽略的不可变类型

Python的高级特性:容易忽略的不可变类型

2025-09-28
一篇文章教你如何使用Python生成器

一篇文章教你如何使用Python生成器

2025-09-28
小白必看的Python函数讲解

小白必看的Python函数讲解

2025-09-28