一:避坑点
1、使用unittest时,默认不会执行if __name__ == '__main__':,而是以“Run 'Unittests in XXX' ”方式运行。
我们需要通过menu:Run->Edit Configurations打开配置窗口,在Python下,新建一个运行方式case_python(名字自取),将运行的脚本加入,保存后,以此方式运行测试脚本,就能进入方法if __name__ == '__main__':。
script path填入脚本的路径。Working directory填入项目的根目录。
2、进入方法if __name__ == '__main__':,我们可以添加自定义的测试顺序,或者将测试结果输出到外部文件或html文件中。
二:自定义测试case执行顺序
1、if __name__ == '__main__':中,可以通过TestSuite定义case执行顺序
suite = unittest.TestSuite() suite.addTest(TestCreateTask("test_02")) suite.addTest(TestCreateTask("test_01"))2、定义TestCase时,可以通过case的名称来定义执行顺序
如:def test_01(self)、def test_02(self)
能通过名称来确定执行顺序的原因是:unittest源码getTestCaseNames对测试用例的名称进行了排序,默认是根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。
三:将测试结果输出到外部文件
if __name__ == '__main__':
# 安装顺序执行case
suite = unittest.TestSuite()
suite.addTest(TestCreateTask("test_02"))
suite.addTest(TestCreateTask("test_01"))
# 执行结果输出到外部文件
with open("unit_test_result.txt", "w") as f:
# verbosity = 2 查看完成的执行情况
# verbosity默认为1,可以设置为0和2。
# 0 (静默模式): 你只能获得总的测试用例数和总的结果。
# 1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “E”
# 2 (详细模式):测试结果会显示每个测试用例的所有相关的信息 并且 你在命令行里加入不同的参数可以起到一样的效果
runner = unittest.TextTestRunner(stream=f, verbosity=2)
runner.run(suite)四:将测试结果生成Html文件
import unittest
from test_unit import TestCreateTask
from HTMLTestRunner import HTMLTestRunner
if __name__ == '__main__':
suite = unittest.TestSuite() suite.addTest(TestCreateTask("test_02")) suite.addTest(TestCreateTask("test_01"))
with open('HTMLReport.html', 'w') as f:
runner = HTMLTestRunner(stream=f,
title='TestCreateTaskTest Report',
description='generated by HTMLTestRunner.',
verbosity=2
)
runner.run(suite)
五:完整的unittest case使用实例
1、一个class继承了unittest.TestCase,便是一个测试用例,但如果其中有多个以
test开头的方法,那么每有一个这样的方法,在load的时候便会生成一个TestCase实例。import unittest class TestCreateTask(unittest.TestCase): # 测试前准备,该方法一个测试用例,只执行一次 @classmethod def setUpClass(cls): print('******** Test Start ********') # 用来清理环境,已备之后的测试,该方法一个测试用例,只执行一次 @classmethod def tearDownClass(cls): print('******** Test End ********\n') # 测试前准备,测试实例的每个测试case执行一次 def setUp(self): set_test_data() # 用来清理环境,已备之后的测试,测试实例的每个case执行一次 def tearDown(self): pass # case2 def test_02(self): self.assertEqual(24,2) # case1 def test_01(self): self.assertEqual(24,3)if __name__ == '__main__':
# 安装顺序执行case suite = unittest.TestSuite() suite.addTest(TestCreateTask("test_02")) suite.addTest(TestCreateTask("test_01")) # 执行结果输出到外部文件 with open("unit_test_result.txt", "w") as f: # verbosity = 2 查看完成的执行情况
# verbosity默认为1,可以设置为0和2。
# 0 (静默模式): 你只能获得总的测试用例数和总的结果。
# 1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “E”
# 2 (详细模式):测试结果会显示每个测试用例的所有相关的信息 并且 你在命令行里加入不同的参数可以起到一样的效果
runner = unittest.TextTestRunner(stream=f, verbosity=2)runner.run(suite)
六:unittest核心工作原理
![]()
unittest中最核心的四个概念是:test case, test suite, test runner, test fixture。
一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。而对一个测试用例环境的搭建和销毁,是一个fixture。
————————————————
版权声明:本文为CSDN博主「huilan_same」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huilan_same/article/details/52944782
七:unittest的skip装饰器
skip装饰器一共有三个 unittest.skip(reason)、unittest.skipIf(condition, reason)、unittest.skipUnless(condition, reason),skip无条件跳过,skipIf当condition为True时跳过,skipUnless当condition为False时跳过。
@unittest.skip("I don't want to run this case.")
def test_divide(self):
"""Test method divide(a, b)"""
print "divide"
————————————————
版权声明:本文为CSDN博主「huilan_same」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huilan_same/article/details/52944782
八:断言Assert----结果对比的函数
Method
Checks that
New In
assertEqual(a,b):相等
a == b
assertNotEqual(a,b)
a != b
assertTrue(x)
bool(x) is True
assertFalse(x)
bool(x) is False
assertIs(a,b)
a is b:判断是否是同一对象(id(a))
3.1
asserNottIs(a,b)
a is not b
3.1
assertIsNone(x)
x is None
3.1
assertIsNotNone(x)
x is not None
3.1
assertIn(a,b):a是否在b中
a in b
3.1
assertNotIn(a,b)
a not in b
3.1
assertIsInstance(a,b):实例对象
isInstance(a,b)
3.2
assertNotIsInstance(a,b)
not isInstance(a,b)
3.2
