首页 > 其他分享 >Unittest测试框架基础及进阶

Unittest测试框架基础及进阶

时间:2023-10-10 20:57:00浏览次数:42  
标签:进阶 框架 套件 Unittest 用例 测试用例 测试 test self

需求

假设领导让你开发一个接口测试框架。领导提出了一些新的需求,你如何实现?

Unittest测试框架基础

Unittest测试框架介绍

Unittest是Python自带的测试框架,提供基础的用例管理和测试控制功能,使用灵活易于定制。Unittest中主要包含TestCase测试用例、TestSuite测试套件、测试准备及清理方法和TestRunner测试运行器等主要概念,另外还包含TestLoader用于批量加载用例生成测试套件,TestResult用于在TestRunner中记录测试结果。

Unittest测试框架使用

基础使用

编写用例
test_demo1.py
import requests

import unittest

class TestDemo(unittest.TestCase):
    def setUp(self):
        self.session = requests.session()

    def tearDown(self):
        self.session.close()

    def test_get(self):
        """测试Get接口"""
        url = 'https://postman-echo.com/get?a=1&b=2'
        res = self.session.get(url)
        self.assertDictEqual({'a': 1, 'b': 2}, res.json()['args'])

运行方法

$ python3 –m unittest test_demo1.py -vvv

自定义测试套件运行方法

loader = unittest.TestLoader()
suite = loader.discover('.testcases')
runner = unittest.TextTestRunner()
result = runner.run(suite)

测试用例的生命周期

  • setUp()方法在每个测试方法执行之前调用,用于准备测试环境。
  • tearDown()方法在每个测试方法执行之后调用,用于清理测试环境。
  • setUpClass()方法在测试类中的所有测试方法执行之前调用,用于准备测试环境。
  • tearDownClass()方法在测试类中的所有测试方法执行之后调用,用于清理测试环境。

测试用例的组织和管理

  • 可以使用TestSuite类来组织多个测试用例。
  • 可以使用TestLoader类来动态加载测试用例。
  • 可以使用TestResult类来收集测试结果和生成测试报告。

跳过用例及期望失败

待补充

ddt数据驱动

安装ddt

$ pip install ddt

使用方法

待补充

ddt与unittest subtests的区别

  • subtests: 一个测试用例,循环测试失败不中断测试
  • ddt: 生成多个测试用例

ddt数据驱动原理

  • @ddt.data(): 为测试函数添加数据属性
  • @ddt.ddt: 遍历测试类中所有带数据属性的测试函数,动态在类中添加添加多个测试函数,并赋予数据

Unittest测试框架原理

Unittest测试框架的的原理是将继承unittest.TestCase的测试类中,所有的test开头的测试函数,生成该测试类的一个对象,然后组装成测试套件,使用测试运行器(TestRunner)运行并使用测试结果(TestResult)对象纪录每个用例的运行状态。

import unittest

class TestDemo(unittest.TestCase):
    def test_1(): ...

    def test_2(): ...

    def test_3(): ...

# 运行方法
loader = unittest.TestLoader()
# 生成测试套件-将test_1,、test_2、 test_3生成TestDemo的对象,添加到测试套件中
suite = loader.loadTestsFromTestCase(TestDemo)
for test in suite:
    print(test.id())

runner = unittest.TextTestRunner()
result = runner.run(suite)

Unittest测试框架基本结构

  • TestCase :测试用例
  • TestSuite:测试套件
  • TestLoader:测试用例加载器
  • TestResult:测试结果记录器
  • TestRunner:测试运行器

image

TestCase类

常用方法

  • setUp():需用户实现,单条测试用例准备方法
  • tearDown():需用户实现,单条测试用例清理方法
  • setUpClass():需用户实现,测试类准备方法
  • tearDownClass():需用户实现,测试类清理方法
  • run(result=None):用例运行
  • debug():用例调试
  • skipTest(reason):跳过用例(抛出SkipTest异常)
  • countTestCases():用例数量,固定为1

常用断言方法

image

TestSuite类

常用方法

  • addTest(test):添加单个用例对象到该测试套件
  • addTests(tests):添加多个测试用例对象到该测试套件
  • run(result):测试套件运行
  • countTestCases():测试套件中测用例数量
  • __iter__():支持for ... in ...遍历其中所有的测试用例

TestLoader类

常用方法

  • loadTestsFromTestCase(testCaseClass):通过测试类对象加载其中的所有测试函数,生成测试套件
  • loadTestsFromModule(module, pattern=None):通过测试模块加载其中的所有测试用例,生成测试套件
  • loadTestsFromName(name, module=None):通过字符串格式的测试函数导入路径名,如test_demo.TestDemo.test_a来加载测试用例,生成测试套件
  • loadTestsFromNames(names, module=None):通过测试函数导入路径名,批量加载测试用例,生成测试套件
  • getTestCaseNames(testCaseClass):通过测试类获取其中所有测试函数的测试函数导入路径名,生成测试套件
  • discover(start_dir, pattern='test.py', top_level_dir=None):递归遍历目录,搜集所有test.py中的Test开头的测试类中的所有测试函数,生成测试套件

TestResult类

