Python 自动化测试框架unittest与pytest的区别

news2024/11/25 7:09:14

这篇文章主要讲unittest与pytest的区别,pytest相对unittest而言,代码简洁,使用便捷灵活,并且插件很丰富。

Unittest vs Pytest

主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行和报告这几个方面比较unittest和pytest的区别:

用例编写规则

在这里插入图片描述

用例前置与后置条件

在这里插入图片描述

断言

在这里插入图片描述

测试报告

在这里插入图片描述

失败重跑机制

在这里插入图片描述

参数化

在这里插入图片描述

用例分类执行


如果不好看,可以看下面表格:

总体来说,unittest用例格式复杂,兼容性无,插件少,二次开发方便。pytest更加方便快捷,用例格式简单,可以执行unittest风格的测试用例,无须修改unittest用例的任何代码,有较好的兼容性。pytest插件丰富,比如flask插件,可用于用例出错重跑,还有xdist插件,可用于设备并行执行,效率更高。

实例演示

讲了七大区别,总要演示一下具体实例,用事实说话。

前后置区别

这里抽用例前置与后置的区别来讲,先看unittest的前后置使用:

import unittest
 
 
 
class TestFixtures01(unittest.TestCase):
    # 所有用例执行前执行
    def setUp(self) -> None:
        print("setUp开始")
    def tearDown(self) -> None:
        print("tearDown结束")
 
    # 每条用例执行前执行
    @classmethod
    def setUpClass(cls) -> None:
        print("setUpClass开始")
 
    @classmethod
    def tearDownClass(cls) -> None:
        print("tearDownClass结束")
 
    # 测试用例
    def test_001(self):
        print("测试用例001")
 
class TestFixtures02(unittest.TestCase):
    def test_002(self):
        print("测试类2")
 
# 每个模块执行前执行
def setUpModule():
    """
    在所有测试类在调用之前会被执行一次,函数名是固定写法,会被unittest框架自动识别
    """
    print('集成测试 >>>>>>>>>>>>>>开始')
def tearDownModule():
    print("集成测试 >>>>>>>>>>>>>>结束")
 
 
 
if __name__ == '__main__':
    unittest.main()

运行结果:


从结果上得知, 三个方法的逻辑优先级: setUp()&tearDown() < setUpClass()&tearDownClass() < setUpModule()&tearDownModule()

接下来看pytest的前后置:

1、我们都知道在自动化测试中都会用到前后置,pytest 相比 unittest 无论是前后置还是插件等都灵活了许多,还能自己用 fixture 来定义。

首先了解一下,用例运行前后置级别如下:

1.模块级:全局的,整个模块开只运行一次,优先于测试用例。

2.类级别:定义在类里面,只针对此类生效。类似unittest的cls装饰器

3.函数级:只对函数生效,类下面的函数不生效。

4.方法级:定义在类里面,每个用例都执行一次

def setup_module():
    print('\n整个模块 前 只运行一次')
 
def teardown_module():
    print('\n整个模块 后 只运行一次')
 
def setup_function():
    print('\n不在类中的函数,每个用例 前 只运行一次')
 
def teardown_function():
    print('\n不在类中的函数,每个用例 后 只运行一次')
 
def test_ab():
    b = 2
    assert b < 3
 
def test_aba():
    b = 2
    assert b < 3
 
 
class Test_api():
 
    def setup_class(self):
        print('\n此类用例 前 只执行一次')
    def teardown_class(self):
        print('\n此类用例 后 只执行一次')
 
    def setup_method(self):
        print('\n此类每个用例 前 只执行一次')
 
    def teardown_method(self):
        print('\n此类每个用例 后 执行一次')
 
    def test_aa(self):
        a = 1
        print('\n我是用例:a')       # pytest -s 显示打印内容
        assert a > 0
 
    def test_b(self):
        b = 2
        assert b < 3

运行结果:


2、这是原始用法,下面看使用Fixture,Fixture 其实就是自定义 pytest 执行用例前置和后置操作,首先创建 conftest.py 文件 (规定此命名),导入 pytest 模块,运用 pytest.fixture 装饰器,默认级别为:函数级:

在这里插入图片描述
其它用例文件调用即可,如下定义一个函数,继承 conftest.py 文件里的 login 函数即可调用:

# conftest.py配置需要注意以下点:
# conftest.py配置脚本名称是固定的,不能改名称
# conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件
# 不需要import导入 conftest.py,pytest用例会自动查找
 
import pytest
 
def test_one(login):
    print("登陆后,操作111")
 
# def test_two():
#   print("操作222")
#
# def test_three(login):
#   print("登陆后,操作333")

运行结果:


3、扩展用法,多个自定义函数和全局级别展示:(全局的比如用于登录获取到token其他用例模块就不需要再登录了)

import pytest
 
def test_one(login):
    print("登陆后,操作111")
 
def test_two(login,open_page):
    print("测试用例2")
 
