介绍
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文件
Techie亮博客,转载请注明:Coologic » python单元测试