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

news2024/10/6 8:23:59

引言

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

Unittest vs Pytest

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

用例编写规则

用例前置与后置条件

断言

测试报告

失败重跑机制

   参数化

  用例分类执行

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

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

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

  实例演示

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

  前后置区别

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

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.方法级:定义在类里面,每个用例都执行一次

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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 函数即可调用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# 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其他用例模块就不需要再登录了)

1

2

3

4

5

6

7

8

9

10

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如何进行参数化:

1

2

3

4

5

6

7

8

9

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

实例:

1

2

3

4

5

6

7

@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/1117810.html

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

相关文章

数字档案一体化解决方案

数字档案一体化解决方案是通过整合数字化技术、信息化系统和管理模式&#xff0c;实现档案数字化、信息化、网络化和智能化的档案管理方式。专久智能数字档案一体化解决方案包括以下几个方面&#xff1a; 1. 数字化技术&#xff1a;采用数字化技术对档案进行扫描、转换、存储和…

C++-json(2)-unsigned char-unsigned char*-memcpy-strcpy-sizeof-strlen

1.类型转换&#xff1a; //1.赋值一个不知道长度的字符串unsigned char s[] "kobe8llJfFwFSPiy"; //1.用一个字符串初始化变量 unsigned int s_length strlen((char*)s); //2.获取字符串长度//2.字符串里有双引号"" 需要…

聊聊精益需求的产生过程

这是鼎叔的第七十八篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。本人新书《无测试组织-测试团队的敏捷转型》​​​​​​​​​​​​​​已出版&#xff…

Python中if not使用教程

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 python中判断变量是否为None三种写法&#xff1a; 1、if x is None 2、if not x 3、if not x is None 理解成 if not (x is None) 结果是和1相反的 python中None、fals…

AST反混淆实战|某国外混淆框架一小段混淆js还原分析

关注它&#xff0c;不迷路。 本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请联系作者立即删除&#xff01; 1. 需求 我相信做币圈爬虫的兄弟&#xff0c;或多或少的见过类似下面的…

触想五代强固型工业一体机在近海船舶上的应用

1、行业发展背景 近海船舶的发展紧密关联着海上运输、渔业贸易、旅游开发、能源探测等多领域&#xff0c;带动区域经济、文化繁荣发展。 随着现代科学与信息技术在各行各业的作用增强&#xff0c;工业4.0带动的产业升级逐步渗透进船舶领域&#xff0c;在此背景下&#xff0c;船…

【网络安全 --- xss-labs靶场通关(1-10关)】详细的xss-labs靶场通关思路及技巧讲解,让你对xss漏洞的理解更深刻

靶场安装&#xff1a; 靶场安装请参考以下博客&#xff0c;既详细有提供工具&#xff1a; 【网络安全 --- xss-labs靶场】xss-labs靶场安装详细教程&#xff0c;让你巩固对xss漏洞的理解及绕过技巧和方法&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- xss-labs通…

基于SSM的社区物业管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

C++前缀和算法的应用:从仓库到码头运输箱子原理、源码、测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 双指针 单调双向队列 题目 你有一辆货运卡车&#xff0c;你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制 和 总重量的限制 。 给你…

【Git】idea提交项目到Gitee

文章目录 1. 创建Gitee仓库1. 新建仓库2. 添加描述3. 复制仓库地址 2. idea建立连接提交2.1 Create Git Repository2.2 选择要提交的根目录2.3 Commit2.4 Push2.5 提交成功 1. 创建Gitee仓库 1. 新建仓库 2. 添加描述 3. 复制仓库地址 点击右上角克隆/下载&#xff0c;复制HT…

bitbucket.org 用法

这个网站需要魔法&#xff0c;注册完成后添加厂库时间2023.10 图1 图2 第二张图 &#xff0c;不要.gitignore文件 sourcetree 1,创建前端项目 npm create vitelatest 2.打开vscode创建本地Git 看到Git代提交的文件 sourcetree&#xff0c;新建 已存在的本地厂库 提交到Git 添…

CSRF Token为什么写在Cookie中?CSRF漏洞分析

1. 什么是CSRF&#xff1f; CSRF或XSRF&#xff0c;跨站请求伪造。简单地说&#xff0c;就是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作&#xff08;如发邮件&#xff0c;发消息&#xff0c;甚至财产操作如转账和购买商品&#xff…

Java - 多进程编程(对比线程、API 操作)

目录 一、多进程编程 1.1、为什么要使用多进程编程 1.2、Java 中多进程编程的实现 1.2.1、前言 1.2.2、进程创建 1.2.3、进程等待 1.2.4、封装操作到一个工具类中 一、多进程编程 1.1、为什么要使用多进程编程 一个 .exe 文件执行以后&#xff0c;就会变成一个进程. 多…

高质量发展新引擎:智能工业操作系统助力产业升级

工业操作系统是推动制造业高质量发展的重要支撑&#xff0c;也是推动经济发展方式转变的重要手段。打造自主可控的工业实时操作系统是实现工业科技自立自强的必然要求&#xff0c;是推动高质量发展的必由之路。 基于软件定义控制的智能工业操作系统 Intewell操作系统是由科东…

【技术番外篇】国家高新技术企业 认定

第一个网站&#xff1a;高新技术企业认定管理工作网 http://www.innocom.gov.cn/gqrdw/index.shtml 多给认定机构打咨询电话&#xff0c;少走弯路 有什么不懂的地方就可以打电话咨询专业人士 http://www.innocom.gov.cn/gqrdw/c101321/201905/3b94fbc91a894bcbba97fb7125c9…

【ChatGLM2-6B】nginx转发配置

背景 好不容易把ChatGLM2-6B大语言模型部署好了&#xff0c;使用streamlit方式启动起来了&#xff0c;终于可以愉快的玩耍了&#xff0c;然后想着申请一个域名&#xff0c;使用HTTPS协议访问&#xff0c;但实践过程中&#xff0c;发现这个大语言模型的nginx转发配置还是有点小…

Swingbench 压力测试(超详细)

目录 前提需要有配置好的oracle哦 1、环境准备 2、安装Swingbench 3、造数据 4、压测 前提需要有配置好的oracle哦 1、环境准备 启动监听 lsnrctl start 启动数据库 sqlplus / as sysdba startup 创建表 CREATE TABLESPACE soe DATAFILE /u01/app/oracle/oradata/or…

重生奇迹MU游戏上格斗家挂机小技巧

重生奇迹MU作为一个独特的职业&#xff0c;重生奇迹MU游戏中的格斗家有着多种挂机技巧&#xff0c;以下是一些重生奇迹MU格斗家挂机小技巧供玩家参考&#xff1a; 1.使用幽冥光速拳 幽冥光速拳是格斗家的核心技能之一&#xff0c;可以快速消灭怪物并提高经验值。建议玩家将此…

【PX4报错】Crash dumps present on SD,vehicle needs service

报错&#xff1a; Critical: Preflight Fail: Crash dumps present on SD,vehicle needs service 解决&#xff1a; 将COM_ARM_HFLT_CHECK改为Disabled 参考&#xff1a; PX4常见解锁失败报错及解决方法

PCA降维可视化

二维 import pandas as pd import warnings warnings.filterwarnings("ignore")df pd.read_csv(data/data.csv).dropna() features df.columns[:-1] X, y df[features], df[label]from sklearn.preprocessing import MinMaxScaler # 创建MinMaxScaler对象 scaler…