超强,Pytest自动化测试框架 fixture 传参实战(案例)

news2024/11/17 15:47:26

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

为了提高复用性,我们在写测试用例的时候,会用到不同的fixture,比如:最常见的登录操作,大部分的用例的前置条件都是登录

假设不同的用例想登录不同的测试账号,那么登录fixture就不能把账号写死,需要通过传参的方式来完成登录操作

案例1:传单个参数

import pytest


@pytest.fixture()
def login(request):
    name = request.param
    print(f"== 账号是:{name} ==")
    return name


data = ["pyy1", "polo"]
ids = [f"login_test_name is:{name}" for name in data]


@pytest.mark.parametrize("login", data, ids=ids, indirect=True)
def test_name(login):
    print(f" 测试用例的登录账号是:{login} ")

执行结果

collecting ... collected 2 items

10fixture_request.py::test_name[login_test_name is:pyy1] == 账号是:pyy1 ==
PASSED          [ 50%] 测试用例的登录账号是:pyy1 

10fixture_request.py::test_name[login_test_name is:polo] == 账号是:polo ==
PASSED          [100%] 测试用例的登录账号是:polo 

添加 indirect=True 参数是为了把 login 当成一个函数去执行,而不是一个参数,并且将data当做参数传入函数;
def test_name(login) ,这里的login是获取fixture返回的值;

案例2:多个参数

@pytest.fixture()
def logins(request):
    param = request.param
    print(f"账号是:{param['username']},密码是:{param['pwd']}")
    return param


data = [
    {"username": "name1", "pwd": "pwd1"},
    {"username": "name2", "pwd": "pwd2"},
]


@pytest.mark.parametrize("logins", data, indirect=True)
def test_name_pwd(logins):
    print(f"账号是:{logins['username']},密码是:{logins['pwd']}")

执行结果

10fixture_request.py::test_name_pwd[logins0] 账号是:name1,密码是:pwd1
PASSED                      [ 50%]账号是:name1,密码是:pwd1

10fixture_request.py::test_name_pwd[logins1] 账号是:name2,密码是:pwd2
PASSED                      [100%]账号是:name2,密码是:pwd2

如果需要传多个参数,需要通过字典去传

案例3:多个fixture(只加一个装饰器)

这种更常用

# 多个fixture
@pytest.fixture(scope="module")
def input_user(request):
    user = request.param
    print("登录账户:%s" % user)
    return user


@pytest.fixture(scope="module")
def input_psw(request):
    psw = request.param
    print("登录密码:%s" % psw)
    return psw


data = [
    ("name1", "pwd1"),
    ("name2", "pwd2")
]


@pytest.mark.parametrize("input_user,input_psw", data, indirect=True)
def test_more_fixture(input_user, input_psw):
    print("fixture返回的内容:", input_user, input_psw)

执行结果

10fixture_request.py::test_more_fixture[name1-pwd1] 登录账户:name1
登录密码:pwd1
PASSED               [ 50%]fixture返回的内容: name1 pwd1

10fixture_request.py::test_more_fixture[name2-pwd2] 登录账户:name2
登录密码:pwd2
PASSED               [100%]fixture返回的内容: name2 pwd2

案例4:多个fixture(叠加装饰器)

# 多个fixture
@pytest.fixture(scope="function")
def input_user(request):
    user = request.param
    print("登录账户:%s" % user)
    return user


@pytest.fixture(scope="function")
def input_psw(request):
    psw = request.param
    print("登录密码:%s" % psw)
    return psw


name = ["name1", "name2"]
pwd = ["pwd1", "pwd2"]


@pytest.mark.parametrize("input_user", name, indirect=True)
@pytest.mark.parametrize("input_psw", pwd, indirect=True)
def test_more_fixture(input_user, input_psw):
    print("fixture返回的内容:", input_user, input_psw)

执行结果

10fixture_request.py::test_more_fixture[pwd1-name1] 登录账户:name1
登录密码:pwd1
PASSED               [ 25%]fixture返回的内容: name1 pwd1

