爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...

这篇具有很好参考价值的文章主要介绍了爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

参数化?
通俗点理解就是,定义一个测试类或测试函数,可以传入不同测试用例对应的参数,从而执行多个测试用例。

例如:
对登录接口进行测试,假设有3条用例,正确账号正确密码登录、正确账号错误密码登录、错误账号正确密码登录,那么我们只需要定义一个登陆测试函数test_login(),然后使用这3条用例对应的参数去调用test_login()即可。

在unittest中可以使用ddt进行参数化,而pytest中也提供非常方便的参数化方式,即使用装饰器@pytest.mark.parametrize()。

一般写为pytest.mark.parametrize(“argnames”, argvalues)。
其中:
argnames为参数名称,可以是单个或多个,多个写法为"argname1, argname2, …";
argvalues为参数值,类型必须为list(单个参数时可以为元组,多个参数时必须为list,所以最好统一);

例如有下接口:
请求的登陆接口信息:

接口url:http://127.0.0.1:5000/login
请求方式:post
请求参数:
响应信息:

1、单个参数

只需要传入一个参数时,示例如下:

# 待测试函数
def sum(a):
    return a+1

# 单个参数
data = [1, 2, 3, 4]
@pytest.mark.parametrize("item", data)
def test_add(item):
    actual = sum(item)
    print("\n{}".format(actual))
    # assert actual == 3

if __name__ == '__main__':
    pytest.main()

注意:
@pytest.mark.parametrize()中的第一个参数,必须以字符串的形式来标识测试函数的入参,如上述示例中,定义的测试函数test_login()中传入的参数名为item,那么@pytest.mark.parametrize()的第一个参数则为"item"。

运行结果如下:

rootdir: E:\blog\python接口自动化\apiAutoTest, configfile: pytest.ini
plugins: html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1
collecting ... collected 4 items

test_case_2.py::test_add[1] PASSED                                       [ 25%]
2

test_case_2.py::test_add[2] PASSED                                       [ 50%]
3

test_case_2.py::test_add[3] PASSED                                       [ 75%]
4

test_case_2.py::test_add[4] PASSED                                       [100%]
5

============================== 4 passed in 0.02s ==============================

从结果可以看到,测试函数分别传入了data中的参数,总共执行了5次。

2、多个参数

测试用例需传入多个参数时,@pytest.mark.parametrize() 的第一个参数同样是字符串, 对应用例的多个参数用逗号分隔。

示例:

import pytest
import requests
import json

# 列表嵌套元组
data = [("lilei", "123456"), ("hanmeimei", "888888")]
# 列表嵌套列表
# data = [["lilei", "123456"], ["hanmeimei", "888888"]]

@pytest.mark.parametrize("username, password", data)
def test_login(username, password):
    headers = {"Content-Type": "application/json;charset=utf8"}
    url = "http://127.0.0.1:5000/login"
    _data = {
        "username": username,
        "password": password
    }
    res = requests.post(url=url, headers=headers, json=_data).text
    res = json.loads(res)
    assert res['code'] == 1000


if __name__ == '__main__':
    pytest.main()

需要注意:
代码中data的格式,可以是列表嵌套列表,也可以是列表嵌套元组,列表中的每个列表或元组代表一组独立的请求参数。
"username, password"不能写成 “username”, “password”。

运行结果如下:

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

从结果中我们还可以看到每次执行传入的参数,如下划线所示部分。

这里所举示例是2个参数,传入3个或更多参数时,写法也同样如此,一定要注意它们之间一一对应的关系,如下图:

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

3、对测试类参数化

上面所举示例都是对测试函数进行参数化,那么对测试类怎么进行参数化呢?

其实,对测试类的参数化,就是对测试类中的测试方法进行参数化。

@pytest.mark.parametrize()中标识的参数个数,必须与类中的测试方法的参数一致。示例如下:

# 将登陆接口请求单独进行了封装,仅仅只是为了方便下面的示例
def login(username, password):
    headers = {"Content-Type": "application/json;charset=utf8"}
    url = "http://127.0.0.1:5000/login"
    _data = {
        "username": username,
        "password": password
    }
    res = requests.post(url=url, headers=headers, json=_data).text
    res = json.loads(res)
    return res

# 测试类参数化
data = [
    ("lilei", "123456"), ("hanmeimei", "888888")
]
@pytest.mark.parametrize("username, password", data)
class TestLogin:
    def test_login_01(self, username, password):
        res = login(username, password)
        assert res['code'] == 1000

    def test_login_02(self, username, password):
        res = login(username, password)
        assert res['msg'] == "登录成功!"

if __name__ == '__main__':
    pytest.main(["-s"])

运行结果如下:

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

从结果中可以看出来,总共执行了4次,测试类中的每个测试方法都执行了2次,即每个测试方法都将data中的每一组参数都执行了一次。