def test_three(open_page):
    print("测试用例3")

运行结果:

在这里插入图片描述
细心的人应该可以知道,测试用例2并没有调用login函数,因为前置设置的是共享模式,类似全局函数。

参数化区别

参数化应用场景,一个场景的用例会用到多条数据来进行验证,比如登录功能会用到正确的用户名、密码登录,错误的用户名、正确的密码,正确的用户名、错误的密码等等来进行测试,这时就可以用到框架中的参数化,来便捷的完成测试。

参数化 就是数据驱动思想,即可以在一个测试用例中进行多组的数据测试,而且每一组数据都是分开的、独立的。

unittest参数化其实是:ddt,叫数据驱动。

pytest数据驱动,就是参数化,使用@pytest.mark.parametrize

1.先看unittest如何进行参数化:


test_data = [1,2,3]
 
@ddt.ddt
class Testddt(unittest.TestCase):
    @ddt.data(*test_data)
    def test_001(self,get_data):
        print(get_data)
if __name__ == '__main__':
    unittest.main()

运行结果:


2.pytest中参数化的用法

在测试用例的前面加上:
@pytest.mark.parametrize(“参数名”,列表数据)
参数名:用来接收每一项数据,并作为测试用例的参数。
列表数据:一组测试数据。

@pytest.mark.parametrize(“参数1,参数2”,[(数据1,数据2),(数据1,数据2)])
示例:
@pytest.mark.parametrize(“a,b,c”,[(1,3,4),(10,35,45),(22.22,22.22,44.44)])
def test_add(a,b,c):
res = a + b
assert res == c

实例:

@pytest.mark.parametrize('data',[1,2,3])
class Testddt(object):
 
    def test_001(self,data):
        print(data)
if __name__ == '__main__':
    pytest.main(['-sv'])
 

运行结果:

在这里插入图片描述

总结

以上就是unittest与pytest测试框架的区别,七大主要区别,这里已讲了两个区别的实例,其他五个有时间再补充,如对python自动化测试感兴趣的朋友,可以加入文末学习交流群,讨论交流一下心得。


资源分享

下面这份资源,对于想学习【软件测试】的朋友来说应该是最全面最完整的备战仓库,希望也能帮助到你!在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传奇GOM引擎微端架设教程

传奇GOM引擎微端架设教程 GOM引擎架设微端需要准备好微端程序&#xff0c;用网站下载在服务器的版本 &#xff08;注&#xff1a;本文章图有打码处因平台GZ原因需打码望读者理解&#xff09; Mirserver文件一般都是自带微端程序的&#xff0c;偶尔也有版本没有微端程序那我们…

基于多目标遗传算法(NSGA-II)和多目标粒子群算法(MOPSO)的分布式仿真系统双目标负载平衡模型【Matlab代码实现】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

Oracle单机部署:GI安装

Oracle单机部署&#xff1a;GI安装存储配置ASM磁盘空间评估GI单机安装配置GI图形化安装流程安装后测试&#x1f42c; 使用grid用户来安装GI。 存储配置 Oracle存储支持Oracle ASM、Oracle ACFS、本地文件系统、网络文件系统&#xff08;NFS/NAS&#xff09;、Oracle Memory S…

RK3588平台开发系列讲解(RTC篇)RTC的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、RTC简介二、HYM8563驱动配置2.1、设备树配置2.1、驱动代码三、RTC的使用3.1、SYSFS接口3.2、PROCFS接口3.3、IOCTL接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍RK3588平台RTC驱动及使用方…

玩以太坊链上项目的必备技能(基本类型转换以及推断-Solidity之旅六)

基本类型之间的转换 熟悉过其他编程语言的您&#xff0c;对基本类型之间的转换并不陌生吧&#xff01;当然&#xff0c;这基本类型进行转换可分为隐式转换和显示转换。 隐式转换 Solidity 支持隐式转换&#xff0c;通过编译器自动进行转换&#xff0c;而不要开发人员的干涉&…

信道估计算法误码率仿真,对比不同导频长度,对比不同信道估计算法包括CS-OMP,LS,MMSE

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 所谓信道估计&#xff0c;就是从接收数据中将假定的某个信道模型的模型参数出来的过程。如果信道是线性的话&#xff0c;那么信道估计就是对系统冲激响应进行估计。 CS-OMP 正则正交匹配追踪(Re…

分布式操作系统 - 5.分布式命名管理

文章目录1.基本概念2.非结构化命名管理2.1 简单的实体定位方法&#xff1a;广播和多播方法&#xff08;1&#xff09;广播方法&#xff08;broadcast&#xff09;&#xff08;2&#xff09;多播方法&#xff08;multicast&#xff09;&#xff08;3&#xff09;问题&#xff1a…

图形API学习工程(30):尝试使用panorama来代替Cubemap作为全景图

