python学习笔记-17. unittest测试框架
文章目录
- python学习笔记-17. unittest测试框架
- 前言
- 一、unittest简介
- 二、unittest的简单使用
- 1. unittest常用方法
- 2. unittest的case执行
- 三、测试结果分析
- 总结
前言
unittest通常用于单元测试
python常见的几种单元测试框架
- unittest
- pytest
- nose
- mock
一、unittest简介
unittest介绍:
unittest是python自带的单元测试框架,在自动化测试中提供用例的管理与执行,提供丰富的判断方法,可以配合HTMLTestRunner生成html的测试报告
unittest编写规范:
- 测试模块首先需要导入模块,import unittest
- 测试类必须继承unittest.TestCase
- 测试方法必须以“test_”开头
- 模块名字和类名没有特殊要求
提供了test cases, test suites, test fixtures, test runner 相关组件
二、unittest的简单使用
1. unittest常用方法
常用方法:
- setUpClass: 所有用例执行开始之前需要执行的方法,为类方法,定义时需要@classmethod注解,执行在setUp之前
- tearDownClass: 所有测试用例执行完成后需要执行的方法,为类方法,定义时需要@classmethod注解,执行在tearDown之后
- setUp:每个测试用例开始之前执行的方法
- tearDown:每条测试用例执行完成后需要执行的方法
- test_caseName:test_开头的方法为测试用例
- @unittest.skip: 放在对应的用例上方进行跳过用例
import unittest
# 测试的类需要继承unittest.TestCase
class demo(unittest.TestCase):
# 作用在所有测试用例执行之前
@classmethod
def setUpClass(cls) -> None:
print("this is setup class")
# 作用在所有测试用例执行之后
@classmethod
def tearDownClass(cls) -> None:
print("this is tearDown class")
# setUp 通常用于编写测试开始前的准备工作,作用在每条测试用例前面
def setUp(self) -> None:
print("this case setup")
# 测试执行完成后进行资源的释放操作,作用在每条测试用例结束后
def tearDown(self) -> None:
print("this is teardown")
# 定义测试用例,注意需要test_格式进行定义
def test_case001(self):
print("testcase001")
# assertEqual方法,比较第一个参数和第二个参数是否相等,不相等执行打印第三个参数的信息
self.assertEqual(1, 1, "判断相等")
# assertIn判断是否包含
self.assertIn('a', 'apple')
# assertNoIn反向判断是否包含
self.assertNotIn('a', 'this')
def test_case002(self):
print("testcase002")
# assertEqual方法,比较第一个参数和第二个参数是否相等,不相等执行打印第三个参数的信息
self.assertEqual(1, 1, "判断相等")
# assertIn判断是否包含
self.assertIn('a', 'apple')
# assertNoIn反向判断是否包含
self.assertNotIn('a', 'this')
def test_case003(self):
print("testcase003")
# assertEqual方法,比较第一个参数和第二个参数是否相等,不相等执行打印第三个参数的信息
self.assertEqual(1, 1, "判断相等")
# assertIn判断是否包含
self.assertIn('a', 'apple')
# assertNoIn反向判断是否包含
self.assertNotIn('a', 'this')
if __name__ == '__main__':
unittest.main()
unittest常用断言:
- assertEqual
- assertIn
- assertTrue
2. unittest的case执行
- 使用unittest.main(): 运行当前模块,所有以test_开头的测试用例
- 使用suite执行:
- suite = unittest.TestSuite()
- suite.addTest(TestMethod(“test_case001”))
- suite.addTest(TestMethod(“test_case002”))
- unittest.TextTestRunner().run(suite)
- 使用TestLoader方法,添加类
- 匹配某个目录下所有test开头的py文件,执行这些文件下的所有测试用例
使用unittest.main()执行
import unittest
class demo(unittest.TestCase):
def test_case001(self):
print("this is test_case001")
def test_case002(self):
print("this is test_case002")
class demo1(unittest.TestCase):
def test_case003(self):
print("this is test_case001")
def test_case004(self):
print("this is test_case002")
if __name__ == '__main__':
unittest.main()
使用suite执行测试用例
import unittest
class demo(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("this is class setUp")
@classmethod
def tearDownClass(cls) -> None:
print("this is class tearDown")
def setUp(self) -> None:
print("this is setUp")
def tearDown(self) -> None:
print("this is tearDown")
def test_case001(self):
print("this is test_case001")
def test_case002(self):
print("this is test_case002")
class demo1(unittest.TestCase):
def test_case003(self):
print("this is test_case003")
def test_case004(self):
print("this is test_case004")
if __name__ == '__main__':
suite = unittest.TestSuite()
# suite中添加测试用例
suite.addTest(demo("test_case001"))
suite.addTest(demo1("test_case003"))
# 运行suite
unittest.TextTestRunner().run(suite)
执行结果
this is class setUp
this is setUp
this is test_case001
this is tearDown
this is class tearDown
this is test_case003
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
使用TestLoader方法
import unittest
class demo(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("this is class setUp")
@classmethod
def tearDownClass(cls) -> None:
print("this is class tearDown")
def setUp(self) -> None:
print("this is setUp")
def tearDown(self) -> None:
print("this is tearDown")
def test_case001(self):
print("this is test_case001")
def test_case002(self):
print("this is test_case002")
class demo1(unittest.TestCase):
def test_case003(self):
print("this is test_case003")
def test_case004(self):
print("this is test_case004")
class demo2(unittest.TestCase):
def test_case005(self):
print("this is test_case005")
def test_case006(self):
print("this is test_case006")
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(demo)
suite1 = unittest.TestLoader().loadTestsFromTestCase(demo2)
suite_all = unittest.TestSuite([suite, suite1])
unittest.TextTestRunner().run(suite_all)
匹配test*.py执行测试用例
# 获取当前目录下,所有test开头的文件,discover方法后面第一个参数为匹配目录,第二个参数为匹配表达式
discover = unittest.defaultTestLoader.discover("./", 'test*.py')
unittest.TextTestRunner().run(discover)
三、测试结果分析
htmltestrunner
下载htmltestrunner:https://codeload.github.com/huilansame/HTMLTestRunner_PY3/zip/refs/heads/master
pychar打开项目:
在test.py中定义了报告生成的相关代码
import unittest
from HTMLTestRunner_PY3 import HTMLTestRunner
if __name__ == '__main__':
# 定义报告title
report_title = 'Example用例执行报告'
# 定义报告的描述
desc = '用于展示修改样式后的HTMLTestRunner'
# 定义报告生成的文件名称
report_file = 'ExampleReport.html'
# 使用unittest创建测试套件,然后使用addTest方法添加测试用例
testsuite = unittest.TestSuite()
testsuite.addTest(unittest.TestLoader().loadTestsFromTestCase(TestTest))
testsuite.addTest(unittest.TestLoader().loadTestsFromTestCase(ExampleCase1))
testsuite.addTest(unittest.TestLoader().loadTestsFromTestCase(ExampleCase2))
testsuite.addTest(unittest.TestLoader().loadTestsFromTestCase(ExampleCase3))
with open(report_file, 'wb') as report:
# 使用HTMLTestRunner,执行并生成测试报告
runner = HTMLTestRunner(stream=report, title=report_title, description=desc)
runner.run(testsuite)
总结
测试用例执行过程:
- 编写测试用例,即test_case_name
- 由TestLoader加载TestCase到TestSuite中
- 由TextTestRUnner运行TestSuite
- 运行结果保存到TextTestResult中
- 整个过程集成在unittest.main模块中
- TestCase和TestSuite都可以是多个