注意:
这里还是要强调参数对应的关系,即@pytest.mark.parametrize()中的第一个参数,需要与测试类下面的测试方法的参数一一对应。

4、参数组合

在编写测试用例的过程中,有时候需要将参数组合进行接口请求,如示例的登录接口中username有 lilei、hanmeimei,password有 123456、888888,进行组合的话有下列四种情况:

{"username": "lilei", "password": "123456"}
{"username": "lilei", "password": "888888"}
{"username": "hanmeimei", "password": "123456"}
{"username": "hanmeimei", "password": "888888"}

在@pytest.mark.parametrize()也提供了这样的参数组合功能,编写格式示例如下:

import pytest
import requests
import json


username = ["lilei", "hanmeimei"]
password = ["123456", "888888"]

@pytest.mark.parametrize("password", password)
@pytest.mark.parametrize("username", username)
def test_login(username, password):
    headers = {"Content-Type": "application/json;charset=utf8"}
    url = "http://127.0.0.1:5000/login"
    _data = {
        "username": username,
        "password": password
    }
    res = requests.post(url=url, headers=headers, json=_data).text
    res = json.loads(res)
    assert res['code'] == 1000
	
	
if __name__ == '__main__':
    pytest.main()

运行结果如下:

rootdir: E:\blog\python接口自动化\apiAutoTest, configfile: pytest.ini
plugins: html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1
collecting ... collected 4 items

test_case_5.py::test_login[lilei-123456] PASSED                          [ 25%]
test_case_5.py::test_login[lilei-888888] FAILED                          [ 50%]
test_case_5.py::test_login[hanmeimei-123456] FAILED                      [ 75%]
test_case_5.py::test_login[hanmeimei-888888] PASSED                      [100%]
=========================== short test summary info ===========================
FAILED test_case_5.py::test_login[lilei-888888] - assert 1001 == 1000
FAILED test_case_5.py::test_login[hanmeimei-123456] - assert 1001 == 1000
========================= 2 failed, 2 passed in 0.18s =========================

从结果可以看出来,2个username、2个password 有4中组合方式,总执行了4次。如果是3个username、2个password,那么就有6中参数组合方式,依此类推。

注意:
以上这些示例中的测试用例仅仅只是用于举例,实际项目中的登录接口测试脚本与测试数据会不一样。

5、增加测试结果可读性

从示例的运行结果中我们可以看到,为了区分参数化的运行结果,在结果中都会显示由参数组合而成的执行用例名称,很方便就能看出来执行了哪些参数组合的用例。

示例:

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

但这只是简单的展示,如果参数多且复杂的话,仅仅这样展示是不够清晰的,需要添加一些说明才能一目了然。

因此,在@pytest.mark.parametrize()中有两种方式来自定义上图中划线部分的显示结果,即使用@pytest.mark.parametrize()提供的参数 ids 自定义,或者使用pytest.param()中的参数id自定义。

ids(推荐)
ids使用方法示例如下:

import pytest
import requests
import json


data = [("lilei", "123456"), ("hanmeimei", "888888")]
ids = ["username:{}-password:{}".format(username, password) for username, password in data]
@pytest.mark.parametrize("username, password", data, ids=ids)
def test_login(username, password):
    headers = {"Content-Type": "application/json;charset=utf8"}
    url = "http://127.0.0.1:5000/login"
    _data = {
        "username": username,
        "password": password
    }
    res = requests.post(url=url, headers=headers, json=_data).text
    res = json.loads(res)
    assert res['code'] == 1000
    

if __name__ == '__main__':
    pytest.main()

从编写方式可以看出来,ids就是一个list,且它的长度与参数组合的分组数量一致。

运行结果如下:

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

比较上面个执行结果,我们能看出ids自定义执行结果与默认执行结果展示的区别。使用过程中,需要根据实际情况来自定义。

id
使用方式示例如下:

import pytest
import requests
import json


data = [
    pytest.param("lilei", "123456", id="correct username and correct password"),
    pytest.param("lilei", "111111", id="correct user name and wrong password")
]

@pytest.mark.parametrize("username, password", data)
def test_login(username, password):
    headers = {"Content-Type": "application/json;charset=utf8"}
    url = "http://127.0.0.1:5000/login"
    _data = {
        "username": username,
        "password": password
    }
    res = requests.post(url=url, headers=headers, json=_data).text
    res = json.loads(res)
    assert res['code'] == 1000


if __name__ == '__main__':
    pytest.main()

运行结果如下:

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

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

一、Python编程入门到精通

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

二、接口自动化项目实战

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

三、Web自动化项目实战

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

四、App自动化项目实战

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

五、一线大厂简历

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

六、测试开发DevOps体系

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

七、常用自动化测试工具

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

八、JMeter性能测试

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...,软件测试,自动化测试,接口自动化,软件测试,自动化测试,python自动化测试,自动化测试框架,pytest自动化测试框架,接口自动化测试,web自动化测试