10fixture_request.py::test_more_fixture[pwd1-name2] 登录账户:name2
登录密码:pwd1
PASSED               [ 50%]fixture返回的内容: name2 pwd1

10fixture_request.py::test_more_fixture[pwd2-name1] 登录账户:name1
登录密码:pwd2
PASSED               [ 75%]fixture返回的内容: name1 pwd2

10fixture_request.py::test_more_fixture[pwd2-name2] 登录账户:name2
登录密码:pwd2
PASSED               [100%]fixture返回的内容: name2 pwd2

测试用例数=2*2=4条

下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

勇往直前,志存高远。不断奋斗,追逐梦想。每一次努力都是自我突破的机会,坚持不懈,成功必将在你脚下绽放。相信自己,你就能战胜一切困难,创造属于自己的辉煌人生!

勇往直前,不畏艰辛;拼尽全力,追逐梦想;执着坚持,无所畏惧;奋斗不息,创造辉煌;脚踏实地,登上巅峰;努力奋进,成就自己;积极进取,收获未来;信心满怀,无所不能;生命短暂,奋斗不停。

只有持之以恒的努力,才能驱散迷茫的阴霾,迈向辉煌的明天。无论前路多坎坷,心怀梦想,不停奋斗;只要脚踏实地,必能收获成功。相信自己,超越极限,勇往直前!

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

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

相关文章

企业邮箱如何设置分级管理员

给邮局设置成员后,有的时候会分为多个分组,那么就需要设置分级管理员,分级管理员可以管理所属部门或群组的成员,为企业邮局的管理提供了更多的便利。设置方法如下: 例:我们要将销售分公司的高阳&#xff0…

MAYA粒子粘性

粒子被挡下来了

SpringBoot使用post方式上传文件

