unittest与pytest自动化测试框架

news2024/12/28 20:12:20

引言

  前面一篇文章已经介绍了python单元测试框架,大家平时经常使用的是unittest,因为它比较基础,并且可以进行二次开发,如果你的开发水平很高,集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区别,pytest相对unittest而言,代码简洁,使用便捷灵活,并且插件很丰富。

Unittest vs Pytest

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

用例编写规则

用例前置与后置条件

断言

测试报告

失败重跑机制

参数化

用例分类执行

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

  总体来说,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/749076.html

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

相关文章

大华相机接入web页面实现人脸识别

先看下效果&#xff0c;中间主视频流就是大华相机&#xff08;视频编码H.264&#xff09;&#xff0c;海康相机&#xff08;视屏编码H.265&#xff09; 前端接入视屏流代码 <!--视频流--><div id"col2"><div class"cell" style"flex: …

2023夏季营销报告新鲜出炉!(小红书平台)

夏季温度持续走高&#xff0c;大众需求也在升级。品牌如何借势和部署相关内容&#xff1f; 本期&#xff0c;千瓜推出《千瓜2023夏季营销策略数据报告&#xff08;小红书平台》&#xff08;本文非完整版报告&#xff09;&#xff0c;围绕七大行业&#xff08;美妆|个护|食品|家…

能翻译维吾尔语的软件有哪些?这几个可以用用看

能翻译维吾尔语的软件有哪些&#xff1f;在如今全球化的背景下&#xff0c;不同语言之间的沟通交流变得尤为重要。维吾尔语作为中国特有的少数民族语言之一&#xff0c;它的翻译需求日益增长。本文将介绍几款精选的维吾尔语翻译软件&#xff0c;帮助大家顺利实现跨语言沟通。 智…

creator 滑动循环展示图片 自动展示

