python每日一练之单元测试
Posted Cc905
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python每日一练之单元测试相关的知识,希望对你有一定的参考价值。
官方文档地址:https://docs.python.org/zh-cn/3.7/library/unittest.html#class-and-module-fixtures
一、关于一些基本概念
Test fixture 官方文档把这个词翻译成“测试脚手架”,个人理解,是启动测试前的准备工作,根据使用API的不同,实现在每个用例执行前/后、类执行前/后、模块启动前/后的动作。
测试用例 检查特定输入的数据时的响应。
Test suite测试套件 用例执行的顺序
Test runner 执行和输出测试结果的组件
二、一个小例子
TestEx继承测试基类TestCase,test告诉测试运行者这个方法表示测试。不符合此命名规则的方法,执行测试时不会运行。__init__方法会执行三次,并且都是在测试用例执行前。
unittest.main() :
三、命令行执行
后面再补充
四、TestCase类
用例执行前/后需要执行的指令。
1.setUp()
每个用例执行前都会执行,如果此方法有问题,将会被测试框架视为这个测试失败,用例方法和tearDown不会被执行。如果setUp成功运行,不管用例方法结果如何,tearDown()都会被执行。
2.tearDown()
用例执行结束后运行。
3.setUpClass()
当测试套件遇到来自新类的测试时,将调用前一个类的tearDownClass()(如果有),然后调用这个新类的setupClass()。
如果在setUpClass期间引发异常,则不会运行该类中的测试,也不会运行tearDownClass。跳过的类将不会运行setUpClass或tearDownClass。如果该异常是SkipTest异常,则该类将被报告为已跳过而不是错误。
4.tearDownClass()
运行完所有测试后
class TestAnimal(unittest.TestCase): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @classmethod def setUpClass(self): self.animal_object = Animal(\'animal\', 35) print(\'类方法setUp\') @classmethod def tearDownClass(self): print(\'类方法 tearDown\') def setUp(self): print(\'我会在用例执行前执行\') def tearDown(self): print(\'我会在用例执行后执行\') def test_test3_1(self): print(\'我开始了\') re1 = self.animal_object.test4(1) self.assertEqual(re1, 1, \'测试失败\') re3 = self.animal_object.test4(None) self.assertIsNotNone(re3,\'测试失败\') print(\'如果我前面断言失败了,我不会执行\') self.assertIsNotNone(re1,\'测试失败\') def test_test3_2(self): print(\'我在后面\') re2 = self.animal_object.test4(True) self.assertTrue(re2, \'测试失败\') if __name__==\'__main__\': test_suite = unittest.TestSuite() tests = [TestAnimal(\'test_test3_2\'), TestAnimal(\'test_test3_1\')] test_suite.addTests(tests) runner = unittest.TextTestRunner() runner.run(test_suite)
5.setupModule()
与前面类似,不过这里指的是模块。如果setUpModule中引发了异常,则模块中的任何测试都不会运行,而tearDownModule也不会运行。如果该异常是SkipTest异常,则该模块将被报告为已跳过而不是错误。
6.tearDownModule
运行完所有的测试后
7.断言
assertEqual(a, d, msg=\'测试失败时打印的信息\')
assertNotEqual(a,b, msg=\'测试失败时打印的信息\')
assertTrue(a,msg=\'测试失败时打印的信息\') 断言a是否为真
assertFalse(a,msg=\'\')断言a是否为假
assertIs(a,b,msg=\'...\') 断言a是否是b
assertNotIs(a,b,msg=\'\')断言a不是b
asserIsInstance(a,d,msg=\'\')断言a是b的一个实例
assertNotIsInstance(a, b,msg=\'\')
五、装饰器
1.无条件跳过@unittest.skip(reason) 无条件跳过用例或者测试类,并输出原因
2.@unittest.skipIf(condition, reason) condition为真时跳过,输出原因
2.@unittest.skipUnless(condition, reason) condition为假时跳过,输出原因
3.@unittest.expectedFailure 把测试标记为失败,如果测试不通过,会被认为测试成功,反之失败。
4.exception unittest.skipTest(reason) 引发此异常以跳过一个测试。存疑~
六、TestSuite和TextTestRunner
1.test_suit.addTest()实现执行顺序
test_suit=unittest.TestSuite()
tests=[TestClass(‘testcase1),...]
test_suit.addTests(tests) # 添加case列表,或者addTest(TestClass(‘testcase1))逐个添加。非test开头的方法也可添加进来作为测试用例使用。
runner=unittest.TextTestRunner()
runner.run(test_suit)
2.unittest.TestLoader() 暂未展开
suit.addTests(unittest.TestLoader().loadTestsFromCase(TestClass)) 加载testCase,测试方法按照test_后面的字母顺序执行
七、HTMLReport
下载安装https://pypi.org/project/HTMLReport/
# 测试套件
suite = unittest.TestSuite()
# 测试用例加载器
loader = unittest.TestLoader()
# 把测试用例加载到测试套件中
suite.addTests(loader.loadTestsFromTestCase(TestStringMethods))
# 测试用例执行器
runner = HTMLReport.TestRunner(report_file_name=\'test\', # 报告文件名,如果未赋值,将采用“test+时间戳”
output_path=\'report\', # 保存文件夹名,默认“report”
title=\'测试报告\', # 报告标题,默认“测试报告”
description=\'无测试描述\', # 报告描述,默认“测试描述”
thread_count=1, # 并发线程数量(无序执行测试),默认数量 1
thread_start_wait=3, # 各线程启动延迟,默认 0 s
sequential_execution=False, # 是否按照套件添加(addTests)顺序执行,
# 会等待一个addTests执行完成,再执行下一个,默认 False
# 如果用例中存在 tearDownClass ,建议设置为True,
# 否则 tearDownClass 将会在所有用例线程执行完后才会执行。
# lang=\'en\'
lang=\'cn\' # 支持中文与英文,默认中文
)
# 执行测试用例套件
runner.run(suite)
以上是关于python每日一练之单元测试的主要内容,如果未能解决你的问题,请参考以下文章