Allure-pytest功能特性介绍

news2024/12/27 19:03:22

前言
学pytest就不得不说fixture,fixture是pytest的精髓所在,就像unittest中的setup和teardown一样,如果不学fixture那么使用pytest和使用unittest是没什么区别的(个人理解)。

fixture用途
1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现

2.测试用例的前置条件可以使用fixture实现

3.支持经典的xunit fixture ,像unittest使用的setup和teardown

4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题

fixture定义
fixture通过@pytest.fixture()装饰器装饰一个函数,那么这个函数就是一个fixture,看个实例

# test_fixture.py
 
import pytest
 
@pytest.fixture()
def fixtureFunc():
    return 'fixtureFunc'
 
def test_fixture(fixtureFunc):
    print('我调用了{}'.format(fixtureFunc))
 
if __name__=='__main__':
    pytest.main(['-v', 'test_fixture.py'])

执行结果

test_fixture.py .我调用了fixtureFunc
                                                        [100%]
 
========================== 1 passed in 0.02 seconds ===========================
Process finished with exit code 0

fixtureFunc 这个函数就是一个fixture,fixture函数内部可以实现一些初始化操作!

fixture使用

调用fixture有三种方式

Fixture名字作为用例的参数

fixture的名字直接作为测试用例的参数,上面的实例就这这种方式,再来看一个实例

# test_fixture.py
 
import pytest
 
@pytest.fixture()
def fixtureFunc():
    return 'fixtureFunc'
 
def test_fixture(fixtureFunc):
    print('我调用了{}'.format(fixtureFunc))
 
class TestFixture(object):
    def test_fixture_class(self, fixtureFunc):
        print('在类中使用fixture "{}"'.format(fixtureFunc))
 
if __name__=='__main__':
    pytest.main(['-v', 'test_fixture.py'])
使用@pytest.mark.usefixtures('fixture')装饰器

每个函数或者类前使用@pytest.mark.usefixtures('fixture')装饰器装饰

实例

# test_fixture.py
import pytest
@pytest.fixture()
def fixtureFunc():
    print('\n fixture->fixtureFunc')
 
@pytest.mark.usefixtures('fixtureFunc')
def test_fixture():
    print('in test_fixture')
 
@pytest.mark.usefixtures('fixtureFunc')
class TestFixture(object):
    def test_fixture_class(self):
        print('in class with text_fixture_class')
 
if __name__=='__main__':
    pytest.main(['-v', 'test_fixture.py'])
使用autouse参数

指定fixture的参数autouse=True这样每个测试用例会自动调用fixture(其实这里说的不是很准确,因为还涉及到fixture的作用范围,那么我们这里默认是函数级别的,后面会具体说fixture的作用范围)

实例

# test_fixture.py
import pytest
@pytest.fixture(autouse=True)
def fixtureFunc():
    print('\n fixture->fixtureFunc')
 
def test_fixture():
    print('in test_fixture')
 
class TestFixture(object):
    def test_fixture_class(self):
        print('in class with text_fixture_class')
 
if __name__=='__main__':
    pytest.main(['-v', 'test_fixture.py'])
结果
 
 fixture->fixtureFunc
.in test_fixture
 
 fixture->fixtureFunc
.in class with text_fixture_class
                                                       [100%]
 
========================== 2 passed in 0.04 seconds ===========================

从结果可以看到每个测试用例执行前都自动执行了fixture

小结
掌握上面的方法,就可以使用fixture了,那么这几种方式又有是区别呢? 其实从我写的代码中就能看出来, 如果测试用例需要使用fixture中返回的参数,那么通过后面这两种方式是无法使用返回的参数的,因为fixture中返回的数据默认存在fixture名字里面存储,所以只能使用第一种方式才可以调用fixture中的返回值。(理论永远是理论,看文章的老铁还是自己试试吧!)

fixtur作用范围
上面所有的实例默认都是函数级别的,所以测试函数只要调用了fixture,那么在测试函数执行前都会先指定fixture。说到作用范围就不得不说fixture 的第二个参数scope参数。

