前言

为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数。
比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登陆函数就行。
但是登录的账号不能写死,有时候我想用账号1去登录,执行用例1,用账号2去登录执行用例2,所以需要对函数传参。

登录函数传参

把登录单独成立,写一个函数,传2个参数user和psw,写用例的时候调用登录函数,输入几组user,psw参数化登录用例

测试用例传参需要用装饰器@pytest.mark.parametrize,里面写两个参数

    • 第一个参数是字符串,多个参数中间用逗号隔开
    • 第二个参数是list,多组数据用元祖类型
# test_01.py

# coding:utf-
import pytest # ** 作者:上海-悠悠 QQ交流群:** # 测试登录数据
test_login_data = [("admin", ""), ("admin", "")] def login(user, psw):
'''普通登录函数'''
print("登录账户:%s"%user)
print("登录密码:%s"%psw)
if psw:
return True
else:
return False @pytest.mark.parametrize("user, psw", test_login_data)
def test_login(user, psw):
'''登录用例'''
result = login(user, psw)
assert result == True, "失败原因:密码为空" if __name__ == "__main__":
pytest.main(["-s", "test_01.py"])

运行结果

============================= test session starts =============================
platform win32 -- Python 3.6., pytest-3.6., py-1.5., pluggy-0.6.
rootdir: D:\, inifile:
plugins: metadata-1.7., html-1.19., allure-adaptor-1.7.
collected items ..\..\..\..\..\..\YOYO\marktest\test_01.py 登录账户:admin
登录密码:
.登录账户:admin
登录密码:
F
user = 'admin', psw = '' @pytest.mark.parametrize("user, psw", [("admin", ""), ("admin", "")])
def test_01(user, psw):
result = login(user, psw)
> assert result == True
E assert False == True D:\YOYO\marktest\test_01.py:: AssertionError ================================== FAILURES ===================================
_______________________________ test_01[admin-] _______________________________ user = 'admin', psw = '' @pytest.mark.parametrize("user, psw", [("admin", ""), ("admin", "")])
def test_01(user, psw):
result = login(user, psw)
> assert result == True
E assert False == True D:\YOYO\marktest\test_01.py:: AssertionError

从结果可以看出,有2个用例,一个测试通过,一个测试失败了,互不影响

request参数

如果想把登录操作放到前置操作里,也就是用到@pytest.fixture装饰器,传参就用默认的request参数
user = request.param 这一步是接收传入的参数,本案例是传一个参数情况

# test_02.py
# coding:utf-
import pytest #** 作者:上海-悠悠 QQ交流群:** # 测试账号数据
test_user_data = ["admin1", "admin2"] @pytest.fixture(scope="module")
def login(request):
user = request.param
print("登录账户:%s"%user)
return user @pytest.mark.parametrize("login", test_user_data, indirect=True)
def test_login(login):
'''登录用例'''
a = login
print("测试用例中login的返回值:%s" % a)
assert a != "" if __name__ == "__main__":
pytest.main(["-s", "test_02.py"])

运行结果:

============================= test session starts =============================
platform win32 -- Python 3.6., pytest-3.6., py-1.5., pluggy-0.6.
rootdir: D:\, inifile:
plugins: metadata-1.7., html-1.19., allure-adaptor-1.7.
collected items ..\..\..\..\..\..\YOYO\marktest\test_02.py 登录账户:admin1
测试用例中login的返回值:admin1
.登录账户:admin2
测试用例中login的返回值:admin2
. ========================== passed in 0.01 seconds ===========================

添加indirect=True参数是为了把login当成一个函数去执行,而不是一个参数

request传2个参数

如果用到@pytest.fixture,里面用2个参数情况,可以把多个参数用一个字典去存储,这样最终还是只传一个参数
不同的参数再从字典里面取对应key值就行,如: user = request.param["user"]

# test_03.py
# coding:utf-
import pytest # ** 作者:上海-悠悠 QQ交流群:** # 测试账号数据
test_user_data = [{"user": "admin1", "psw": ""},
{"user": "admin1", "psw": ""}] @pytest.fixture(scope="module")
def login(request):
user = request.param["user"]
psw = request.param["psw"]
print("登录账户:%s" % user)
print("登录密码:%s" % psw)
if psw:
return True
else:
return False # indirect=True 声明login是个函数
@pytest.mark.parametrize("login", test_user_data, indirect=True)
def test_login(login):
'''登录用例'''
a = login
print("测试用例中login的返回值:%s" % a)
assert a, "失败原因:密码为空" if __name__ == "__main__":
pytest.main(["-s", "test_03.py"])

运行结果

============================= test session starts =============================
platform win32 -- Python 3.6., pytest-3.6., py-1.5., pluggy-0.6.
rootdir: D:\, inifile:
plugins: metadata-1.7., html-1.19., allure-adaptor-1.7.
collected items ..\..\..\..\..\..\YOYO\marktest\test_03.py 登录账户:admin1
登录密码:
测试用例中login的返回值:True
.登录账户:admin1
登录密码:
测试用例中login的返回值:False
F
login = False @pytest.mark.parametrize("login", test_user_data, indirect=True)
def test_login(login):
'''登录用例'''
a = login
print("测试用例中login的返回值:%s" % a)
> assert a, "失败原因:密码为空"
E AssertionError: 失败原因:密码为空
E assert False D:\YOYO\marktest\test_03.py:: AssertionError ================================== FAILURES ===================================
_____________________________ test_login[login1] ______________________________ login = False @pytest.mark.parametrize("login", test_user_data, indirect=True)
def test_login(login):
'''登录用例'''
a = login
print("测试用例中login的返回值:%s" % a)
> assert a, "失败原因:密码为空"
E AssertionError: 失败原因:密码为空
E assert False D:\YOYO\marktest\test_03.py:: AssertionError
===================== failed, passed in 0.05 seconds ======================

