前言

在使用Pytest的时候,为了提高代码的复用性,我们一般会把一些常用操作,比如把登录方法写在 conftest.py 中,然后在不同测试用例中,调用这个登录方法。

但是在测试用例中,我们可能需要传入不同的账号密码·,然后通过调用fixtrue中的登录函数对该账户进行登录,这里就涉及到调用 fixture 时参数传递的问题了,今天我们就来学习下。

使用 pytest.mark.parametrize() 对函数传参

在Pytest中,我们一般使用其装饰器 @pytest.mark.parametrize() 来实现参数化。

下面是一个简单的示例:

import pytestdata = [["user1", "password1"],["wintest", "wintest"],["user2", "password2"]
]def login_user(username, password):print("登录用户:{}".format(username))print("登录密码:{}".format(password))return True if (username == "wintest" and password == "wintest") else False@pytest.mark.parametrize("username, password", data)
def test_login_user(username, password):res = login_user(username, password)assert res

我们在 conftest.py 中把用例开始和结束给打印出来,以便看起来更直观。

@pytest.fixture(autouse=True)
def start_end():print("------------------------Start---------------------------")yieldprint("------------------------End---------------------------")

把以上用例运行后,得到结果如下:

------------------------Start---------------------------
登录用户:user1
登录密码:password1
F------------------------End---------------------------
------------------------Start---------------------------
登录用户:wintest
登录密码:wintest
.------------------------End---------------------------
------------------------Start---------------------------
登录用户:user2
登录密码:password2
F------------------------End---------------------------============================ FAILURES =============================
________________ test_login_user[user1-password1] _________________username = 'user1', password = 'password1'@pytest.mark.parametrize("username, password", data)def test_login_user(username, password):res = login_user(username, password)
>       assert res
E       assert Falsetest_04.py:20: AssertionError
________________ test_login_user[user2-password2] _________________username = 'user2', password = 'password2'@pytest.mark.parametrize("username, password", data)def test_login_user(username, password):res = login_user(username, password)
>       assert res
E       assert Falsetest_04.py:20: AssertionError
2 failed, 1 passed in 0.13 seconds

request接收参数

我们通过查看fixture的源码,可以知道 fixture 下可以有以下5个参数,参数默认值如下:

def fixture(scope="function", params=None, autouse=False, ids=None, name=None):

在这些参数中,有一个参数 params ,它表示当前参数列表,而我们想要拿到当前的参数,可以通过 request.param 来获取。

    :arg params: an optional list of parameters which will cause multipleinvocations of the fixture function and all of the testsusing it.The current parameter is available in ``request.param``.

我们把上面函数传参的用例改一下,然后对 request.param 进行简单的示例:

import pytestdef test_login_user(login_user):res = login_userassert res

修改 conftest.py 如下:

import pytestdata = [["user1", "password1"],["wintest", "wintest"],["user2", "password2"]
]@pytest.fixture(scope="function", params=data, autouse=False)
def login_user(request):username = request.param[0]password = request.param[1]print("登录用户:{}".format(username))print("登录密码:{}".format(password))return True if (username == "wintest" and password == "wintest") else False@pytest.fixture(scope="function", autouse=True)
def start_end():print("------------------------Start---------------------------")yieldprint("------------------------End---------------------------")

把以上用例运行后,得到结果如下:

------------------------Start---------------------------
登录用户:user1
登录密码:password1
F------------------------End---------------------------
------------------------Start---------------------------
登录用户:wintest
登录密码:wintest
.------------------------End---------------------------
------------------------Start---------------------------
登录用户:user2
登录密码:password2
F------------------------End---------------------------============================ FAILURES =============================
__________________ test_login_user[login_user0] ___________________login_user = Falsedef test_login_user(login_user):res = login_user
>       assert res
E       assert Falsetest_04.py:6: AssertionError
__________________ test_login_user[login_user2] ___________________login_user = Falsedef test_login_user(login_user):res = login_user
>       assert res
E       assert Falsetest_04.py:6: AssertionError
2 failed, 1 passed in 0.17 seconds

调用fixtrue时结合request传参

在上面的代码中,我们是把含有用户账号密码的data数据直接放在 conftest.py 中,如果我需要在测试用例中调用 fixtrue 时才传入账号密码,那应该要怎么做呢?

可以在测试用例中通过 @pytest.mark.parametrize() ,把调用的fixtrue当作一个函数来进行参数传递,最后再使用request接收参数。

我们继续对上面的代码进行修改,先修改测试用例部分代码:

import pytestdata = [["user1", "password1"],["wintest", "wintest"],["user2", "password2"]
]# indirect=True的作用是为了把 login_user 当作一个fixture函数进行调用和传递
@pytest.mark.parametrize("login_user", data, indirect=True)
def test_login_user(login_user):res = login_userassert res

修改 conftest.py 如下:

import pytest@pytest.fixture(scope="function", autouse=False)
def login_user(request):username = request.param[0]password = request.param[1]print("登录用户:{}".format(username))print("登录密码:{}".format(password))return True if (username == "wintest" and password == "wintest") else False@pytest.fixture(scope="function", autouse=True)
def start_end():print("------------------------Start---------------------------")yieldprint("------------------------End---------------------------")

把以上用例运行后,得到结果如下:

------------------------Start---------------------------
登录用户:user1
登录密码:password1
F------------------------End---------------------------
------------------------Start---------------------------
登录用户:wintest
登录密码:wintest
.------------------------End---------------------------
------------------------Start---------------------------
登录用户:user2
登录密码:password2
F------------------------End---------------------------============================ FAILURES =============================
__________________ test_login_user[login_user0] ___________________login_user = False@pytest.mark.parametrize("login_user", data, indirect=True)def test_login_user(login_user):res = login_user
>       assert res
E       assert Falsetest_04.py:15: AssertionError
__________________ test_login_user[login_user2] ___________________login_user = False@pytest.mark.parametrize("login_user", data, indirect=True)def test_login_user(login_user):res = login_user
>       assert res
E       assert Falsetest_04.py:15: AssertionError
2 failed, 1 passed in 0.10 seconds

最后: 可以关注公众号:伤心的辣条 ! 进去有许多资料共享!资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

Pytest学习-如何在用例代码中调用fixtrue时传入参数相关推荐

  1. 页面中调用swf 时allowScriptAccess 参数

    <param name="allowScriptAccess" value="always" /> <param name="all ...

  2. 【debug】使用lambda在循环中传参时,参数总为同一个值

    发现问题: 当我使用PyQt5在写一个文本处理小工具时,需要在调用事件时传入参数,于是想到了lambda函数,代码如下: def radiotext(self):'''文档输出格式选择功能'''# 自 ...

  3. c语言调用c 方法,C语言代码中调用C++代码的方法示例

    由于历史原因,以及不同开发人员的技术偏好,C语言和C++语言都有一些独有的非常有价值的项目,因而两种语言的互操作,充分利用前人造的轮子是一件非常有价值的事情. C++代码调用C代码很简单,只要分别在包 ...

  4. 调用c++_WebAssembly: 在C代码中调用JS的函数

    0. 前提知识点 导出C中的函数给JS调用:主要是EMSCRIPTEN_KEEPALIVE这个Emscripten环境特有的宏. #include <stdio.h>#ifndef EM_ ...

  5. c语言代码中调用系统命令行.sh shell脚本,linux shell system传参

    C语言代码中调用命令行: 1. 使用system(" 命令行 ");    --  执行完命令行后,会返回原先C代码的位置,继续执行. 2. 如果命令行中需要传参,使用 sprin ...

  6. 在python代码中调用vba宏的四种方法

    在python代码中调用vba宏 工作以python为主体,但是遇到了一些word操作的需求(详见上一篇),这个需求用word自带的功能会很容易实现,于是就想着能不能用python调用宏来处理. 网上 ...

  7. Golang cgo:如何在Go代码中调用C语言代码?

    如何在Go代码中调用C语言代码? Go语言是通过自带的一个叫CGO的工具来支持C语言函数调用,同时我们可以用Go语言导出C动态库接口给其它语言使用. 方式一.直接在 Go 代码中写入 C 代码 检查是 ...

  8. php+方法返回多个参数,PHP中调用外部程序,及其参数与返回值

    用了一下午,终于弄明白了如何在PHP代码中调用外部程序. 在PHP中调用外部程序主要有两个函数,system和exec. system的原型为string system(string command ...

  9. python语法中infile语句_浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where i ...

最新文章

  1. matlab 无序数对,MATLAB中sort函数对矩阵数进行排序
  2. android时间轴折线图,带时间轴的折线图
  3. 所有顶点对最短路径问题(图的应用)
  4. 敏捷个人俱乐部2012年2月线下活动:活出我的最好生活
  5. flask mysql项目模板渲染_Flask模板渲染
  6. 通过MULE集成服务的几种方式
  7. file watchers怎么默认打开_Python读写文件怎么和我之前学的不一样?
  8. 设计计算机程序时 要考虑计算的过程,算法和程序设计练习题复习课程(6页)-原创力文档...
  9. php 分割二维数组,拆分二维数组 php
  10. windows 2012 r2 can't find kb2919355
  11. python request timeout_详解Python requests 超时和重试的方法
  12. 一道打印菱形的面试题
  13. jsp的知识略解,只作为笔记,不作为知识参考,谢谢
  14. ubantu 安装anaconad_Ubuntu16.04安装Anaconda (转)
  15. 用Python实现开心消消乐小游戏
  16. C#设计模式之5——生成器模式
  17. 蘑菇街交易平台 数据库架构演进历程
  18. ios 收藏app内容或网页到手机桌面
  19. IP安全,DDoS攻击、tearDrop攻击和微小IP碎片攻击
  20. excel表格保护单元格教程加破解(忘记密码情况下破解)

热门文章

  1. css遮罩层从下往上_CSS:图片自带3px下边距的bug修复
  2. 工作展望简短_元旦祝福语大全简短
  3. qml 时间控件_Qt6官方最新消息:桌面样式Qt quick Controls 2支持大多控件,委托更少,运行更流畅...
  4. android 重绘如何能不闪一下屏幕_回流和重绘
  5. java 注释 代码,如何在Java中注释代码块
  6. Win10 下Visual Studio 2017源码编译Paddle
  7. java求最小步数_关于java:查找两点之间的最小步数?
  8. ADC采样间隔问题+TRGO作为ADC的触发源头
  9. 前端综合学习笔记---异步、ES6/7、Module、Promise同步 vs 异步
  10. B站,N站,汤站,爬虫下载资源总结与技巧(一)