scope参数可以是session, module,class,function; 默认为function

1.session 会话级别(通常这个级别会结合conftest.py文件使用,所以后面说到conftest.py文件的时候再说)

2.module 模块级别: 模块里所有的用例执行前执行一次module级别的fixture

3.class 类级别 :每个类执行前都会执行一次class级别的fixture

4.function :前面实例已经说了,这个默认是默认的模式,函数级别的,每个测试用例执行前都会执行一次function级别的fixture

下面我们通过一个实例具体看一下 fixture的作用范围

# test_fixture.py
import pytest
 
@pytest.fixture(scope='module', autouse=True)
def module_fixture():
    print('\n-----------------')
    print('我是module fixture')
    print('-----------------')
@pytest.fixture(scope='class')
def class_fixture():
    print('\n-----------------')
    print('我是class fixture')
    print('-------------------')
@pytest.fixture(scope='function', autouse=True)
def func_fixture():
    print('\n-----------------')
    print('我是function fixture')
    print('-------------------')
 
def test_1():
    print('\n 我是test1')
 
@pytest.mark.usefixtures('class_fixture')
class TestFixture1(object):
    def test_2(self):
        print('\n我是class1里面的test2')
    def test_3(self):
        print('\n我是class1里面的test3')
@pytest.mark.usefixtures('class_fixture')
class TestFixture2(object):
    def test_4(self):
        print('\n我是class2里面的test4')
    def test_5(self):
        print('\n我是class2里面的test5')
 
if __name__=='__main__':
    pytest.main(['-v', '--setup-show', 'test_fixture.py'])

运行结果

我们在cdm里面执行使用 --setup-show 可以查看到具体setup和teardoen顺序

test_fixture.py 
    SETUP    M module_fixture
        SETUP    F func_fixture
-----------------
我是module fixture
-----------------
 
-----------------
我是function fixture
-------------------
 
        test_fixture.py::test_1 (fixtures used: func_fixture, module_fixture).
 我是test1
 
        TEARDOWN F func_fixture
      SETUP    C class_fixture
        SETUP    F func_fixture
-----------------
我是class fixture
-------------------
 
-----------------
我是function fixture
-------------------
 
        test_fixture.py::TestFixture1::test_2 (fixtures used: class_fixture, func_fixture, module_fixture).
我是class1里面的test2
 
        TEARDOWN F func_fixture
        SETUP    F func_fixture
-----------------
我是function fixture
-------------------
 
        test_fixture.py::TestFixture1::test_3 (fixtures used: class_fixture, func_fixture, module_fixture).
我是class1里面的test3
 
        TEARDOWN F func_fixture
      TEARDOWN C class_fixture
      SETUP    C class_fixture
        SETUP    F func_fixture
-----------------
我是class fixture
-------------------
 
-----------------
我是function fixture
-------------------
 
        test_fixture.py::TestFixture2::test_4 (fixtures used: class_fixture, func_fixture, module_fixture).
我是class2里面的test4
 
        TEARDOWN F func_fixture
        SETUP    F func_fixture
-----------------
我是function fixture
-------------------
 
        test_fixture.py::TestFixture2::test_5 (fixtures used: class_fixture, func_fixture, module_fixture).
我是class2里面的test5
 
        TEARDOWN F func_fixture
      TEARDOWN C class_fixture
    TEARDOWN M module_fixture
 
========================== 5 passed in 0.05 seconds ===========================

 运行结果

我们可以很清楚的看到 整个模块只执行了一次module级别的fixture , 每个类分别执行了一次class级别的fixture, 而每一个函数之前都执行了一次function级别的fixture

fixture实现teardown
其实前面的所有实例都只是做了测试用例执行之前的准备工作,那么用例执行之后该如何实现环境的清理工作呢?这不得不说yield关键字了,相比大家都或多或少的知道这个关键字,他的作用其实和return差不多,也能够返回数据给调用者,唯一的不同是被掉函数执行遇到yield会停止执行,接着执行调用处的函数,调用出的函数执行完后会继续执行yield关键后面的代码。看下下面的实例来了解一下如何实现teardown功能

