Python接口自动化-UnitTest

官方文档:https://docs.python.org/zh-cn/3/library/unittest.html?highlight=assertequal

unittest是Python单元测试框架,类似于JUnit框架。


一、UnitTest概念

  • Testcase(测试用例)

一个TestCase的实例就是一个测试用例。

是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。

元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

  • Test suite(多个测试用例集合)

多个测试用例集合在一起,就是TestSuite

TestSuite也可以嵌套TestSuite

  • Test runner(执行测试用例)

是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法

  • Test fixture(测试用例环境的搭建和销毁)

对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现。

比如说在这个测试用例中需要访问数据库,那么可以在setUp() 中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的 TestCase留下一个干净的环境。

关于fixture,还有一个专门的库函数叫做fixtures,功能更加强大。

  • TestLoader(加载TestCase到TestSuite中)

是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例

二、UnitTest用法

  • 用import unittest导入unittest模块

  • 定义一个继承自unittest.TestCase的测试用例类,如class xxx(unittest.TestCase):

  • 定义setUp和tearDown,这两个方法与junit相同,即如果定义了则会在每个测试case执行前先执行setUp方法,执行完毕后执行tearDown方法。

  • 定义测试用例,名字以test开头,unittest会自动将test开头的方法放入测试用例集中。

每个方法的方法名要求以 test 打头,没有额外的参数

  • 一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。

  • 调用unittest.main()启动测试

  • 如果测试未通过,则会显示e,并给出具体的错误(此处为程序问题导致)。如果测试失败则显示为f,测试通过为.,如有多个testcase,则结果依次显示。

不加Test suite则执行顺序按照方法名字母顺序执行,不是从上到下执行

三、UnitTest断言

  • 布尔断言

无法复制加载中的内容

  • 比较断言
Method Explain
assertAlmostEqual (first, second, places = 7, msg = None, delta = None) 验证first约等于second。 palces: 指定精确到小数点后多少位,默认为7
assertNotAlmostEqual (first, second, places, msg, delta) 验证first不约等于second。 palces: 指定精确到小数点后多少位,默认为7
assertGreater (first, second, msg = None) 验证first > second,否则fail
assertGreaterEqual (first, second, msg = None) 验证first ≥ second,否则fail
assertLess (first, second, msg = None) 验证first < second,否则fail
assertLessEqual (first, second, msg = None) 验证first ≤ second,否则fail
assertRegexpMatches (text, regexp, msg = None) 验证正则表达式regexp搜索匹配的文本text。 regexp:通常使用re.search()
assertNotRegexpMatches (text, regexp, msg = None) 验证正则表达式regexp搜索不匹配的文本text。 regexp:通常使用re.search()
  • 复杂断言

image


四、UnitTest装饰器

# 无条件跳过装饰的测试,并说明跳过测试的原因
@unittest.skip(reason): skip(reason)
# 条件为真时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipIf(reason): skipIf(condition,reason)
# 条件为假时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipUnless(reason): skipUnless(condition,reason)
# 测试标记为失败
@unittest.expectedFailure(): expectedFailure()

五、UnitTest代码实例

定义加减乘除函数

'''
@time:
@target:加减乘除函数
@author:
'''
def add(a, b):
    return a + b


def minus(a, b):
    return a - b


def multi(a, b):
    return a * b


def divide(a, b):
    return a /

unittest创建测试用例

'''
@time:
@target:unittest测试用例
@author:
'''
import unittest
from mathfunc import *


# unittest.TestCase:TestCase类,所有测试用例类继承的基本类
class TestMathFunc(unittest.TestCase):
    '''
    setUp()方法用于测试用例执行前的初始化工作。
    如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。
    如测试用例需要登录web,可以先实例化浏览器
    '''
    def setUp(self):
        print("do something befor test.prepare environment")


    '''
    tearDown()方法用于测试用例执行之后的善后工作。
    如关闭数据库连接。关闭浏览器
    '''
    # 每条测试用例执行之后操作
    def tearDown(self):
        print("do something after test.Clean up")


    # 测试用例的方法名要求以test打头
    def test_zdd(self):
        # 断言
        self.assertEqual(3, add(1, 2))
        self.assertNotEqual(3, add(2, 2))
        print("1111111111")


    # 装饰器:跳过该条测试用例
    @unittest.skip("i don't want to run this case")
    def test_minus(self):
        self.assertEqual(1, minus(3, 2))
        print("22222222222")


    def test_dulti(self):
        self.assertEqual(6, multi(2, 3))
        print("33333333333")


    def test_aivide(self):
        a = divide(6, 4)
        self.assertEqual(2, a)
        print(a)
        b = divide(5, 2)
        self.assertEqual(2.5, b)
        print(b)
        print("44444444444444")




if __name__ == '__main__':
   '''
    unittest.main():使用TA可以方便的将一个单元测试模块变为可直接运行的测试脚本,
    main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,
    并自动执行他们。执行方法的默认顺序是:
    根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。
    所以以A开头的测试用例方法会优先执行,以a开头会后执行
    '''


    unittes

unittest执行测试用例

'''
@time:2021年6月25日10:07:24
@target:unittest执行测试用例顺序
@author:
'''
# -*- coding: utf-8 -*-
import unittest
import os
from test_mathfunc import *


if __name__ == '__main__':
    '''
    法1:通过testsuit来执行测试用例
    '''
    # 实例化测试套件
    suite = unittest.TestSuite()
    # 添加TestMathFunc下的测试用例到测试套件中(一个一个加)
    suite.addTest(TestMathFunc('test_zdd'))
    suite.addTest(TestMathFunc('test_aivide'))
    # 实例化TestRunner
    runner1 = unittest.TextTestRunner()
    # 执行测试套件中的用例
    runner1.run(suite)




    #使用这种方法可以对测试用例排序(一次性加多个)
    tests = [TestMathFunc("test_aivide"), TestMathFunc("test_dulti")]
    suite.addTests(tests)




    '''
    法2:通过discover方式加载某路径下的所有测试用例
    '''
    # 获取当前工作目录路径
    testdir = os.path.dirname(__file__)
    print(testdir)
    # 加载目录文件下test_mathfunc.py下所有test用例
    discover = unittest.defaultTestLoader.discover(testdir,pattern='test_mathfunc.py')
    print(discover)
    # 实例化TextTestRunner
    runner2 = unittest.TextTestRunner()
    runner2.run(discover)
    


    '''
    法3:通过testLoader方式,加载某个测试类下所有用例
    '''


    suite1 = unittest.TestLoader().loadTestsFromTestCase(TestMathFunc)
    suit = unittest.TestSuite([suite1])
    runner3 = unittest.TextTestRunner()
    runner3.run
posted @ 2021-09-13 16:38  难删亦删  阅读(151)  评论(0)    收藏  举报