常用方法

  • wasSuccessful():是否全部成功
  • stop():停止当前测试运行
  • startTest(test):开始(纪录)测试某用例
  • stopTest(test):停止(纪录)测试某用例
  • startTestRun():开始(纪录)整体的测试运行
  • stopTestRun():停止(纪录)整体的测试运行
  • addError(test, err):纪录异常用例
  • addFailure(test, err):纪录失败的用例
  • addSuccess(test):纪录成功的用例(默认什么都不做)
  • addSkip(test, reason):纪录跳过的测试用例
  • addExpectedFailure(test, err):纪录期望失败的测试用例
  • addUnexpectedSuccess(test):纪录非预期成功的测试用例
  • addSubTest(test, subtest, outcome):纪录子测试

TextTestRunner类

  • _makeResult():创建TestResult对象
  • run(test):运行测试套件

Unittest测试框架进阶

使用装饰器为测试函数添加额外属性

class TestCalc(TestCase):
    @test(title='测试加法', priority='p2', status='ready', owner='superhin', iteration='v1.0.0')
    def test_add(self):
        self.logger.info('测试1+1=2')
        self.assertEqual(1 + 1, 2)

使用元类-自动拷贝测试函数属性到测试用例对象

使用用例类属性设置通用属性

class TestDemo(TestCase):
    priority = 'p1'
    status = 'ready'
    owner = 'superhin'
    iteration = 'v0.1.0'

    @test(title='test demo a', priority='p2')
    def test_a(self):
        self.logger.info('a demo test case')

    @test(title='test ddt with data',data=['a', 'b', 'c'])
    def test_b(self, item):
        self.logger.info('item =', item)

测试计划-通过属性筛选测试用例

class TestPlanDemo(TestPlan):
    tests = [
        "test_demo.TestDemo.test_a"
    ]
    filter = {
        "status": ["ready"]
    }

运行控制-超时及失败重试控制

自定义测试套件-实现用例并发

自定义HTML测试报告及JSON测试报告数据实现

标签:进阶,框架,套件,Unittest,用例,测试用例,测试,test,self
From: https://www.cnblogs.com/superhin/p/17755703.html

相关文章

  • Vue框架结构说明
    vue安装三部曲:1:安装node.js环境2:vue-cli脚手架构建工具3:配置vue环境参考资料:https://blog.csdn.net/muzidigbig/article/details/80490884......
  • Pytest测试框架基础及进阶
    Pytest测试框架基础Pytest测试框架介绍Pytest是Python一款三方测试框架,用于编写和运行单元测试、集成测试和功能测试。Pytest测试框架具有简单、灵活、易于扩展等特点,被广泛应用于Python项目的测试工作中。Pytest主要特点:简单易用:Pytest测试框架的API简单易用,可以快速编写测......
  • Python并发及网络编程进阶
    案例引入假如你们一家已上市的电商公司,在元旦来临前夕,领导需要你模拟用户,通过接口生成10万笔新订单。你该如何处理?方案探索串行:多个任务逐个执行的过程,上个任务执行完成前,阻塞下一个任务执行。并发:多个任务交替执行的过程,这些任务可能在同一时间段内执行,但是它们的执行时......
  • vue实现简单的页面框架
    效果图:代码结构:......
  • abp 框架使用自定义appsetings.json
    定义一个自定义的配置文件在调试配置中设置启动环境这里的值填入刚刚设置的配置文件appsetings.{配置文件名字}.json的配置文件名字启动即可系统启动时,首先会检查{配置文件名字}是否存在,存在的话使用appsettings.{配置文件名字}.json,不存在则使用appsettings.json(默认配......
  • 热更新框架 XLua 入门使用
    如何将xLua加入现有项目中?(1)从 xLuaGit地址 下载源码后解压;(2)将 Assets文件夹中的全部文件,拷贝到现有项目的Assets文件夹中;(3)将Tools文件夹,拷贝到现有项目的Assets同级目录;(4)打开08_Hotfix 示例场景,如下图所示:参考文档:项目地址:https://github.com/Tencent/xLua常......
  • Python函数式编程进阶
    函数式编程函数式编程是一种基于函数的编程范式,它通过编写函数来描述程序的行为。函数被视为一等公民,可以作为参数、返回值和变量来使用。函数式编程通常使用高阶函数、不可变数据和递归等技术来描述程序的行为。命令式编程:基于指令的编程范式,它通过编写一系列指令来描述程......
  • MySQL进阶篇:第三章_SQL性能分析
    MySQL进阶篇:第三章_SQL性能分析SQL执行频率MySQL客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:--session是查看当前会话;--global是查询全局数据;SHOW......
  • MySQL进阶篇:第四章_四.一_ 索引使用_最左前缀法则
    索引使用_最左前缀法则最左前缀法则如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效(后面的字段索引失效)。以tb_user表为例,我们先来查看一下之前tb_user表所创建的索引。在......
  • 【动画进阶】神奇的背景,生化危机4日食 Loading 动画还原
    最近,在Steam玩一款老游戏(生化危机4重置版),其中,每当游戏转场的过程中,都有这么一个有趣的Loading动画:整个效果有点类似于日食效果,中间一圈黑色,向外散发着太阳般的光芒。本文,我们将尝试使用CSS,还原这个效果。整个效果做出来,类似于如下两个动画效果这样:实现主体效果其实......