如果要用到login里面的返回值,def test_login(login)时,传入login参数,函数返回值就是login了

多个fixtrue

用例上面是可以同时放多个fixture的,也就是多个前置操作,可以支持装饰器叠加,使用parametrize装饰器叠加时,用例组合是2个参数个数相乘

# test_04.py
# ** 作者:上海-悠悠 QQ交流群:**
# coding:utf-
import pytest # 测试账号数据
test_user = ["admin1", "admin2"]
test_psw = ["", ""] @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 @pytest.mark.parametrize("input_user", test_user, indirect=True)
@pytest.mark.parametrize("input_psw", test_psw, indirect=True)
def test_login(input_user, input_psw):
'''登录用例'''
a = input_user
b = input_psw
print("测试数据a-> %s, b-> %s" % (a,b))
assert b if __name__ == "__main__":
pytest.main(["-s", "test_04.py"])

运行结果

============================= test session starts =============================
platform win32 -- Python 3.6., pytest-3.6., py-1.5., pluggy-0.6.
rootdir: E:\YOYO\par, inifile:
plugins: metadata-1.7., html-1.19.
collected items test_04.py 登录账户:admin1
登录密码:
测试数据a-> admin1, b->
.登录账户:admin2
测试数据a-> admin2, b->
.登录密码:
测试数据a-> admin2, b->
.登录账户:admin1
测试数据a-> admin1, b->
. ========================== passed in 0.05 seconds ===========================

如果参数user有2个数据,参数psw有2个数据,那么组合起来的案例是两个相乘,也就是组合2*2 = 4个用例

函数传参和firture传参数request的更多相关文章

  1. pytest十一:函数传参和 firture 传参数 request

    为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数.比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登录函数就行.但是登录 ...

  2. pytest_函数传参和firture传参数request

    前言为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数. 比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登陆函数就行. ...

  3. pytest 12 函数传参和fixture传参数request

    前沿: 有的case,需要依赖于某些特定的case才可以执行,比如,登陆获取到的cookie,每次都需要带着他,为了确保是同一个用户,必须带着和登陆获取到的同一个cookies. 大部分的用例都会先登 ...

  4. pytest文档14-函数传参和firture传参数request

    前言 为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数. 比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登陆函数就行. ...

  5. python中函数的参数:必传参数(位置参数)、默认值参数、参数组传参、关键字传参

    1.必传参数也叫做位置参数,因为必填,也必须对应位置 2.默认值参数如上图的word 3.参数组参数:传进去的是0个.或多个value的形式,,,和位置参数有点像,只传value值,但是没有限制个数 ...

  6. C/C++函数调用时传参过程与可变参数实现原理

    C/C++函数调用时传参过程与可变参数实现原理 C语言的经典swap问题 在学习C语言的时候,我们大都遇到过一些经典例题,这些经典例题背后所代表的是往往是C/C++背后的一些运行原理,比如下面这个示例 ...

  7. mixin 在传参中可以出现 参数 在类内部可以定义 作用域

    mixin 在传参中可以出现 参数  在类内部可以定义

  8. C# WebApi 根据实体类检查传参或字典检查参数

    根据实体类或字典检查传参,是否缺少参数并返回缺少参数 值类型必须声明可空 /// <summary> /// 根据 Dictionary<string, string> 得到实 ...

  9. Vue路由传参及传参后刷新导致参数消失处理

    项目功能需要,要从列表页跳转到第三方提供的URL上(这里第三方页面我是通过iframe引入在详情页,目的是点击返回时可以通过keepAlive让列表页不刷新,如果不通过iframe直接跳第三方链接,那 ...

随机推荐

  1. Delphi 数据类型

  2. cdn工作原理

    cdn工作原理 1.用户向浏览器输入www.web.com这个域名,浏览器第一次发现本地没有dns缓存,则向网站的DNS服务器请求: 2.网站的DNS域名解析器设置了CNAME,指向了www.web. ...

  3. Big Data(三)伪分布式和完全分布式的搭建

    关于伪分布式的配置全程 伪分布式图示 1.安装VMWare WorkStation,直接下一步,输入激活码即可安装 2.安装Linux(需要100GB) 引导分区Boot200MB 交换分区Swap2 ...

  4. Linux下vim显示行数

    在Linux环境下的编辑器有vi.vim.gedit等等.进入这些编辑器之后,为了方便我们需要编辑器显示出当前的行号,可偏偏编辑器默认是不会显示行号的.我们有二种办法可以解决: 第一种是,手动显示:在 ...

  5. 解决bootstrap下的图片自适应问题

    .img-responsive { display: block; height: auto; max-width: 100%; }

  6. ZROI 19.08.11模拟赛

    传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. dlstql,wsl A \(10pts:\) \(a=100,T=100\),对每个排列构造一个反的,一步到位即可. \(20pts ...

  7. Mac OS找不到/usr/include文件夹的解决办法

    Mojave最新解决方案:终端执行: xcode-select --install #完成后执行 sudo installer -pkg /Library/Developer/CommandLineT ...

  8. 基础习题1——print

    引号内,空格就表示空格,引号外,逗号表示空格 print('100+200 =',100 + 200)===100+200 = 300 print('hello','world')===hello w ...

  9. Hystrix——让你的服务更稳一点

    摘要: 1.为什么要用Hystrix在分布式服务环境下,服务之间的调用关系变得错综复杂,你是否担心依赖的服务延迟导致自己的服务也被拖跨呢?是否在苦苦思考如何优雅的对依赖服务进行异步调用呢?是否希望当流 ...

  10. 【NOIP2016提高A组集训第13场11.11】最大匹配

    题目 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存在公 ...