pytest多文件执行顺序控制详解

1.只有一个py文件

1.使用pytest做接口测试,如果测试case只存在于单个.py文件,那么测试case默认从上到下执行,如果使用了pytest-order插件

2.如果存在多个py文件

1.使用pytest做接口测试,如果测试case存在于多个.py文件中,那么默认是按照文件名的ascii码顺序执行,进入文件后,默认按照从上到下顺序执行每个单元测试接口。

test_user.py  # 用户相关
    class TestUser:
        def test_user_create:
        def test_user_login:
        def test_user_delete

test_order.py  # 订单相关
    class TestOrder:
        def test_order_create:
        def test_order_list:
        def test_order_delete

test_stock.py  # 库存相关
    class TestStock:
        def test_stock_add:
        def test_stock_list:
        def test_stock_reduce

1.按照文件名ascii排序:test_order > test_stock > test_user

2.test_order_create > test_order_list > test_order_delete > test_stock_add > test_stock_list > …

2.如果单个.py测试文件中使用了pytest-order插件,那么该文件中添加了order的测试用例将会最先执行,没添加的将会按照1的顺序执行,这样就会出现单元测试的顺序在多文件中交叉执行的现象。(所以单个.py文件在使用pytest-order插件的情况下,建议每个case都带上order=x,且x不要相同)

test_user.py  # 用户相关
    class TestUser:
        @pytest.mark.run(order=1)
        def test_user_create:
        def test_user_login:
        @pytest.mark.run(order=2)
        def test_user_delete

test_order.py  # 订单相关
    class TestOrder:
        def test_order_create:
        def test_order_list:
        def test_order_delete

test_stock.py  # 库存相关
    class TestStock:
        def test_stock_add:
        def test_stock_list:
        def test_stock_reduce

1.由于 test_user 文件中的 case 使用了 pytest-order 插件,所以优先执行使用了order排序的 case

2.test_user_create > test_user_delete> test_order_create> … > test_stock_add > … > test_user_delete

3.如果多个.py文件使用了pytest-order插件,如果每个order指定的顺序不冲突,就按照order指定的顺序执行,如果有冲突,那就会出现在多个.py文件中交叉执行,可能不符合我们预期。

test_user.py  # 用户相关
    class TestUser:
        @pytest.mark.run(order=1)
        def test_user_create:
        def test_user_login:
        @pytest.mark.run(order=2)
        def test_user_delete

test_order.py  # 订单相关
    class TestOrder:
        def test_order_create:
        def test_order_list:
        def test_order_delete

test_stock.py  # 库存相关
    class TestStock:
        @pytest.mark.run(order=1)
        def test_stock_add:
        @pytest.mark.run(order=2)
        def test_stock_list:
        def test_stock_reduce

1.test_stock 和 test_user 存在 order 冲突,所以按照文件名ascii顺序排序

2.test_stock_add > test_user_create > test_stock_list > test_user_delete > order相关 > test_stock_reduce > test_user_login

4.多个py文件修改按照文件名ascii码排序方式

需求:不要再多个文件中来回执行case,保证测试用例顺序为:用户模块-->订单模块-->库存模块

方式一:通过修改文件名,使得文件名ascii码排序,和我们测试case执行顺序一致,确保case中没有pytest-order插件

test_1_user.py  # 用户相关
    class TestUser:
        def test_user_create:
        def test_user_login:
        def test_user_delete

test_2_order.py  # 订单相关
    class TestOrder:
        def test_order_create:
        def test_order_list:
        def test_order_delete

test_3_stock.py  # 库存相关
    class TestStock:
        def test_stock_add:
        def test_stock_list:
        def test_stock_reduce

但通常情况下,我们.py文件是根据模块去命名的,所以通过修改文件名实现我们预期的执行顺序,并不是很友好

方式二:如果使用pytest-order插件来控制,必须保证每个文件的order值是不能重复的,后一个.py文件order最小值必须大于前一个.py文件最大值,这样就可以确保文件执行顺序

这样在增加测试用例后,就可能需要修改很多order顺序

test_user.py  # 用户相关
    class TestUser:
        @pytest.mark.run(order=1)
        def test_user_create:
        @pytest.mark.run(order=3)
        def test_user_login:
        @pytest.mark.run(order=2)
        def test_user_delete

test_order.py  # 订单相关
    class TestOrder:
        @pytest.mark.run(order=4)
        def test_order_create:
        @pytest.mark.run(order=5)
        def test_order_list:
        @pytest.mark.run(order=6)
        def test_order_delete

test_stock.py  # 库存相关
    class TestStock:
        @pytest.mark.run(order=7)
        def test_stock_add:
        @pytest.mark.run(order=8)
        def test_stock_list:
        @pytest.mark.run(order=9)
        def test_stock_reduce

方式三:通过pytest提供的勾子方法pytest_collection_modifyitems,对case执行顺序进行修改

# conftest.py

def pytest_collection_modifyitems(config, items)
    # 期望用例顺序按照.py文件执行
    appoint_classes = {"TestUser": [], "TestOrder": [], "TestStock": []}

    for item in items:
        for cls_name in appoint_classes:
            if item.parent.name == cls_name:
                appoint_classes[cls_name].append(item)
    items.clear()
    for cases in appoint_classes.values():
        items.extend(cases)

用户只需要将其新增的测试模块class按照预期的顺序添加到appoint_classes中即可,简单灵活

