unittest是Python自带单元测试框架,提供丰富的用例管理、执行和断言操作。
(1)TestCase,测试用例,继承于TestCase的类或者TestCase的实例就是一个测试例。在unittest中表示测试用例的方法都必须以test开头才能被执行,各个方法之间的执行顺序按照ASCII值排序。
import unittest
class TestDemo(unittest.TestCase):
def test_case(self):
print('测试用例方法......')
def non_test(self):
# 非test开头的测试用例在测试执行时不会被执行
print('非测试用例方法')
if __name__ == '__main__':
# 执行测试用例
unittest.main()
(2)TextFixture, 测试夹具。用于测试用例执行前前置条件的准备与执行完毕后的处理。提供以下常用方法:
·setUp(),表示每个测试用例执行前进行的操作
·tearDown(),表示每个测试用例执行完毕之后的操作
·setUpClass(),类方法,表示所有测试用例执行之前的操作,只执行一次
·tearDownClass(),类方法,表示所有测试用例执行完毕之后的操作,只执行一次
import unittest
class TestDemo(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print('running setUpClass...')
def setUp(self) -> None:
print('running setUp...')
def tearDown(self) -> None:
print('running tearDown...')
@classmethod
def tearDownClass(cls) -> None:
print('running tearDownClass...')
def test_case(self):
print('测试用例方法......')
if __name__ == '__main__':
unittest.main()
(3)TestSuite,测试套件,把需要执行的测试用例放在一起。有两种常用方式来创建测试套件。
·使用TestSuite类直接构建
suit = unittest.TestSuite(tests=()) 直接传入要执行的测试用例tests, tests必须是一个包含单独测试用例的可迭代对象或者其他测试套件 如:
suit = unittest.TestSuite((TestDemo.test_case,))
·使用TestSuite类实例对象的addTest()与addTests()方法构建
addTest() ,一次只能添加一条测试用例
suit = unittest.TestSuite()
suit.addTest(TestLogin('test_1')) # 添加TestLogin类的test_
addTests() 一次可以添加多条测试用例
suit = unittest.TestSuite()
# 添加TestLogin类的test_1 test_2
suit.addTests([TestLogin('test_1'), TestLogin('test_2')])
(4)TestRunner,测试执行器 执行测试用例,并返回测试用例的执行结果,还能将结果以HTML或者Text形式展示出来。即HTMLTestRunner与TextTestRunner
·HTMLTestRunner
# 以HTML形式显示测试报告
# 1、创建执行器
runner = HTMLTestRunner(
stream=xxx , # 指定输出方式
tester=xxx , # 测试人员
description=xxx , # 测试报告描述信息
title=xxx , # 测试报告标题
verbosity=num , # 测试报告详细程度, 有3个值(0 1 2默认2(最详细)) )
# 2、启动执行器运行测试用例, suit即上文装载了测试用例的TestSuite
runner.run(suit)
·TextTestRunner
# 以Text形式显示测试报告
# 1、创建执行器
runer = TextTestRunner(
stream=xxx, # 指定输出方式(默认为None, 输出到控制台)
# 输出到文件 with open('file',''wb) as file_name, stream=file_name
verbosity=num , # 测试报告详细程度, 有3个值(0 1 2默认2(最详细))
description=xxx , # 测试报告描述信息
)
# 2、启动执行器运行测试用例
runner.run(suit)
(5)TestLoader,测试装载器,用来将TestCase添加到TestSuite中,有以下几种常用方式 ·loadTestsFromTestCase() 通过类名将测试用例添加到测试套件中
suit = unittest.TestLoader().loadTestsFromTestCase(TestCaseClass)
·loadTestsFromModule() 通过模块名将测试模块添加到测试套件中
suit = unittest.TestLoader().loadTestsFromModule(TestCaseModuleName)
·loadTestsFromName() 通过名字将测试用例添加到测试套件中,可以是模块,测试用例类或者测试用例类中测试方法
suit = unittest.TestLoader().loadTestsFromName(class.method)
suit = unittest.TestLoader().loadTestsFromName(module.class)
...
·loadTestsFromNames() 将序列中的测试用例添加到测试套件中
suit = unittest.TestLoader().loadTestsFromNames(['test_1', 'tesst_2' [,...]])
·discover() 将指定路径下指定开头的文件添加到测试套件中(也可以使用unittest中的defaultTestLoader的discover方法)
suit = unittest.TestLoader().discover(
start_dir=xxx , # 测试用例所在路径
pattern=xxx , # 匹配规则,符合条件的加入到TestSuite中
top_level_dir=xxx , # 顶层目录名称,默认None
)
# 执行测试用例
runner = unittest.TextTestRunner()
runner.run(suit)
断言在测试中用来判断实际结果与预期结果是否相等,在unittest框架中,可以使用Python自带的断言,也可以使用unittest框架中的断言。
·Python中断言 直接使用 assert 表达式即可
·unittest中断言
assertEqual(a, b,msg=None)
assertNotEqual(a, b,msg=None)
assertIn(a, b) ...
(1) skip装饰器
skip装饰器可以跳过某些测试用例,skip主要有四种用法:
·@unittest.skip(reason) 无条件跳过,reason描述跳过的原因
·@unittest.skipIf(condition, reason) 有条件跳过,当条件满足时跳过该测试用例
·@unittest.skipUnless(condition, reason) 有条件跳过,当condition条件不满足时跳过该测试用例
·@unittest.exceptedFailure 用于标记期望执行失败的测试方法,如果该测试方法执行失败则被认为成功,如果执行成功则被认为是失败。
import unittest
class TestLogin(unittest.TestCase):
def setUp(self) -> None:
# 创建套件,每次执行用例前都会执行一次
print("测试用例执行前准备条件...")
def test_name(self):
# 创建第一个测试方法
assert 'Tom' == 'Bob'
def test_id(self):
# 创建第二个测试方法
self.assertEqual('2983', '2983')
@unittest.skipIf('test' in 'python test', reason='满足条件跳过该用例')
def test_time(self):
self.assertNotEqual('B','C')
if __name__ == '__main__':
# 创建测试套件,并装载测试用例
suit = unittest.TestLoader().loadTestsFromTestCase(TestLogin)
# 创建执行器
runner = unittest.TextTestRunner(
stream=None, # 输出到终端
descriptions='unittest 测试框架',
verbosity=2
)
# 执行测试用例
runner.run(suit)