import MyBaseView from "./MyBaseView";const { ccclass, property } cc._decorator;ccclass export default class ScrollCard extends MyBaseView {property({ tooltip: "是否自动展示" })Move_zidong: boolean true;property({ tooltip: "自动展…

【机器学习】特征降维 - 方差选择法VarianceThreshold

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 方差选择法 一、方差科普二、方差选择API三、获取数…

炎炎夏日,相约Polkadot Decoded 2023上海

​上周&#xff0c;Moonbeam现身胡志明&#xff0c;参与GM Vietnam峰会活动&#xff0c;并与Chainlink和AWS等知名公司的代表一同畅谈Web3。 这周&#xff0c;Moonbeam中文社区将出席Polkadot未来论坛上海站&#xff0c;与来自波卡生态中不同平行链的代表一同探讨波卡新一代生…

小区物业管理系统需求分析

小区物业管理系统核心在于加强管理&#xff0c;提升效率&#xff0c;降低成本。实现物业核心业务信息化&#xff0c;为员工提供流畅运营模式&#xff0c;为业主提供高品质服务&#xff0c;有助于公司做强做大&#xff0c;系统优势主要有以下几方面&#xff1a; • 服务数字化&a…

Systemd服务单元

Systemd服务单元 service服务文件基本格式自定义service文件systemctl定时重启service文件中的type systemctl管理service查看服务状态查看服务是否运行查看服务是否被启用 查看开机自启服务列表设置开机启动开机启动的原理&#xff1a; 取消开机启动启动/暂停/重启服务重新加载…

day04 重新学python——数据容器

文章目录 一、数据容器1.数据容器&#xff1a;list(列表)2.list(列表)的遍历3.数据容器&#xff1a;tuple(元组)4.数据容器&#xff1a;str(字符串)5.数据容器的切片6.数据容器&#xff1a;set(集合)7.数据容器&#xff1a;dict(字典、映射)8.数据容器的通用操作 一、数据容器 …

Vue2:简单使用Animate.css动画效果

简单的使用一下Animate的动画效果&#xff08;安装&#xff0c;使用&#xff0c;速度&#xff09; 官网&#xff1a;动画.css |CSS动画的跨浏览器库。 (animate.style)https://animate.style/ 1、通过npm安装&#xff1a; npm install animate.css --save 2、导入到组件 i…

第一百零六天学习记录:数据结构与算法基础:单链表(王卓教学视频)

线性表的链式表示和实现 结点在存储器中的位置是任意的&#xff0c;即逻辑上相邻的数据元素在物理上不一定相邻 线性表的链式表示又称为非顺序映像或链式映像。 用一组物理位置任意的存储单元来存放线性表的数据元素。 这组存储单元既可以是连续的&#xff0c;也可以是不连续的…

Thymeleaf th名称空间-表达式语法-访问域对象-获取请求参数-内置对象

基本语法&#xff1a;th名称空间 基本语法&#xff1a;表达式语法 修改标签文本值 代码示例&#xff1a; <p th:text"标签体新值">标签体原始值</p>th:text作用 不经过服务器解析&#xff0c;直接用浏览器打开HTML文件&#xff0c;看到的是『标签体原…

使用C语言连接MySQL

目录 一、引入库 1.1 下载库文件 1.2 在项目中引入库 二、使用库 2.1 连接数据库 2.2 SQL请求 2.3 获取查询结果 2.4 使用案例 一、引入库 1.1 下载库文件 要使用C语言连接MySQL&#xff0c;需使用MySQL官网提供的库 MySQL :: Download Connector/Chttps://dev.mysq…

家政服务小程序开发预约功能

家政服务的需求也越来越大&#xff0c;为了更加方便用户预约服务&#xff0c;很多家政服务平台开始开发微信小程序&#xff0c;为用户提供在线预约服务。那么&#xff0c;如何开发家政服务小程序的预约功能呢&#xff1f;下面我们将结合一些参考信息&#xff0c;为大家详细介绍…

vue-element-admin || 后台管理三级/多级菜单设置

如图&#xff0c;基于vue-element-admin前端框架实现三级菜单&#xff0c;其中页面只对应三级菜单&#xff0c;无二级菜单的页面。 文件组织&#xff0c;在views文件夹下如下组织文件结构&#xff0c;其中第三级的菜单就是具体的.vue文件 在一级菜单hxb_sys下&#xff0c;要…

PROFIBUS-DP主站转ETHERCAT网关连接canopen协议报文解析实例

大家好&#xff0c;今天要给大家介绍一款远创智控的神秘产品&#xff0c;它的名字叫YC-DPM-ECT&#xff0c;是一款兼具PROFIBUS-DP主站功能的通讯网关。想象一下&#xff0c;它既能和PROFIBUS总线打交道&#xff0c;又能与ETHERCAT网络愉快地交流&#xff0c;是不是感觉很神奇&…

【Arduino小车实践】PID应用之四驱小车

一、 PID公式 二、 PID应用的必要性 1. 四驱小车运动 左边两个驱动轮和右边两个驱动轮的速度相同直线右边轮子的速度大于左边轮子的速度左偏右边轮子的速度小于左边轮子的速度 右偏 2. 产生多种运动的原因 小车的4个电机&#xff0c;减速箱以及车轮在物理层面上存在误差&am…

Spark(21):SparkStreaming之DStream入门

目录 0. 相关文章链接 1. WordCount 案例实操 1.1. 需求 1.2. 添加依赖 1.3. 编写代码 1.4. 启动程序并通过netcat发送数据 2. WordCount 解析 0. 相关文章链接 Spark文章汇总 1. WordCount 案例实操 1.1. 需求 使用 netcat 工具向 9999 端口不断的发送数据&#xf…

Flutter系列文章-Flutter环境搭建和Dart基础

Flutter是Google推出的一个开源的、高性能的移动应用开发框架&#xff0c;可以用一套代码库开发Android和iOS应用。Dart则是Flutter所使用的编程语言。让我们来看看如何搭建Flutter开发环境&#xff0c;并了解Dart语言的基础知识。 一、Flutter环境搭建 1. 安装Flutter SDK …

Blender 3.6 LTS更新的5个新功能,一定要试试

Blender基金会已正式发布Blender 3.6 LTS&#xff08;长期支持&#xff09;。它是备受期待的该公司开源 3D 软件的长期支持版本&#xff0c;也是 Blender 3.x 系列的最终 LTS 版本。Blender 3.6有一个用于设置基于粒子的模拟的模拟节点和一个升级的 UV 封装系统&#xff0c;其中…