Python中的unittest
unittest是Python中自带的一个用于单元测试的库,可以满足我们大部分的测试需求。
以前撸个代码一般只是侧重功能实现,往往对于测试不屑一顾,但是在最近一个小工程上,我初步尝试了一下测试驱动开发的开发流程,发现测试对于开发效率是有提升的,虽然要编写很多测试相关的代码,但是一旦测试完善起来,对于后期我们的代码重构或者代码调试是有很大帮助的。
对于比较小的工程,直接使用unittest基本可以满足我们所有的测试需求。
一个工程样例
这里我贴一下我目前用的工程目录结构:
.
├── demo
│ ├── __init__.py
│ ├── foo.py
│ └── test
│ ├── __init__.py
│ ├── run.py
│ └── test_foo.py
└── runtests.sh
demo
是我们示例的工程模块,__init__.py
是Python模块必须的一个文件,foo.py是我们的一个工程代码,test下面是所有和测试相关的代码,runtests.sh
是运行测试的一个脚本。
foo.py
定义了一个待测试的函数:
#!/usr/bin/python3
#-*- coding:utf-8 -*-
def foo(a:int, b:int)->int:
return a + b
test_foo.py
是这个函数的测试代码:
#!/usr/bin/python3
#-*- coding:utf-8 -*-
from unittest import TestCase
from demo.foo import foo
class FooTest(TestCase):
def test_foo(self):
self.assertEqual(foo(1, 2), 3)
run.py
是提取测试用例的一个小脚本,可以直接运行所有的测试:
#!/usr/bin/python3
#-*- coding:utf-8 -*-
import unittest
def main():
suites=unittest.TestLoader().discover('./demo/test', pattern='test_*.py')
runner = unittest.TextTestRunner()
result = runner.run(suites)
if(len(result.errors) > 0 or len(result.failures) > 0):
print("Test failed: ", result)
exit(1)
if __name__ == "__main__":
main()
这个脚本会从test目录中提取所有以test_
结尾的py文件,并逐一进行测试。
而runtest.sh
是调用run.py的一个脚本
#!/bin/sh
cd $(dirname $0)
python3 -m demo.test.run "$@"
搞定这些直接每次提交代码之前运行一下测试:
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
OK, 完事提交。
最后更新于 2020-02-15 03:47:24 并被添加「python 编程 测试」标签,已有 2406 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。