九、总结(尾部小惊喜)

奋斗是一段漫长的旅程,痛苦与磨难只是通往成功的试炼。不惧困难,坚守信念,用汗水浇灌梦想的花朵。相信自己,勇往直前,你将创造属于自己的辉煌,留下无悔的足迹!

执着的火焰燃烧内心,不屈的勇气驱散黑暗。放下畏惧,迎接挑战,奋斗的脚步不停歇。每一次努力铸就坚韧,每一次拼搏开启新篇章。勇往直前,追逐梦想。

人生的舞台,唯有奋斗才能谱写出绚丽的乐章。不要畏惧困难,要勇敢地迎接挑战。坚持努力,永不放弃,相信自己的力量,你将创造出意想不到的精彩人生!文章来源地址https://www.toymoban.com/news/detail-642311.html

到了这里,关于爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python UI自动化 —— pytest常用运行参数解析、pytest执行顺序解析

    -v 用于显示每个测试函数的执行结果 -q 只显示整体测试结果 -s 用于显示测试函数中print()函数输出 -x 在第一个错误或失败的测试中立即退出 -m 只运行带有装饰器配置的测试用例 -k 通过表达式运行指定的测试用例 -h 帮助 首先来看什么参数都没加的运行情况 -v 用于显示每个测

    2024年02月09日
    浏览(46)
  • python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

    经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路。 我们在百度搜索 天气查询 ,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接口测试用例脚本。 针对某个功能做接口测试,首先我们需

    2024年02月04日
    浏览(55)
  • 从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)

    接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,RPC,Webservice,Dubbo,RESTful等类型。 接口测试流程 1、需求评审,熟悉业务和需求 2、开发提供接口文档 3、编写接口测试用例 4、用

    2024年02月14日
    浏览(60)
  • Python自动化测试:unittest与pytest框架

    在Python中, unittest 和 pytest 都是常用的自动化测试框架。它们提供了编写测试用例、测试套件和执行测试的强大功能。 1. unittest框架 unittest 是Python标准库的一部分,因此无需额外安装。它提供了丰富的断言方法,用于验证测试结果。 示例代码: python复制代码 import unittest c

    2024年02月20日
    浏览(56)
  • python pytest 最简单的接口自动化测试框架

    最近由于工作的原因,需要开发一个接口自动化测试框架,使用pytest框架、数据驱动,并展示直观的测试报告。 具体的开发过程如下: 安装必要的库: pytest:用于编写和运行测试用例。 requests:用于发送 HTTP 请求。 pytest-html:用于生成 HTML 格式的测试报告。 可以使用以下命

    2024年03月19日
    浏览(102)
  • 接口自动化测试:Python+Pytest+Requests+Allure

    本项目实现了对Daily Cost的接口测试: Python+Requests 发送和处理HTTP协议的请求接口 Pytest 作为测试执行器 YAML 管理测试数据 Allure 来生成测试报告。 本项目是参考了pytestDemo做了自己的实现。 项目结构 api : 接口封装层,如封装HTTP接口为Python接口 commom : 从文件中读取数据等各种

    2024年02月09日
    浏览(74)
  • 探索pytest:Python自动化测试的新境界

    在当今的软件开发领域,测试已经不仅仅是一个简单的步骤,而是确保软件质量的核心环节。Python,作为全球最受欢迎的编程语言之一,拥有丰富的测试框架和工具。而在这其中,pytest无疑是最受欢迎和最具影响力的一个。本文将深入探讨pytest的魅力,以及它如何改变了Pyt

    2024年02月11日
    浏览(57)
  • python+pytest接口自动化之测试函数、测试类/测试方法的封装

    今天呢,笔者想和大家聊聊python+pytest接口自动化中将代码进行封装,只有将测试代码进行封装,才能被测试框架识别执行。 例如单个接口的请求代码如下: 假设我们需要将上面这段代码编写成测试框架能执行的测试用例,仅仅只是这样写代码显然是不够的,还需要进行如下

    2024年03月09日
    浏览(65)
  • Python自动化测试框架:Pytest和Unittest的区别

    pytest和unittest是Python中常用的两种测试框架,它们都可以用来编写和执行测试用例,但两者在很多方面都有所不同。本文将从不同的角度来论述这些区别,以帮助大家更好地理解pytest和unittest。 1. 原理 pytest是基于Python的assert语句和Python的自省特性实现测试框架,其原理是基于

    2024年02月10日
    浏览(64)
  • Python 自动化测试框架unittest与pytest的区别

    📌 博客主页: 美团程序员 📌 专注于软件测试领域相关技术实践和思考,持续分享自动化软件测试开发干货知识! 📌 如果你也想学习软件测试,文末卡片有我的交流群632880530,加入我们,一起交流和学习! 引言 前面一篇文章Python单元测试框架介绍已经介绍了python单元测

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包