pytest用例的执行顺序
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用例的执行顺序的更多相关文章
- python+unittest 控制用例的执行顺序
unittest的main()方法执行用例的顺序是按照测试类.测试方法的名字的ASCII顺序来执行测试方法.所以可能执行的顺序和你想要的顺序不一样,可能通过下面两种方法修改执行顺序 1. 通过Test ...
- python unittest控制用例的执行顺序
为什么要进行顺序控制呢?使用过testng的同学就知道,它相对于junit来说有更强大的功能,其中的一个功能就是依赖测试.什么是依赖测试呢?简单的说一下就是,A方法运行时,其中有个变量的取值是B方法的 ...
- Pytest_用例执行顺序(5)
在unittest中,测试用例的执行顺序与测试用例的名称有关,按照名称的ascii码排序的,并不是按照用例的编写顺序执行的. pytest默认是按用例的编写顺序执行的 我们可以通过第三方包 pytes ...
- pytest(4)-测试用例执行顺序
前言 上一篇文章我们讲了在pytest中测试用例的命名规则,那么在pytest中又是以怎样的顺序执行测试用例的呢? 在unittest框架中,默认按照ACSII码的顺序加载测试用例并执行,顺序为:09 ...
- pytest--配置用例执行顺序(pytest_ordering插件介绍)
前言 设置测试用例执行顺序: 默认情况下,pytest测试用例的执行顺序是按先外层后内层(目录下的文 件),再根据名称按ascii码值的顺序升序执行. 如果想自定义pytest测试用例的执行顺序,可以 ...
- python nose测试框架全面介绍十二 ----用例执行顺序打乱
在实际执行自动化测试时,发现我们的用例在使用同一个资源的操作时,用例的执行顺序对测试结果有影响,在手工测试时是完全没法覆盖的. 但每一次都是按用例名字来执行,怎么打乱来执行的. 在网上看到一个有意思的 ...
- 【pytest官方文档】解读fixtures - 11. fixture的执行顺序,3要素详解(长文预警)
当pytest要执行一个测试函数,这个测试函数还请求了fixture函数,那么这时候pytest就要先确定fixture的执行顺序了. 影响因素有三: scope,就是fixture函数的作用范围,比 ...
- python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)
简介 大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行.虽然或许通过代码实现了,也是稀里糊涂的一知 ...
- 3.2 unittest执行顺序
3.2 unittest执行顺序 前言很多初学者在使用unittest框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行.本篇通过最简单案例 ...
随机推荐
- 【C/C++】链表/ListNode/数据结构
vector的操作 添加元素: 向尾部添加一个元素 vector<int> a; a.push_back(1); 向尾部添加多个元素 -向尾部添加x个同样的元素: a.insert(a.e ...
- 使用匿名内部类和lamda的方式创建线程
1.匿名内部类的方式 1 /** 2 *匿名内部类的方式启动线程 3 */ 4 public class T2 { 5 public static void main(String[] args) { ...
- Docker从入门到精通(一)——初识
1.Docker 是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容 ...
- 【简】题解 P5283 [十二省联考2019]异或粽子
传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制 ...
- mobile app 与server通信的四种方式
Have you ever wondered how the information gets into the application installed in your mobile device ...
- 位置式PID讲解
table { margin: auto } 一.公式拆解 \(PID\)公式展示: \[u(t)=K_p(e(t)+\frac{1}{T_t } ∫_0^te(t)dt+T_D \frac {de( ...
- 显示摘要任务(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 用熬肥的同学都知道,在熬肥的[文件]>[选项]设置中,[高级]才是最多选项设置的地方: 张同学亦如是说. 比如一个比 ...
- java 编程基础 反射方式获取泛型的类型Fileld.getGenericType() 或Method.getGenericParameterTypes(); (ParameterizedType) ;getActualTypeArguments()
引言 自从JDK5以后,Java Class类增加了泛型功能,从而允许使用泛型来限制Class类,例如,String.class的类型实际上是 Class 如果 Class 对应的类暂时未知,则使 C ...
- java 图形化小工具Abstract Window Toolit ;布局管理器FlowLayout流式布局;BorderLayout边界布局;GridLayout网格布局;CardLayou重叠卡片布局;BoxLayout方框布局;绝对定位
1.FlowLayout流式布局管理器: FlowLayout布局管理器中,组件像水流一样向某方向流动(排列),遇到障碍(边界)就折回,重头开始排列 .在默认情况下,FlowLayout局管理器从左向 ...
- Android 控件使用教程(三)—— NineGridImageView 九宫格展示图片
引子 上文降到RecyclerView的使用,确实非常方便易用,而且样式多样,很灵活.但在图像展示时,经常有朋友圈和微博等9张图以内的图片展示需求,这时候,不是一个可以无限下滑的RecyclerVew ...