700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Python测试框架pytest(04)fixture - 测试用例调用fixture fixture传递测试数据

Python测试框架pytest(04)fixture - 测试用例调用fixture fixture传递测试数据

时间:2020-12-27 10:48:21

相关推荐

Python测试框架pytest(04)fixture - 测试用例调用fixture fixture传递测试数据

Python测试框架pytest系列可以查看下列

Python测试框架pytest(01)简介、安装、快速入门_编程简单学的博客-CSDN博客

Python测试框架pytest(02)PyCharm设置运行pytest、pytest.main()_编程简单学的博客-CSDN博客

Python测试框架pytest(03)setup和teardown_编程简单学的博客-CSDN博客

软件测试资料领取方式 (#1) · Issue · 可可爱爱的程序员 / 软件测试资料合集 · GIT CODE

setup、teardown 可以实现在执行用例前或结束后加入一些操作,但这种都是针对整个脚本全局的。

假设有以下场景:用例A需要先登录,用例B不需要登录,用例C需要先登录;很显然无法用 setup 和 teardown 来实现。

fixture 的作用是可以让我们自定义测试用例的前置条件。

fixture的优势:

命名方式灵活,不局限于 setup 和 teardown 这几个命名conftest.py 配置里可以实现数据共享,不需要 import 就能自动找到 fixturescope="module" 可以实现多个 .py 跨文件共享前置scope="session" 可以实现多个 .py 跨文件使用一个 session 来完成多个用例

fixture的参数列表:

@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)def test():print("fixture初始化的参数列表")复制代码

scope:可以理解成 fixture 的作用范围,默认:function,还有 class、module、package、session

function 的作用域:每一个函数或方法都会调用class 的作用域:每一个类调用一次,一个类中可以有多个方法module 的作用域:每一个 .py 文件调用一次,该文件内又有多个 function 和 classsession 的作用域:是多个文件调用一次,可以跨 .py 文件调用,每个 .py 文件就是 module

params:一个可选的参数列表,它将导致多个参数调用 fixture 功能和所有测试使用它

autouse:默认:False,需要用例手动调用该 fixture;如果是 True,所有作用域内的测试用例都会自动调用该 fixture

ids:每个字符串 id 的列表,每个字符串对应于 params,这样他们就是测试ID的一部分。如果没有提供ID,它们将从 params 自动生成

name:默认:装饰器的名称,同一模块的 fixture 相互调用建议写不同的名称

1、创建test_fixture_0.py文件

#!/usr/bin/env python# -*- coding: utf-8 -*-"""微信公众号:AllTests软件测试"""import pytest@pytest.fixture()def fixturefun():return 123def test_case(fixturefun):assert fixturefun == 123复制代码

@pytest.fixture() 装饰器用于声明函数是一个 fixture,如果测试用例的参数中包含此 fixture 函数,则在测试用例运行前会先运行此 fixture 函数。如果 fixture 函数有返回值,则将返回值传递给测试用例函数。

2、运行结果:

fixturefun 函数返回123给 test_case 函数,则断言成功。

1、测试用例调用fixture

1、创建test_fixture.py文件

调用的三种方式:

(1)将 fixture 名称作为测试用例函数的输入参数,例如 login 是 test_s1 函数的输入参数。

(2)测试用例加上装饰器:@pytest.mark.usefixtures(fixture_name)

(3)fixture 设置 autouse=True

脚本代码:

#!/usr/bin/env python# -*- coding: utf-8 -*-"""微信公众号:AllTests软件测试"""import pytest# 调用方式一@pytest.fixturedef login():print("输入账号 login,密码登录")def test_s1(login):print("用例 1:登录之后其它动作 test_s1")def test_s2():print("用例 2:不需要登录,操作 test_s2")# 调用方式二@pytest.fixturedef login2():print("输入账号 login2,密码登录")@pytest.mark.usefixtures("login2", "login")def test_s3():print("用例 3:登录之后其它动作 test_s3")# 调用方式三@pytest.fixture(autouse=True)def login3():print("====login3====")# 不是test开头,加了装饰器也不会执行fixture@pytest.mark.usefixtures("login2")def login4():print("====login4====")复制代码

2、运行结果:

(1)login3 设置为 autouse=True,则每次执行用例前都会先执行 login3

(2)test_s1 引用了入参 login,则先执行 login,之后再执行 test_s1

(3)test_s2 没有引用入参,直接执行 test_s2

(4)test_s3 使用了装饰器,则先执行 login2,之后 login,最后 test_s3

(5)login4 加了装饰器,但不是 test 开头,所以不会执行

关键点:

在类声明上面加 @pytest.mark.usefixtures() ,代表这个类里面所有测试用例都会调用该 fixture可以叠加多个 @pytest.mark.usefixtures() ,先执行的放底层,后执行的放上层可以传多个 fixture 参数,先执行的放前面,后执行的放后面如果 fixture 有返回值,用 @pytest.mark.usefixtures() 是无法获取到返回值的,必须用传参的方式(方式一)

2、fixture传递测试数据

1、创建test_fixture_1.py文件

脚本代码:

#!/usr/bin/env python# -*- coding: utf-8 -*-"""微信公众号:AllTests软件测试"""import pytest@pytest.fixture()def fixturefun():return (1,2,3,4)def test_one(fixturefun):assert fixturefun[0] == 2def test_two(fixturefun):assert fixturefun[1] == 2复制代码

2、运行结果:

函数 test_one 断言失败,fixturefun[0] 值是1,fixturefun[1] 的值才是2。

函数 test_two 断言成功。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。