工程GIT地址&#xff1a;https://gitee.com/yaksue/yaksue-graphics 前言 为了能得到全方位的光照数据&#xff0c;我之前学习了使用CubeMap作为全景图。CubeMap包含六张贴图对应了上下左右前后六个方向的数据。但是最近在下载全景图的资源时&#xff0c;看到很多并非是CubeM…

Python基于Django的毕业设计论文提交过程管理系统

项目介绍 在各学校的教学过程中&#xff0c;django过程管理系统是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的django过程管理系统的平台&#xff0c;这…

c#入门-访问基类成员

调用基类构造器 在构建派生类前&#xff0c;会首先构建出完整的基类。 即便是派生类无权访问的成员&#xff0c;也会存在。 因此才能保证派生类能完全地当作基类来使用。 因此&#xff0c;在执行派生类的构造器前&#xff0c;首先需要先调用基类的构造器。 而如果基类没有&am…

017 | 精准扶贫视野下非遗传承的研究与启示——以三峡皮影为例 | 大学生创新训练项目申请书 | 极致技术工厂

&#xff08;一&#xff09;研究目的 百年党建视域下&#xff0c;全面建成小康社会的历史目标已成功达成&#xff0c;但东西部经济发展的不平衡、不平均依旧是新时代发展中亟需解决的问题。坚持党的领导&#xff0c;响应西部大开发的战略号召&#xff0c;本团队深入探访于2018…

S2SH药膳馆会员管理系统计算机专业毕业论文java毕业设计开题报告

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之S2SH药膳馆会员管理系统-IT实战营_哔哩哔哩_bilibili项目资料网址: http://itzygogogo.com软件下载地址:http://itzygog…

基于jsp+mysql+ssm足球新闻发布网站-计算机毕业设计

项目介绍 同完成整个足球新闻发布系统的设计开发。系统实现的功能主要包括&#xff1a;前台浏览足球新闻的功能&#xff1b;后台用户在成功登录该系统的后台时&#xff0c;可以对用户、足球新闻类别、足球新闻、留言进行添加、修改和删除等功能&#xff1b;以及对用户名密码等…

Arthas(Java 应用诊断利器)

文章目录Arthas使用背景Arthas&#xff08;阿尔萨斯&#xff09;能做什么&#xff1f;Arthas Spring Boot StarterArthas Arthas 是由Alibaba开源的Java监控诊断工具&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情…

Pytorch中的损失函数

L1损失函数&#xff1a;又称&#xff0c;L1 范数损失、最小绝对值偏差&#xff08;LAD&#xff09;、最小绝对值误差&#xff08;LAE&#xff09; MAE也是指L1损失函数。 把目标值 yi 与模型输出&#xff08;估计值&#xff09; f(xi) 做绝对值得到的误差。 通常用于回归任务、…

uniapp实战仿写网易云音乐(二)—promise接口请求的封装和主页功能的实现,组件封装

文章目录前言promise请求接口的封装主入口功能的实现&#xff1a;推荐歌单模块新碟新歌模块精选视频模块最后前言 本篇文章继续完成上篇文章的部分&#xff0c;主要实现prromise接口的封装和首页主入口的实现 promise请求接口的封装 在上篇文章中请求我们是这样写的&#xf…

(详细及解决方法)关于Vue.prototype中定义的变量不是响应式

目录 一、背景 二、原因 三、解决方法 四、扩展 当时第一眼看到下面的图&#xff0c;就想这个不会是写错了吧&#xff0c;咋还能这样写&#xff0c;在这里我承认&#xff0c;我以前说话确实很大声了 一、背景 在项目中需要将全局变量存放到Vue的实例对象上面 Vue.protot…

【历史上的今天】12 月 13 日:时代杂志将“你”评为年度人物;苹果发布 AirPods;互联网传出欧洲

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2022 年 12 月 13 日&#xff0c;国家公祭日。从 2014 年开始&#xff0c;12 月 13 日被定为缅怀先烈的国家公祭日&#xff0c;网站也会在这一天变为全灰色&#xff0c…

墙裂推荐c++的学习网站(OJ)

目录 墙裂推荐OJ 墙裂推荐学习软件 墙裂推荐线上编辑器 墙裂推荐OJ 要想学好c,更好的OJ少不了啊!!! 为了让诸多小白们有更好的学习测试环境,特此准备了一下几个OJ, 1.Openjudge 网站: OpenJudge openjudge网站中储存着大量的题目,而且还提前帮你们把板块分好了,就问你们…

[Java] HashMap是如何实现的?扩容机制是什么?树化机制知道吗?结合源码带你理解HashMap的原理。

文章目录前言HashMap是什么&#xff1f;Map接口散列表&#xff08;HashTable&#xff09;HashMap的扩容机制扩容机制&#xff1f;扩谁的容&#xff1f;HashMap的容量&#xff08;Capacity&#xff09;属性HashMap的扩容因子&#xff08;load factor&#xff09;属性HashMap的树…