unittest
Unittest 是 python 单元测试框架,类似 JUnit 框架。
Unittest 概述
test fixture
一个测试用例环境的搭建和销毁是一个fixture,通过覆盖 test case 的 setUp() 和 tearDown() 实现。
test case 测试用例
为一个完整的测试流程,包括测试区准备环境的搭建setup,执行测试代码 run,及测试后环境还原 teardown.
test suite 测试套件
多个测试用例结合在一起为 test suite, test suite 也可嵌套 test suite.
test runner 测试运行器
用来执行测试用例,run(test) 会执行 test suite/testcase中的 run(result) 方法。
test loader 测试加载器
用来加载 test case 到 test suite
setup 和 tearDown
方法分类
- 类方法:只执行一次
- 实例方法:每次运行用例都执行
执行顺序
- setupClass > setUp > testA > tearDown > setup > test B >tearDown …> tearDownClass
- test case之间按名称顺序加载
断言
示例:
import unittest
class TestCase01(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print('setUpClass....')
def setUp(self) -> None:
print('setUp....')
def test01(self):
self.assertEqual(1+2, 3)
def test02(self):
self.assertGreater(1+2, 0)
def tearDown(self) -> None:
print('tearDown....')
@classmethod
def tearDownClass(cls) -> None:
print('tearDownClass....')
if __name__ == '__main__':
unittest.main
运行结果:
setUpClass....
setUp....
tearDown....
setUp....
tearDown....
tearDownClass....
Ran 2 tests in 0.002s
OK
Process finished with exit code 0
测试用例加载
测试用例类加载
import unittest
class TestCase01(unittest.TestCase):
def test01(self):
print('test01....')
self.assertEqual(1+2, 3)
def test02(self):
print('test02....')
self.assertGreater(1+2, 0)
class TestCase02(unittest.TestCase):
def test03(self):
print('test03....')
self.assertEqual(1+2, 3)
def test04(self):
print('test04....')
self.assertGreater(1+2, 0)
if __name__ == '__main__':
loader = unittest.TestLoader()
suite = unittest.TestSuite()
suite.addTest(loader.loadTestsFromTestCase(TestCase01))
suite.addTest(loader.loadTestsFromTestCase(TestCase02))
runner = unittest.TextTestRunner()
runner.run(suite)
测试用例模板加载
suite.addTest(loader.loadTestsFromModule(TestCase01))
suite.addTest(loader.loadTestsFromModule(TestCase02))
路径加载
import unittest
import os
if __name__ == '__main__':
loader = unittest.TestLoader()
suite = unittest.TestSuite()
path = os.path.dirname(os.path.abspath(__file__))
suite.addTest(loader.discover(path))
runner = unittest.TextTestRunner()
runner.run(suite)
逐条加载 --不推荐
if __name__ == '__main__':
loader = unittest.TestLoader()
suite = unittest.TestSuite()
case1= TestCase01("test01")
case2 = TestCase01("test02")
case3 = TestCase01("test03")
case4 = TestCase01("test04")
suite.addTest(case1)
suite.addTest(case2)
suite.addTest(case3)
suite.addTest(case4)
runner = unittest.TextTestRunner()
runner.run(suite)
使用 unittest 重构测试用例
- 继承的是用例 unittest.TestCase
- 将 init 修改为 setup
- 将 assert 断言修改为 unittest 断言
- 将关闭浏览器放到 teardown
- 第二次测试需清空数据
- 测试顺序加序号