Pytest执行的顺序

当pytest运行测试函数时,它会查看该测试函数中的参数,然后搜索与这些参数具有相同名称的fixture。一旦pytest找到这些对象,它就会运行这些fixture

影响执行顺序的因素

1. fixture方法的scope:fixture的使用范围

2. dependencies:可能会存在fixture请求了别的fixture,所以产生了依赖关系

3. autouse:如果多个fixture,其中一个autouse=True,那么这个fixture先执行

执行顺序:

单个fixture,先执行这个fixture,再执行测试用例

多个fixture,就要确定fixture的执行顺序

1. fixture设置了autouse=True,这个autouse的fixture函数会比请求的其他fixture都要先执行。

2. Scope使用范围大的fixture先执行:"session"> "package"> "module"> "class">"function"

3. 相同顺序的fixture基于依赖项执行:当一个fixture函数请另一个fixture函数,另一个会先执行,参考:https://www.cnblogs.com/pingguo-softwaretesting/p/14698711.html

fixture引用方式

1. 一个fixture函数:A  请求另一个fixture:B,另一个B会先执行

2. 为了控制B的fixture先执行,也可以通过autouse设置,将autouse设置成True

3. 第三种方法,给先执行的fixture通过参数化,传入参数,

调用方式

1.  通过将fixture声明为参数来请求fixture,注意fixture名字不能写错

2.  通过pytest.mark.usefixtures,将fixture声明作为参数传入测试用例

!!!pytest收集到测试用例的执行顺序

1.  判断一下当前测试函数,是否有使用参数化,参数化里面有几组的测试数据,有几组的数据,决定了这条测试用例执行多少次

2.  有使用参数化,参数化有两组的数据,分别执行两次的测试用例

3.  测试用例执行前,会先查看该测试函数中的参数,然后搜索与函数名称一样的fixture,找到了这些fixture,先执行fixture,然后回到测试用例,继续执行

运行 》 查找测试用例 》 找到测试用例 》 判断当前有几组参数化数据 》 开始执行 》 查看测试函数中的参数,与conftest中的fixture的名称是否有一样的 》 执行fixture 》 回到测试用例,开始执行测试用例

实际项目:

传入测试用例的数据:

sucess_data_bak = [{"user_id": "${user_id}", "username": "${login_user}", "password": "123", "sku_code": "vivo00100015",

                   "check": "第二个用户登录"},

                   {"user_id": "${user_id}", "username": "${login_user}", "password": "123", "case": "正常登录",

                   "check": "第一个用户登录"}]

  

测试用例

@pytest.mark.usefixtures("open_erp_url")    # 使用fixture方法:open_erp_url

@pytest.mark.usefixtures("preset_users_conditions")  # 使用fixture方法:preset_users_conditions

# 将参数传递给fixtures,命名为test_data,要使用这个参数的fixture的方法,传入的参数名称要和test_data一样

@pytest.mark.parametrize("test_data", login_data.sucess_data)

@pytest.mark.testlogin

# open_erp_url,用到几个fixtures、给fixtures传参:就要传几个fixtures进来测试用例

def test_login(self, open_erp_url, preset_users_conditions, test_data):

    '''
:param open_erp_url: 前置条件打开浏览器,返回driver :param preset_users_conditions: 用户前置条件,包含查询用户的数据,和更新用户的数据 :param sucess_data: 参数化的测试用例的数据 :return: ''' # 调试fixtures的登录方法 data = preset_users_conditions print("开始执行登录成功的前置条件") loginpage(open_erp_url).Login(preset_users_conditions["username"], preset_users_conditions["password"]) time.sleep(2)

  

测试用例使用了参数化

@pytest.mark.parametrize("test_data", login_data.sucess_data),两组数据,测试用例要执行两遍,将这个参数传到了fixture里面,根据参数化,先执行带参数化的fixture

测试用例执行前,查看测试函数中的参数,与conftest中的fixture的名称是否有一样,一样的先执行fixture

@pytest.mark.parametrize("test_data", login_data.sucess_data)

@pytest.mark.testlogin

# open_erp_url,用到几个fixtures、给fixtures传参:就要传几个fixtures进来测试用例

def test_login(self, open_erp_url, preset_users_conditions, test_data):
loginpage(open_erp_url).Login(preset_users_conditions["username"], preset_users_conditions["password"])

@pytest.fixture(scope="function") def preset_users_conditions(test_data): ''' 用户的前置条件,包含传进来的test_case的数据,判断查询什么样的用户登录、以及根据user_id更新用户登录的密码、已经用户的角色,分配给某个角色 :param test_data: test_login.py测试类中测试用例,通过参数化,命名的参数化的数据,名称要和参数名声明的保持一致, 如:@pytest.mark.parametrize("test_data", login_data.sucess_data) :return: ''' # 根据测试用例的数据,判断要查询的是什么用户,用于登录中台 res_data = datamanage.dynamic_replace_data(testdata=test_data) # 更新用户的密码为123 update_user_pwd(res_data["user_id"]) yield res_data

执行完fixture:preset_users_conditions,接着执行open_erp_url

@pytest.fixture(scope="function")

def open_erp_url():

    '''

    执行登录操作前,先做打开浏览器,设置成最大化,然后再做登录操作

    :return:  driver:将当前打开浏览器的driver,传递给后面使用

    '''

    MyLog().info("执行前置方法_open_erp_url,打开浏览器")

    driver = webdriver.Chrome()

    driver.maximize_window()

    MyLog().info("open_erp_url_打开登录页面")

    driver.get(DoInfo.host)   # url登录的地址

    yield driver   # 返回driver给后面的其他操作使用

    driver.quit()  # 后置条件:测试用例执行完毕,关闭浏览器

