介绍
python提供了unittest模块进行单元测试,其主要涉及到测试用例, 测试环境,测试集合,后处理
基本使用
构建测试类及测试用例
假如有下面两个方法
def add(a, b): return a+b def minus(a, b): return a-b
编写对应的单元测试,首先建立一个测试用例要继承自unittest.TestCase
import unittest from XX import XX class TestMath(unittest.TestCase): def test_add(self): self.assertEqual(10, add(5, 5)) self.assertNotEqual(0, add(5, 5)) def test_minus(self): self.assertEqual(0, minus(5, 5)) self.assertNotEqual(10, add(5, 5)) if?__name__?==?'__main__': ????unittest.main()
运行测试
上面代码最后就是运行方法
运行环境
运行前后
对于运行过程,测试用例中的多个测试方法需要相同的环境,可以使用setUp、tearDown两个方法,保证每个测试方法运行前后分别执行,搭建/清理环境,除此以外还有在整个用例开始前后运行的方法setUpClass、tearDownClass。注:TestMath是一个测试用例test_add、test_minus是两个测试方法。范例:
import unittest class TestTest(unittest.TestCase): def test_add(self): print('#test_add') def test_add2(self): print('#test_add2') def setUp(self): print('#setUp') def tearDown(self): print('#tearDown') @classmethod def setUpClass(cls): print('#setUpClass') @classmethod def tearDownClass(cls): print('#tearDownClass') if __name__ == '__main__': unittest.main()
打出的内容:
testtest.py #setUpClass
.#setUp
#test_add
#tearDown
.#setUp
#test_add2
#tearDown
#tearDownClass
跳过某测试
除此以外,对于测试过程还提供了可定制功能,通过@unittest.skip装饰器可以实现对某个测试的忽略,并可在参数中写入忽略的提示内容
将上述文件改变后测试:
import unittest class TestTest(unittest.TestCase): def test_add(self): print('#test_add') @unittest.skip('skip test_add2') def test_add2(self): print('#test_add2') def setUp(self): print('#setUp') def tearDown(self): print('#tearDown') @classmethod def setUpClass(cls): print('#setUpClass') @classmethod def tearDownClass(cls): print('#tearDownClass') if __name__ == '__main__': unittest.main()
testtest.py #setUpClass
.#setUp
#test_add
#tearDown
s
Skipped: skip test_add2
#tearDownClass
除此以外还有@unittest.skipIf()、@unittest.skipUnless()两种装饰器
测试套件
对于测试顺序需要定制、多个测试用例的多个方法的顺序安排可以用如下方法:
不改变上面的测试文件,在建立一个测试套件文件,实现自动化测试:
import unittest from test.testtest import TestTest if __name__ == '__main__': suite = unittest.TestSuite() tests = [TestTest("test_add2"), TestTest("test_add")] suite.addTests(tests) runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)
打出结果:
#setUpClass
#setUp
test_add2 (test.testtest.TestTest) … ok
#test_add2
#tearDown
#setUp
#test_add
test_add (test.testtest.TestTest) … ok
#tearDown
#tearDownClass
注意:suite可以嵌套
后处理
文本形式的显示效果很差,可以使用HTMLTestRunner模块进行处理,下载地址,下载完成后放在测试目录下。
使用和上面的套件一样,还是需要单独建立一个文件,下面的例子通过TestLoader的方式构建测试套件,而不是通过addTests方法自行构建套件
这个模块不支持python3,需要自行修改一下语法,请见https://www.cnblogs.com/testyao/p/5658200.html
import unittest from test.testtest import TestTest from test.HTMLTestRunner import HTMLTestRunner if __name__ == '__main__': suite = unittest.TestSuite() suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestTest)) with open('HTMLReport.html', 'wb') as f: runner = HTMLTestRunner(stream = f, title='MathFunc Test Report', description='generated by HTMLTestRunner.', verbosity=2) runner.run(suite)
打开类型要wb,传入参数一定是f而不是’f’。最后就会在当前目录下创建出HTMLReport.html文件
最新评论