unit test
核心概念
- TestCase:测试用例:用类的方式 组织对一个功能的多项测试
- Fixture : 夹具,用来固定测试环境
- TestSuite:测试套件:组织多个TestCase
- TestRunner:测试执行:用来执行TestSuit,可以导出测试结果
入门
- 类需要继承
unittest.TestCase
- 需要以test开头的实例方法,且不能有参数。
unittest是python自带的,需要额外去安装组件。
import unittest
class TestOne(unittest.TestCase):
def test_01(self):
print("这是test_01")
def test_02(self):
print("这是test_02")
if __name__ == '__main__':
unittest.main()
断言
TestCase中有assert开头的方法,各种关系断言。
import unittest
class TestOne(unittest.TestCase):
def test_01(self):
print("这是test_01")
self.assertIn("a", "hello")
def test_02(self):
print("这是test_02")
if __name__ == '__main__':
unittest.main()
子测试
可以用来执行多次相似的测试(参数不同)。并得到多次测试结果。
import unittest
class NumberTest(unittest.TestCase):
def test_even(self):
for i in range(0, 6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0)
当 i=1,3,5时断言失败,但不影响全部参数一组测试的执行。
夹具
- 模块级别:文件被加载和销毁时执行
- 类级别:类信息被加载和销毁时执行
- 实例级别:每个实例中的方法被调用和执行完毕后执行
# @creator by wlh
# @date 2023/3/8 10:50
import unittest
# 模块级别
def setUpModule():
print("setUpModule")
def tearDownModule():
print("tearDownModule")
class TestOne(unittest.TestCase):
# 类级别
@classmethod
def setUpClass(cls):
print("setUpClass")
@classmethod
def tearDownClass(cls):
print("tearDownClass")
# 测试方法
def test_01(self):
print("这是test_01")
def test_02(self):
print("这是test_02")
# 实例级别
def setUp(self):
print("setUp")
def tearDown(self):
print("tearDown")
if __name__ == '__main__':
unittest.main()
测试套件 TestSuit
- 添加单个测试方法
import unittest
from unittest import TextTestRunner
from unittestcode.test_unit_01 import TestOne
# 获取 套件实例
suite = unittest.TestSuite()
# 添加要测试的方法
suite.addTest(TestOne("test_01"))
# 获取runner实例
runner = TextTestRunner()
# 开始执行
runner.run(suite)
############################################################################
setUpModule
setUpClass
setUp
这是test_01
tearDown
tearDownClass
tearDownModule
- 批量
# 添加要测试的方法 ---- 单量
# suite.addTest(TestOne("test_01"))
# 添加多个测试方法 ---- 批量
suite.addTests(map(TestOne, ["test_01", "test_02"]))
- 全部
# @creator by wlh
# @date 2023/3/8 11:22
import unittest
from unittest import TextTestRunner
from unittest.loader import makeSuite
from unittestcode.test_unit_01 import TestOne
# 获取 套件实例
suite = unittest.TestSuite()
# 执行全部
suite.addTest(makeSuite(TestOne))
# 获取runner实例
runner = TextTestRunner()
# 开始执行
runner.run(suite)
TestLoader
通过指定规则,快速找到所有的测试用例(即一个TestSuite)
import unittest
from unittest import TextTestRunner
test_dir = "./"
# 获取 套件实例 找当前目录下所有的 test_ 开头的文件
suite = unittest.defaultTestLoader.discover(test_dir, pattern="test_*.py")
# 获取runner实例
runner = TextTestRunner()
# 开始执行
runner.run(suite)
测试报告
-
安装第三方插件
pip install html-testRunner
-
执行测试,生成报告
import unittest import HtmlTestRunner.runner test_dir = "./" # 获取 套件实例 找当前目录下所有的 test_ 开头的文件 suite = unittest.defaultTestLoader.discover(test_dir, pattern="test_*.py") # 获取runner实例 runner = HtmlTestRunner.runner.HTMLTestRunner() # 开始执行 runner.run(suite)
完毕后,当前目录下会生成一个 reports目录,然后报告都在这个目录下。