unittest
unittest是Python单元测试框架,类似于jUnit框架。
unittest中有5个重要的概念: test fixture, test case, test suite, test runner, test loader
Testcase:
一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp) ,执行测试代码(run),以及测试后环境的还原(tearDown)。单元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过行这个测试单元,可以对某一个问题进行验证。
Test suite:
多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。 多个测试用例集合在一起,就是测试套件,而且测试套件也可以嵌套测试套件。
Test runner:
是来执行测试用例的,其中的run(test) 会执行TestSuite/TestCase中的run(result)方法。
TestLoader:
是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom_ () 方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回-个TestSuite实例。
Test fixture :
对一个测试用例环境的搭建和销毁,是- -个fixture,通过覆盖TestCase的setUp()和tearDown()方法来实现。
小例子:品,细品
# -*- coding: utf-8 -*-
import unittest
class MyTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('我是类setUpClass')
@classmethod
def tearDownClass(cls):
print('我是类tearDownClass')
def setUp(self):
print('我是setUp')
def test01(self):
print('第一个测试用例')
self.assertEqual(1+1,2)
def test02(self):
print('第二个测试用例')
self.assertGreaterEqual(2,1)
def tearDown(self):
print('我是tearDown')
if __name__ == '__main__':
unittest.main()
我是类setUpClass
..
我是setUp
----------------------------------------------------------------------
第一个测试用例
Ran 2 tests in 0.000s
我是tearDown
我是setUp
第二个测试用例
我是tearDown
OK
我是类tearDownClass
setup和teardown
方法分类
分为类方法,类方法只执行一-次
实例方法,实例方法每次运行用例都执行。
执行顺序.
setUpClass->setUp->testA->tearDown->setUp->testB>tearDown->tearDownClass
用例之间按用例名称ASCI码的顺序加载,数字与字母顺序为0~9, A~Z, a~Z。
断言方法:
序号 | 方法 | 检查 |
1 | assertEqual(a, b) | a==b |
2 | assertNotEqual(a, b) | a!=b |
3 | assertTrue(x) | bool(x) is True |
4 | assertFalse(x) | Bool(x) is False |
5 | assertls(a, b) |
a is b |
6 | assertlsNot(a, b) | a is not b |
7 | assertlsNone(x) | x is None |
8 | assertlsNotNone(x) | X is not None |
9 | assertln(a, b) | a in b |
10 | assertlsInstance(a, b) | isinstance(a,b) |
11 | assertNotlsInstance(a, b) | not isinstance(a,b) |
加载测试用例的四种方法
实例化
suite = unittest.TestSuite()
loader = unittest.TestLoader()
方法一:通过测试用例类进行加载
suite.addTest(loader.loadTestsFromTestCase(MyTest1))
suite.addTest(loader.loadTestsFromTestCase(MyTest2))
# -*- coding: utf-8 -*- import unittest class MyTestCase01(unittest.TestCase): def test01(self): print('第一个测试用例') def test02(self): print('第二个测试用例') class MyTestCase02(unittest.TestCase): def test03(self): print('第三个测试用例') def test04(self): print('第四个测试用例') if __name__ == '__main__': loader = unittest.TestLoader() suite = unittest.TestSuite() suite.addTest(loader.loadTestsFromTestCase(MyTestCase01)) suite.addTest(loader.loadTestsFromTestCase(MyTestCase02)) runner = unittest.TextTestRunner() runner.run(suite)
.... 第一个测试用例 ---------------------------------------------------------------------- 第二个测试用例 Ran 4 tests in 0.000s 第三个测试用例 第四个测试用例 OK
方法二:通过测试用例模板去加载
suite.addTest(loader.loadTestsFromModule(MyTest1))
suite.addTest(loader.loadTestsFromModule(MyTest2))
# *_*coding:utf-8 *_* # @Author : zyb # -*- coding: utf-8 -*- import unittest class MyTestCase01(unittest.TestCase): def test01(self): print('第一个测试用例') def test02(self): print('第二个测试用例') class MyTestCase02(unittest.TestCase): def test03(self): print('第三个测试用例') def test04(self): print('第四个测试用例') if __name__ == '__main__': loader = unittest.TestLoader() suite = unittest.TestSuite() suite.addTest(loader.loadTestsFromModule(MyTestCase01)) suite.addTest(loader.loadTestsFromModule(MyTestCase02)) runner = unittest.TextTestRunner() runner.run(suite)
方法三:通过路径加载
import os
path = os.path.dirname(os.path.abspath(_ file__ ))
suite.addTest(loader.discover(path))
# *_*coding:utf-8 *_* # @Author : zyb # -*- coding: utf-8 -*- import unittest class MyTestCase01(unittest.TestCase): def test01(self): print('第一个测试用例') def test02(self): print('第二个测试用例') class MyTestCase02(unittest.TestCase): def test03(self): print('第三个测试用例') def test04(self): print('第四个测试用例') if __name__ == '__main__': loader = unittest.TestLoader() suite = unittest.TestSuite() import os run_path=os.path.dirname(os.path.abspath(__file__)) suite.addTest(loader.discover(run_path)) runner = unittest.TextTestRunner() runner.run(suite)
方法四:逐条加载测试用例
case1 = MyTest1("test1")
case2 = MyTest1("test2")
suite.addTest(case1)
suite.addTest(case2)
# *_*coding:utf-8 *_* # @Author : zyb # -*- coding: utf-8 -*- import unittest class MyTestCase01(unittest.TestCase): def test01(self): print('第一个测试用例') def test02(self): print('第二个测试用例') class MyTestCase02(unittest.TestCase): def test03(self): print('第三个测试用例') def test04(self): print('第四个测试用例') if __name__ == '__main__': loader = unittest.TestLoader() suite = unittest.TestSuite() case1 = MyTestCase01("test01") case2 = MyTestCase02("test04") suite.addTest(case1) suite.addTest(case2) runner = unittest.TextTestRunner() runner.run(suite)
第一个测试用例 .. 第四个测试用例 ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK