unittest

Posted wheelcode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unittest相关的知识,希望对你有一定的参考价值。

Unittest

Unittest框架简析

什么是unittest框架

unittest框架有4个重要概念:test fixture / test case / test suite / test runner

  • Test case的实例就是一个测试用例,一个完整的测试流程
    1. 测试准备前环境的搭建:setUp
    2. 执行测试代码:run
    3. 测试后环境的还原:tearDown
  • Test suite多个测试用例的集合,且Test suit可以自我嵌套
  • Test runner执行测试用例,run会启用TestSuite/TestCase的run方法
  • TestLoader加载Test case至Test suite当中
  • Test fixture对测试环境的搭建和销毁就是一个完整的fixture,通过覆盖TestCase中的setUp()和tearDown()方法来实现

使用Python搭建unittest的完整步骤

  1. 编写一个测试类,继承unittest中的TestCase类
  2. 在类中定义测试方法,每个方法的方法名要以test开头,且没有额外的参数,TestCase中提供了一些常用的assert断言方法
  3. 执行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 失败突出显示为代码错误

python unittest

基于appium实现的线性代码引用unittest单元测试框架

python——unittest(单元测试)

Python Unittest Discover即使失败也返回退出代码0

unittest2框架------执行原理