Fixture执行完毕之后,回到测试用例, 执行测试用例

loginpage(open_erp_url).Login(preset_users_conditions["username"], preset_users_conditions["password"])

pytest用例的执行顺序的更多相关文章

  1. python+unittest 控制用例的执行顺序

    unittest的main()方法执行用例的顺序是按照测试类.测试方法的名字的ASCII顺序来执行测试方法.所以可能执行的顺序和你想要的顺序不一样,可能通过下面两种方法修改执行顺序 1. 通过Test ...

  2. python unittest控制用例的执行顺序

    为什么要进行顺序控制呢?使用过testng的同学就知道,它相对于junit来说有更强大的功能,其中的一个功能就是依赖测试.什么是依赖测试呢?简单的说一下就是,A方法运行时,其中有个变量的取值是B方法的 ...

  3. Pytest_用例执行顺序(5)

    在unittest中,测试用例的执行顺序与测试用例的名称有关,按照名称的ascii码排序的,并不是按照用例的编写顺序执行的. pytest默认是按用例的编写顺序执行的 我们可以通过第三方包 pytes ...

  4. pytest(4)-测试用例执行顺序

    前言 上一篇文章我们讲了在pytest中测试用例的命名规则,那么在pytest中又是以怎样的顺序执行测试用例的呢? 在unittest框架中,默认按照ACSII码的顺序加载测试用例并执行,顺序为:09 ...

  5. pytest--配置用例执行顺序(pytest_ordering插件介绍)

    前言 设置测试用例执行顺序: 默认情况下,pytest测试用例的执行顺序是按先外层后内层(目录下的文 件),再根据名称按ascii码值的顺序升序执行. 如果想自定义pytest测试用例的执行顺序,可以 ...

  6. python nose测试框架全面介绍十二 ----用例执行顺序打乱

    在实际执行自动化测试时,发现我们的用例在使用同一个资源的操作时,用例的执行顺序对测试结果有影响,在手工测试时是完全没法覆盖的. 但每一次都是按用例名字来执行,怎么打乱来执行的. 在网上看到一个有意思的 ...

  7. 【pytest官方文档】解读fixtures - 11. fixture的执行顺序,3要素详解(长文预警)

    当pytest要执行一个测试函数,这个测试函数还请求了fixture函数,那么这时候pytest就要先确定fixture的执行顺序了. 影响因素有三: scope,就是fixture函数的作用范围,比 ...

  8. python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)

    简介 大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行.虽然或许通过代码实现了,也是稀里糊涂的一知 ...

  9. 3.2 unittest执行顺序

    3.2 unittest执行顺序 前言很多初学者在使用unittest框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行.本篇通过最简单案例 ...

随机推荐

  1. SVN的基本介绍\服务器配置

    ### 1. 工作场景 1. 进入公司需要做的关于开发的第一件事, 就是向项目经理索要SVN服务器地址+用户名+密码### 2. 角色解释> 服务器: 用于存放所有版本的代码,供客户端上传下载更 ...

  2. Hadoop生态圈学习-1(理论基础)

    一.大数据技术产生的背景 1. 计算机和信息技术(尤其是移动互联网)的迅猛发展和普及,行业应用系统的规模迅速扩大(用户数量和应用场景,比如facebook.淘宝.微信.银联.12306等),行业应用所 ...

  3. html标签设置contenteditable时,去除粘贴文本自带样式

    在一个div标签里面加了可编辑的属性,从别的地方复制了一串文本,只想把文本内容存到接口里面,结果发现文本自带的标签和样式都会存进去. $(".session-new-name"). ...

  4. Spring Batch Event Listeners

    Learn to create and configure Spring batch's JobExecutionListener (before and after job), StepExecut ...

  5. Android 内存泄漏检测工具 LeakCanary(Kotlin版)的实现原理

    LeakCanary 是一个简单方便的内存泄漏检测框架,做 android 的同学基本都收到过 LeakCanary 检测出来的内存泄漏.目前 LeakCanary 最新版本为 2.7 版本,并且采用 ...

  6. 【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决

    前言:随着.Net6的发布,Minimal API成了当下受人追捧的角儿.而这之前,程序之间通信效率的王者也许可以算得上是gRPC了.那么以下咱们先通过开发一个gRPC服务的教程,然后顺势而为,再接着 ...

  7. Redis集群环境各节点无法互相发现与Hash槽分配异常 CLUSTERDOWN Hash slot not served的解决方式

    总结/朱季谦 在搭建Redis5.x版本的集群环境曾出现各节点无法互相发现与Hash槽分配异常 CLUSTERDOWN Hash slot not served的情况,故而把解决方式记录下来. 在以下 ...

  8. .NET静态代码织入——肉夹馍(Rougamo)

    肉夹馍是什么 肉夹馍通过静态代码织入方式实现AOP的组件..NET常用的AOP有Castle DynamicProxy.AspectCore等,以上两种AOP组件都是通过运行时生成一个代理类执行AOP ...

  9. C语言之字符串替换库函数replace

    头文件 #include <algorithm> 例子 下面的代码, 将字符串中的 /替换为\ std::string str("C:/demo/log/head/send&qu ...

  10. 【LeetCode】875. Koko Eating Bananas 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 日期 题目地址:https://leetc ...