文章目录 SpringBoot使用post方式上传文件1.上传文件代码2.postman测试 SpringBoot使用post方式上传文件 1.上传文件代码 PostMapping("/upload/v1")public ResponseMsg<Map<String,Object>> fileUpload(RequestParam("file") MultipartFile …

java中对象的比较详解

一、问题背景 我们先来看这样一个背景&#xff0c;如果有一个学生类&#xff0c;成员属性有姓名name(String),年龄age(int),分数score(double). public class Test {class student{String name;int age;double score;public student(String name, int age, double score) {th…

【ubuntu】设置国内镜像源

ubuntu清华镜像源 备份 sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak 新建 sudo touch /etc/apt/sources.list sudo vi /etc/apt/sources.list 添加内容 # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https://mirrors.tuna…

想不想知道智能配音怎么弄

配音是一种将人的声音与影像相结合的技术&#xff0c;可以为电影、动画、广告等视频内容提供声音和情感上的支持。当观众看到画面中的角色在说话时&#xff0c;如果有配音&#xff0c;则更容易进入故事情节并深入参与其中。对于一些需要讲述复杂信息的内容&#xff0c;通过配音…

Redis实战案例7-缓存雪崩及其解决思路

1. 缓存雪崩 如果缓存集中在一段时间内失效或者Redis服务宕机&#xff0c;所有的查询都落在数据库上&#xff0c;造成了缓存雪崩。 2. 解决思路 给不同的key的TTL添加随机值 在缓存的时候给过期时间加上一个随机值&#xff0c;这样就会大幅度的减少缓存在同一时间过期。 利用R…

PHP TP5.0框架会员根据经验值升级等级

// 初始化最小差值为一个较大的数 $minDifference 500000; 先看一下会员等级表规则的表结构 普通会员默认注册就是&#xff0c;经验值0 1.先查询出最高等级所需要的经验值 //先查询最高等级所需要的经验值 $b Db::name(wechat_user_vip)->order(id DESC)…

【bug解决】Could not resolve ‘us.archive.ubuntu.com‘

解决步骤&#xff1a; 1、备份 /etc/resolv.conf 文件 sudo cp /etc/resolv.conf /etc/resolv.conf.bak 2、修改/etc/resolv.conf 文件 # 编辑文件 sudo vi /etc/resolv.conf# 修改nameserver变量值 nameserver 8.8.8.8esc -> :wq!3、重启network服务 /etc/init.d/netwo…

【二】构造函数和原型

ES6&#xff08;ECMAScript 6.0&#xff09;之前js没有引入类的概念 在ES6之前&#xff0c;对象不是基于类创建的&#xff0c;而是用一种称为构建函数的特殊函数来定义对象和它们的特征 ES6之前创建对象可以通过以下三种方式创建对象&#xff1a; 对象字面量&#xff1a; v…

前端vue入门(纯代码)17

不管何时何地&#xff0c;永远保持热爱&#xff0c;永远积极向上&#xff01;&#xff01;&#xff01; 【19.尚硅谷GitHub案例】 1.静态GitHub搜索案例的静态文件&#xff1a; index.html <!DOCTYPE html> <html lang"en"> <head><meta cha…

RNN其中的X.reshape

假设RNN中的输入为2528&#xff0c;2是batchsize可以理解为有几句话&#xff0c;5是timestep可以理解为有几个词&#xff0c;28是vocab_size。如下就是两个句子&#xff0c;每个句子由5个单词组成。28则为每个单词的词向量&#xff0c;在此略去。 在输入的时候&#xff0c;首先…

力姆泰克电动推杆

LAP梯形丝杠电动推杆 内含长寿命润滑脂&#xff0c;免维护 向下翻动查看更多 力姆泰克电动推杆 高强度/高耐磨材料选择&#xff0c;高精度的零部件加工&#xff0c;先进的壳体设计理念&#xff0c;造就高承载能力&#xff0c;抗冲击&#xff0c;低噪音&#xff0c;长寿命的优…

机器学习9:使用 TensorFlow 进行特征组合编程实践

在【机器学习6】这篇文章中&#xff0c;笔者已经介绍过环境准备相关事项&#xff0c;本文对此不再赘述。本文将通过编程案例来探索特征组合&#xff08;Feature Crosses&#xff09;对模型训练的影响&#xff0c;加深对上一篇文章&#xff08;机器学习8&#xff09;的理解。 经…

C++ DAY2

1.总结类和结构体的区别 1.结构体是一种值类型&#xff0c;而类是引用类型。值类型用于存储数据的值&#xff0c;引用类型用于存储对实际数据的引用 2.结构体中声明的成员变量无法赋予初值&#xff0c;类可以 3.结构体是值类型&#xff0c;它在栈中分配空间&#xff1b;而类是…

青大数据结构【2018】【算法分析】

关键字&#xff1a; 单链表奇偶数拆分、顺序表交集、二叉排序树 右中左的顺序&#xff0c;找出二叉排序树中值大于等于k的所有结点。

2.位带操作

1.位带操作&#xff1a; 2.位带区与位带别名区地址转换&#xff1a; 外设位带别名区地址&#xff1a;AliasAddr0x42000000(A-0x40000000)*8*4n*4&#xff1b;SRAM位带别名区地址&#xff1a;AliasAddr0x22000000(A-0x20000000)*8*4n*4&#xff1b;IO口操作宏定义&#xff1a;…

【Linux】NoSQL之 Redis配置与优化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 NoSQL之 Redis配置与优化 关系数据库与非关系型数据库关系型数据库非关系型数据库关系型数据库和非关系型数据库区别数据存储方式不同扩展方式不同对事务性的支持不同 非关系…

多元回归预测 | Matlab麻雀算法(SSA)优化极限学习机ELM回归,SSA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab麻雀算法(SSA)优化极限学习机ELM回归,SSA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变…

交叉熵损失CrossEntropyLoss

交叉熵损失CrossEntropyLoss 语义分割网络输出tensor的尺寸为【B,C,H,W】,进行多分类&#xff0c;label的尺寸为【B,H,W】。 举例&#xff1a;三分类&#xff1a;output【1, 3&#xff0c;3, 3】&#xff0c;label【1, 3, 3】 验证 import torchoutput torch.tensor([[[[1, 1…