总结

到此这篇关于pytest多文件执行顺序控制的文章就介绍到这了,更多相关pytest多文件执行顺序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Pytest自定义用例执行顺序(推荐)

    Unittest用例执行顺序 unittest框架和pytest框架编写的测试用例执行顺序,默认根据ACSII码的顺序加载测试用例,数字与字母的顺序为:09,AZ,a~z. 1.对于类来说,class TestAxx 会优先于class TestBxx被执行. 2.对于方法来说,test_aaa()方法会有优先于test_bbb()被执行. 对于测试目录与测试文件来说,unittest同样是按照这个规则来加载测试用例的. 背景: 我们写接口测试用例的时候,可以按上下接口顺序给它命名test_01

  • pytest多文件执行顺序控制详解

    1.只有一个py文件 1.使用pytest做接口测试,如果测试case只存在于单个.py文件,那么测试case默认从上到下执行,如果使用了pytest-order插件 2.如果存在多个py文件 1.使用pytest做接口测试,如果测试case存在于多个.py文件中,那么默认是按照文件名的ascii码顺序执行,进入文件后,默认按照从上到下顺序执行每个单元测试接口. test_user.py # 用户相关 class TestUser: def test_user_create: def test_

  • Pytest框架 conftest.py文件的使用详解

    目录 conftest.py文件特点 1.conftest.py文件介绍 2.conftest.py的注意事项 3.conftest.py的使用 4.不同位置conftest.py文件的优先级 5.conftest.py中Fixture(夹具)的作用域 6.总结: conftest.py文件特点 所有同目录测试文件运行前都会执行conftest.py文件 不需要import导入 conftest.py,pytest用例会自动识别该文件,放到项目的根目录下就可以全局目录调用了,如果放到某个pack

  • Python测试框架pytest高阶用法全面详解

    目录 前言 1.pytest安装 1.1安装 1.2验证安装 1.3pytest文档 1.4 Pytest运行方式 1.5 Pytest Exit Code 含义清单 1.6 如何获取帮助信息 1.7 控制测试用例执行 1.8 多进程运行cases 1.9 重试运行cases 1.10 显示print内容 2.Pytest的setup和teardown函数 函数级别setup()/teardown() 类级别 3.Pytest配置文件 4 Pytest常用插件 4.1 前置条件: 4.2 Pyt

  • Pytest fixture及conftest相关详解

    目录 前言 一.Pytest fixture 1.pytest fixture几个关键特性 2.Pytest fixture定义 3.Pytest fixture用法 1)用法一:作为参数使用 2)用法二:提供灵活的类似setup和teardown功能 3)用法三:利用pytest.mark.usefixtures叠加调用多个fixture 4)用法四:fixture自动使用autouse=True 4.Pytest fixture四种作用域 1)function级别 2)class级别 3)m

  • Python 文件操作的详解及实例

    Python 文件操作的详解及实例 一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧明. 白首为功名,旧山松竹老,阻归程. 欲将心事付瑶琴. 知音少,弦断有谁听. f = open('小重山') #打开文件 data=f.read()#获取文件内容 f.close() #关闭文件 注意:if in the win,hello文件是utf8保存的,打

  • Python中__init__.py文件的作用详解

    __init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件. 通常__init__.py 文件为空,但是我们还可以为它增加其他的功能.我们在导入一个包时,实际上是导入了它的__init__.py文件.这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入. # package # __init__.py import re import urllib import sys impo

  • Python中使用pypdf2合并、分割、加密pdf文件的代码详解

    朋友需要对一个pdf文件进行分割,在网上查了查发现这个pypdf2可以完成这些操作,所以就研究了下这个库,并做一些记录.首先pypdf2是python3版本的,在之前的2版本有一个对应pypdf库. 可以使用pip直接安装: pip install pypdf2 官方文档: pythonhosted.org/PyPDF2/ 里面主要有这几个类: PdfFileReader . 该类主要提供了对pdf文件的读操作,其构造方法为: PdfFileReader(stream, strict=True,

  • 对Python的交互模式和直接运行.py文件的区别详解

    看到类似C:\>是在Windows提供的命令行模式,看到>>>是在Python交互式环境下. 在命令行模式下,可以执行python进入Python交互式环境,也可以执行python hello.py运行一个.py文件,但是在Python交互 式环境下,只能输入Python代码执行. Python的交互模式和直接运行.py文件有什么区别呢? 直接输入python进入交互模式,相当于启动了Python解释器,但是等待你一行一行地输入源代码,每输入一行就执行一行. 直接运行.py文件相当

  • 用python标准库difflib比较两份文件的异同详解

    [需求背景] 有时候我们要对比两份配置文件是不是一样,或者比较两个文本是否异样,可以使用linux命令行工具diff a_file b_file,但是输出的结果读起来不是很友好.这时候使用python的标准库difflib就能满足我们的需求. 下面这个脚本使用了difflib和argparse,argparse用于解析我们给此脚本传入的两个参数(即两份待比较的文件),由difflib执行比较,比较的结果放到了一个html里面,只要找个浏览器打开此html文件,就能直观地看到比较结果,两份文件有差

  • 对Python3 pyc 文件的使用详解

    什么是pyc文件 pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念.pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的python是无法执行的. 为什么需要pyc文件 这个需求太明显了,因为py文件是可以直接看到源码的,如果你是开发商业软

随机推荐