import pytest
from selenium import webdriver
import time
@pytest.fixture()
def fixtureFunc():
'''实现浏览器的打开和关闭'''
    driver = webdriver.Firefox()
    yield driver
    driver.quit()
def test_search(fixtureFunc):
    '''访问百度首页,搜索pytest字符串是否在页面源码中'''
    driver = fixtureFunc
    driver.get('http://www.baidu.com')
    driver.find_element_by_id('kw').send_keys('pytest')
    driver.find_element_by_id('su').click()
    time.sleep(3)
    source = driver.page_source
    assert 'pytest' in source
    
if __name__=='__main__':
    pytest.main(['--setup-show', 'test_fixture.py'])

这个实例会先打开浏览器,然后执行测试用例,最后关闭浏览器。大家可以试试!  通过yield就实现了 用例执行后的teardown功能

总结
1.fixture如何定义

2.fixture的使用方式

3.fixture作用范围

4.fixture用yield实现teardown功能

最后提一句:实际工作中尽量少用auto=True这个参数,可能会引发意想不到的结果! 最常用的还是通过传递参数最好!

 下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

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

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

相关文章

TikTok海外扩张:亚马逊的新对手崛起

随着社交媒体和电子商务的融合,TikTok正迅速崭露头角,成为亚马逊等传统电商巨头的潜在竞争对手。这一新兴平台的快速发展引发了广泛的关注,特别是在全球范围内。 在这篇文章中,我们将探讨TikTok海外扩张的战略,以及它…

26606-2011 工业用氰乙酸甲酯 阅读笔记

声明 本文是学习GB-T 26606-2011 工业用氰乙酸甲酯. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了工业用氰乙酸甲酯的要求、试验方法、检验规则、标志、包装、运输、贮存和安全。 本标准适用于以氯乙酸、氰化钠、甲醇等为原料…

uniapp h5 端 router.base设置history后仍有#号

manifest.json文件设置: "h5": { "router": { "base": "./", "mode": "history" }, }按相对路径发行时路由模式强制为hash模式,不支持history模式(两者相悖)…

FatFS文件系统在MCU上的应用

FatFS文件系统是单片机领域有名的一个文件系统,由于它的轻量级和兼容性,备受MCU开发者青睐。 在实现如U盘文件读写,SD卡的文件读写等工作时,我们往往需要一个文件系统来支持我们的工作。特别在一些MCU应用中,文件系统…

[React] Context上下文的使用

文章目录 1.Context的介绍2.为什么需要Context3.Context的使用 1.Context的介绍 Context旨在为React复杂嵌套的各个组件提供一个生命周期内的统一属性访问对象,从而避免我们出现当出现复杂嵌套结构的组件需要一层层通过属性传递值得问题。 Context是为了提供一个组…

大语言模型之十三 LLama2中文推理

在《大语言模型之十二 SentencePiece扩充LLama2中文词汇》一文中已经扩充好了中文词汇表,接下来就是使用整理的中文语料对模型进行预训练了。这里先跳过预训练环节。先试用已经训练好的模型,看看如何推理。 合并模型 这一步骤会合并LoRA权重&#xff0…

有没有项目经理能看得懂这九张图?求挑战

大家好,我是老原。 跟项目经理们聊天,经常能听到这样的话: “我是项目经理,除了项目管理的事情外,还要好多事情我得亲自去做。” “项目经理责任大,权力少,真的太累了。” 作为一个项目经理…

DevSecOps 将会嵌入 DevOps

通常人们在一个项目行将结束时才会考虑到安全,这么做会导致很多问题;将安全融入到DevOps的工作流中已产生了积极结果。 DevSecOps:安全正当时 一直以来,开发人员在构建软件时认为功能需求优先于安全。虽然安全编码实践起着重要作…

C#生成自定义海报

安装包 SixLabors.ImageSharp.Drawing 2.0 需要的字体:宋体和微软雅黑 商用的需要授权如果商业使用可以使用方正书宋、方正黑体,他们可以免费商用 方正官网 代码 using SixLabors.Fonts; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Draw…

