unittest
Posted wheelcode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unittest相关的知识,希望对你有一定的参考价值。
Unittest
Unittest框架简析
什么是unittest框架
unittest框架有4个重要概念:test fixture / test case / test suite / test runner
- Test case的实例就是一个测试用例,一个完整的测试流程
- 测试准备前环境的搭建:setUp
- 执行测试代码:run
- 测试后环境的还原:tearDown
- Test suite多个测试用例的集合,且Test suit可以自我嵌套
- Test runner执行测试用例,run会启用TestSuite/TestCase的run方法
- TestLoader加载Test case至Test suite当中
- Test fixture对测试环境的搭建和销毁就是一个完整的fixture,通过覆盖TestCase中的setUp()和tearDown()方法来实现
使用Python搭建unittest的完整步骤
- 编写一个测试类,继承unittest中的TestCase类
- 在类中定义测试方法,每个方法的方法名要以test开头,且没有额外的参数,TestCase中提供了一些常用的assert断言方法
- 执行unittest.main(),该函数负责运行测试,它会实例化所有TestCase的子类,运行其中所有以test开头的方法并生成相关测试报告
使用的完整流程
import unittest
class DemoTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print(‘call class start‘)
def setUp(self):
print(‘call setUp‘)
def tearDown(self):
print(‘call tearDown‘)
def test_demo(self):
print(‘this is a test‘)
@classmethodd
def tearDownClass(cls):
print(‘end class‘)
其中setUpClass和tearDownClass每个测试类均只执行一次
setUp和tearDown每个test的测试用例均会执行一次
Unittest断言简析
code | compare |
---|---|
assertEqual(a,b) | a==b |
assertNotEqual(a,b) | a!=b |
assertTrue(x) / assertFalse(x) | bool(x) is True/False |
assertIs(a,b)/IsNot(a,b) | a is b/ a is not b |
assertIsNone(x)/IsNotNone | is None / is not None |
assertIn(a,b) / NotlN(a,b) | a in b/ a not in b |
assertIsInstance(a,b) | isinstance(a.b) |
assertNotIsnstance(a,b) | not isinstance(a,b) |
注意:is是判断地址是否相等,而==是判断内容是否一致(注意可变对象与不可变对象的地址区别)
抛出异常:assertRaises(ValueError,self.object,var1,var2)
参数一为抛出的异常,参数二为异常的调用对象,后面为传递的参数
此断言抛出异常,如果没有抛出异常,则为测试失败
Unittest常见装饰器
decorator | description |
---|---|
@unittest.skip(reason) | 跳过此测试(方法) |
@unittest.skipIf(condition,reason) | condition=True,skip test |
@unittest.skipUnless(condition,reason) | condition=False,skip test |
@unittest.expectedFailure | if pass->test fail else test success |
exception unittest.SkipTest(reason) | rasie expection to skip test |
一套常用的组合拳
# 使用用例组合进行套测试
suite = unittest.TestSuite()
suite.addTest(Class(method))
suite.addTest(Class(method1))
# 可以利用列表进行批量添加,注意,method均为字符串类型
suite.addTests([Class(method1),Class(method2)])
# 创建运行器对象->对象调用组合套进行run
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
# 使用加载器
loader = unittest.TestLoader()
tests1 = loader.loadTestsFromName(‘dir.Class‘)
tests2 = loader.loadTestsFromName(‘dir.Class‘)
suite.addTests([tests1,tests2])
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
# 写入文件的方法
with open(‘filename.txt‘,‘w+‘) as f:
runner = unittest.TextTestRunner(stream=f,verbosity=2)
runner.run(suite)
以上是关于unittest的主要内容,如果未能解决你的问题,请参考以下文章
SentTestCase 不会将 UnitTest 失败突出显示为代码错误
基于appium实现的线性代码引用unittest单元测试框架