进步始于交流
收获源于分享

python单元测试

版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:python单元测试     本文地址:http://techieliang.com/2018/04/1062/

介绍

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亮博客 » python单元测试
分享到: 更多 (0)