win10默认浏览器改不了怎么办,解决方法详解

win10默认浏览器改不了怎么办,解决方法详解_蓝天网络 在使用Windows 10操作系统时,你可能会遇到无法更改默认浏览器的情况。这可能是因为其他程序或设置正在干扰更改。如果你也遇到了这个问题,不要担心,本文将为你提供详细的解决…

【小笔记】面对一个没搞过的任务,如何选择合适的算法模型?

【学而不思则罔,思而不学则殆】 9.28 1.确定问题定义 确定要解决的问题是一个什么类型,在算法中有没有一个专业的任务名定义它,确定了问题类型就明确了问题解决方向。 有时候我们要解决的问题可能有多种解决问题的角度,此时可能…

Java | CMD命令认识Java

文章目录 1. CMD命令2. Java概念1.1 Java是什么?1.2下载和安装1.2.1 下载1.2.2 安装1.2.3 JDK的安装目录介绍 1.3 Java语言的发展1.4 Java的三大平台1.4.1 JavaSE1.4.2 JavaME1.4.3 JavaEE 1.5 Java的主要特性1.5.1 Java语言跨平台的原理 1.6 Java中认识 JRE 和 JDK…

文明城市美丽乡村随手拍小程序开源版开发

文明城市美丽乡村随手拍小程序开源版开发 拍照功能:用户可以通过小程序直接打开手机相机,拍摄当前所见的城市或乡村美景。 美化照片功能:用户可以在拍摄或选择的照片上进行美化处理,如调整亮度、对比度、饱和度,添加滤…

为什么通配符SSL证书如此受欢迎?

SSL证书是网站安全的重要保障,而通配符SSL证书更是其中的一种。那么,通配符SSL证书有哪些作用呢?为什么通配符SSL证书如此受欢迎呢?下面,我们就来一起探讨一下。 通配符SSL证书的作用有哪些? 通配符SSL证书…

如何管理好公司的公海客户呢?

销售周期比较长,线索处理比较繁琐,想知道用哪些系统可解决这一问题? 很简单,针对客户管理繁杂,线索复杂的问题,crm系统中的公海池就可以轻松解决。 接下来我将以简道云为例为大家进行详细的公海池介绍 ht…

美容店预约小程序搭建流程

随着科技的不断发展,小程序已经成为了人们生活中不可或缺的一部分。对于美容店来说,搭建一个预约小程序不仅可以提高工作效率,还可以增加客户数量、提高服务质量。那么,如何搭建一个美容店预约小程序呢?本文将为你详细…

计算机竞赛 深度学习大数据物流平台 python

文章目录 0 前言1 课题背景2 物流大数据平台的架构与设计3 智能车货匹配推荐算法的实现**1\. 问题陈述****2\. 算法模型**3\. 模型构建总览 **4 司机标签体系的搭建及算法****1\. 冷启动**2\. LSTM多标签模型算法 5 货运价格预测6 总结7 部分核心代码8 最后 0 前言 &#x1f5…

【N年测试总结】区块链行业测试特点

一、区块链业务系统简介 转入转出业务:这类业务一般会涉及币的转入和转出,转入的流程一般是用户从第三方钱包往用户在公司的地址转入,系统收到用户的转入操作消息通知后,定时在链上监控该地址相关的交易,通过校验各项…

20分钟彻底理解Pointpillars论文-妥妥的

PointPillars: Fast Encoders for Object Detection from Point Clouds PointPillars:快就对了 摘要(可跳过): 这帮人提出了PointPillars,一种新颖的编码器,它利用PointNets来学习以垂直列组织的点云&am…

LaTex一行排列多个图,并且加入每个图都添加小标题

1、Latex中将字母上下方插入字母数字\mathop{a}\limits_{i1}: a i 1 \mathop{a}\limits_{i1} i1a​ 2Latex罗马数字 大写:\uppercase\expandafter{\romannumeral20} 小写:\romannumeral20 2、LaTex一行排列多个图,并且加入每个…