Python Pytest

发布于:2025-06-08 ⋅ 阅读:(18) ⋅ 点赞:(0)

1.Pytest用例发现规则

1.1 模块名(python文件)名必须以 test_ 开头 _test 结尾,如 test_case,case_test,下划线都不能少

1.2 模块不能放在 . 开头的隐藏目录或者叫 venv的目录下,virtual environment,叫venv1都可以,就是不能叫venv

1.3 测试类类名必须以Test开头,并且不能带有init方法

1.4 测试类中的测试方法必须以 test 开头,必须是小写,建议使用 test_。

1.5 普通函数也必须以 test 开头,建议使用 test_

1.6 除了类方法的self参数,测试用例函数不能有参数,不能有返回值(8.4新增)

1.7 必须为可调用的(函数,方法,类,对象)

2.配置Pytest框架

2.1 通过 pytest.ini 文件

2.2 添加参数

        在终端使用 pytest -h 可以查看全部参数,其中 以下划线开头的是参数、以小写字母开头的是ini配置、全是大写的是环境

3.标记mark

       作用:让用例与众不同,进而可以实现对单个用例的特殊处理

3.1 内置标记

        包括skip,skipif,xfail,parameterize,usefixtures,fixture

3.1.1 skip

        同unittest.skip,无条件跳过用例的执行

3.1.2 skipif

        条件跳过,如果满足条件就跳过

3.1.3 xfail

        意料之内的失败,相当于取反,断言是错误的才能通过.

3.1.4 parameterize

        参数化,和unittest.parameterized类似

        

3.2 用户自定义标记

        只能实现用例的筛选。使用步骤为:1.注册、2.标记、3.筛选

更正:上图makers改为markers

4.fixure

4.1 fixture基本定义语法

使用 @pytest.fixture() 定义一个夹具函数,函数中使用 yield 分隔前置操作和后置操作,一个夹具中只能有一个 yield。
使用时在把夹具函数名作为用例的参数或者使用 @pytest.usefixtures(夹具函数名) 使用夹具

4.2 fixture参数

我们看到上面的fixture函数在每次用例执行前/后都要执行,但是有些操作我们想让所有用例只执行一次,或者用例太多,不想一个一个加参数,想让夹具直接覆盖所有用例的时候,我们就需要修改创建fixture时的默认参数

4.3 fixture返回值

跟在 yield 后的表达式会作为fixture的返回值

4.3 依赖(嵌套)fixture

一个fixture可以被另一个fixture使用,只要在参数中加上另一个fixture的名字即可

4.4 fixture跨文件使用

fixture默认不能跨文件使用:

首先需要满足scope不为默认的function,其余值都可以,然后需要新建 `conftest.py`或者将模块名改为conftest.py,然后将fixture放在其中,就能实现跨文件使用fixture。

5. 插件

插件分为两类:不需要安装的内置插件和需要安装的第三方插件。

5.1 常用插件(都是python包)

5.1.1 pytest-html

        作用:生成html报告,类似于unittest中的 htmltestreport 

        使用方法(命令行参数):

或者使用配置文件

然后直接 pytest 文件名或者执行pytest.main() 都会生成测试报告。

5.1.2 pytest-xdist

        作用:分布式执行,把测试用例任务分成n个进程同时执行,在用例自身需要花费很多时间的时候推荐使用。但是并发执行存在乱序和竞争资源的问题,不能在存在依赖关系和顺序的情况中使用。

        命令:pytest -n 进程数

def test1():
    print('test1', )
    sleep(5)

def test2():
    print('test2')
    sleep(5)

如果我想要执行这两个用例,在不使用 xdist的情况下至少需要10s,如果使用了xdist,那么时间会被缩短,大概是 总时间/进程数 + 进程启动调度时间,所以这里使用xdist花费时间大概为6s。

这里因为我只有两个用例但是分配了三个进程,导致有一个进程被浪费了,以此看出用例数和进程数不用一一对应,超过的进程会被浪费。

5.1.3 pytest -rerunfailures

        作用:在用例执行失败后重新执行,一般用在网络较差的情况下

        命令:--reruns 重新执行次数 --reruns-delay 秒数

5.1.4 pytest-result-log

        作用:用日志文件记录用例运行结果

        用法:配置在 ini文件中。

5.1.5 allure-pytest

        作用:生成企业级的测试报告

        命令:

此命令只能生成对应的JSON文件,并不能生成HTML文件,要想生成HTML文件需要使用:

allure generate -o report -c temps

装饰器

        作用:对用例分层次管理,类似于文件夹或者树,使用相同装饰器的用例放在同一目录下

        @allure.epic()项目      @allure.feature()模块   @allure.story()功能    @allure.title()用例