pytest——02 调用/断言/fixture

本文详细介绍了pytest的使用,包括运行参数、断言方法和fixture的深入应用。讲解了如何通过-k和-m选项筛选运行测试用例,使用pytest.raises进行异常断言,利用pytest.mark.xfail标记预期失败的测试。还探讨了fixture的创建、作用范围和参数化,展示了conftest.py文件的使用以及如何通过scope参数控制fixture的生命周期。
摘要由CSDN通过智能技术生成

目录

 

0、pytest 编码规则

一、pytest运行参数

1.1 可能出现的执行退出code

1.2 获取版本路径、命令行选项及环境变量相关帮助

1.3 pytest 测试用例的运行方式

1.3.1 -k 按关键字表达式运行用例

1.3.2 -m  运行有mark标识的测试用例

1.4 --maxfail=num 第1(N)次失败后停止测试

1.5 指定及选择测试用例

1.6 按节点id运行测试

1.7 修改Python原生追溯(traceback)信息

1.8 详尽的测试结果摘要

1.9 显示命令

二、断言的编写和报告

 2.1 使用assert语句进行断言

 2.2 异常断言pytest.raise()

2.3 通过pytest.mark.xfail 标记用例失败

2.4 自定义断言对比信息

三、Pytest fixtures 使用

3.1 Fixtures作为函数参数使用

3.2 Fixtures: 依赖注入的主要例子

3.3 pytest是按照fixture的名称搜索fixture。

3.4conftest.py使用

3.5 生效范围:在测试类/测试模块/测试会话中共享fixture对象#

3.6 fixture的作用范围

3.7 调用fixture的三种方法

1.函数或类里面方法直接传fixture的函数参数名称

2.使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例

3.叠加fixture

usefixtures与传fixture区别

fixture() 参数化

为一个参数的fixture参数化

为多个参数的fixture参数化

fixture的参数:ids。为每一组参数打上标识


0、pytest 编码规则

 

pytest可以在不同的函数、包中发现用例,发现的规则如下

  • 文件名以test_开头的py文件
  • 以test_开头的函数
  • 以Test开头的类
  • 以test_开头的方法(与2类似)
  • Test类不能有__init__()
  • 要注意的是所有的包必须要有init.py文件(在使用各种编辑器时会自动生成)

一、pytest运行参数

1.1 可能出现的执行退出code

执行pytest可能会出现6中不同的退出code:

  • 退出code 0: 收集并成功通过所有测试用例
  • 退出code 1: 收集并运行了测试,部分测试用例执行失败
  • 退出code 2: 测试执行被用户中断
  • 退出code 3: 执行测试中发生内部错误
  • 退出code 4: pytest命令行使用错误
  • 退出code 5: 没有收集到测试用例

1.2 获取版本路径、命令行选项及环境变量相关帮助

pytest --version   # 显示pytest导入位置
pytest --fixtures  # 显示可用的内置方法参数
pytest -h --help # 显示命令行及配置文件选项帮助信息

1.3 pytest 测试用例的运行方式

1.3.1 -k 按关键字表达式运行用例

pytest -k "MyClass and not method"

这将运行包含与指定表达式匹配的名称的测试用例,其中可以包括文件名、类名和函数名作为变量,并且支持Python运算符(and和or)操作。上面的示例将运行TestMyClass.test_something但不运行TestMyClass.test_method_simple

可以使用-k命令行选项指定在匹配用例名称的表达式

$ pytest -v -k http

您也可以运行所有的测试,根据用例名称排除掉某些用例:

$ pytest -k "not send_http" -v

也可以同时选择匹配 “http” 和“quick”

$ pytest -k "http or quick" -v

1.3.2 -m  运行有mark标识的测试用例

teste_two使用了@pytest.mark.slow来修饰

在使用时,使用如下参数

pytest –m slow test.py

只运行了一个我们带有标识的用例。

注意,-m后面不能带''号(单引号),只能带“”(双引号),不然识别不到

如果要运行多个标识的话,用表达式,如下

pytest -m "slow or faster"   运行有slow标识或 faster标识用例
pytest -m "slow and faster"  运行有slow和faster标识的用例
pytest -m "slow and not faster"  运行有slow和没有faster标识的用例

1.4 --maxfail=num 第1(N)次失败后停止测试

pytest -x            # 第1次失败后停止
pytest --maxfail=2    # 2次失败后停止

1.5 指定及选择测试用例

Pytest支持多种从命令行运行和选择测试用例的方法。
运行模块内所有用例

pytest test_mod.py

运行目录内所有用例

pytest testing/

1.6 按节点id运行测试

每次执行收集到的测试用例集合都会被分配一个唯一的nodeid,其中包含模块文件名,后跟说明符,如类名、函数名及参数,由:: 字符分隔。

执行模块中某条指定的测试用

pytest test_mod.py::test_func

另一个通过命令行挑选所执行测试用例的示例如:

pytest test_mod.py::TestClass::test_method

通过标记(Mark)表达式运行测试

pytest -m slow

这将会执行所有带@pytest.mark.slow装饰器的用例。

1.7 修改Python原生追溯(traceback)信息

pytest --showlocals # 在追溯信息中显示局部变量 pytest -l # 显示局部变量 (简写) pytest --tb=auto # (默认) 第1和最后1条使用详细追溯信息,其他使用简短追溯信息 pytest --tb=long # 详尽,信息丰富的追溯信息格式 pytest --tb=short # 简短的追溯信息格式 pytest --tb=line # 每个失败信息一行 pytest --tb=native # Python标准库格式 pytest --tb=no # 不使用追溯信息

1.8 详尽的测试结果摘要

 -r标志可用于在测试会话结束时显示测试结果摘要,从而可以在拥有大量用例的测试套件中轻松获得所有失败、跳过、标记失败(xfails)等测试结果的清晰描述。

-r选项接受后面的多个字符,上面使用的a表示“除了执行通过(Pass)以外所有的结果”。
以下是可以使用的可用字符的完整列表:

-f - 失败的用例
-E - 出错的用例
-s - 跳过的用例
-x - 标记失败的用例
-X - 标记成功的用例
-p - 成功用例
-P - 成功用例并输出信息
-a - 所有pP状态以外的用例

1.9 显示命令

1.9.1、 -v, --verbose
详细结果

1.9.2、-q, --quiet
 极简结果显示,简化控制台的输出,可以看出输出信息和之前不添加-q不信息不一样, 下图中有两个..点代替了pass结果

1.9.3、-s
输入我们用例中的调式信息,比如print的打印信息等,我们在用例中加上一句 print(driver.title),我们再运行一下我们的用例看看,调试信息输出

1.9.4、-V
可以输出用例更加详细的执行信息,比如用例所在的文件及用例名称等

1.9.5、--junit-xml=path
输出xml文件格式,在与jenkins做集成时使用

1.9.6、 --result-log=path
将最后的结果保存到本地文件中

1.9.7    --html

1.10 用例失败重跑

用例失败重跑的方法:

  1. 在用例上添加装饰器@pytest.mark.flaky(reruns=2, reruns_delay=4)  reruns为次数,reruns_delay间隔时间,单位s(对部分用例生效)

  2. 在pytest.ini文件中addopts = 添加参数–reruns n (n:为重试的次数)(对所有用例生效)

方法一:单个用例失败重跑

方法二:所有用例失败重跑

二、断言的编写和报告

 2.1 使用assert语句进行断言

# test_assert1.py文件内容
def f():
    return 3

def test_function():
    assert f() == 4

 2.2 异常断言pytest.raise()

 你可以像如下所示,使用pytest.raises作为上下文管理器来进行异常断言:

import pytest

def test_zero_division():
    with pytest.raises(ZeroDivisionError):
        1 / 0

如果需要访问实际的异常信息,你可以使用:

def test_recursion_depth():
    with pytest.raises(RuntimeError) as excinfo:
        def f():
            f()
        f()
    assert 'maximum recursion' in str(excinfo.value)

excinfo是一个ExceptionInfo实例,它是实际异常的装饰器。 其主要属性有.type,.value.traceback三种

在上下文管理器中,你可以使用参数message来指定自定义失败信息:

>>> with raises(ZeroDivisionError,message="Expecting ZeroDivisionError"):
...    pass
... Failed: Expecting ZeroDivisionError

2.3 通过pytest.mark.xfail 标记用例失败

@pytest.mark.xfail(raises=IndexError)
def test_f():
    f()

对于你在代码中故意设置的异常,使用pytest.raises断言更加好用,而将@ pytest.mark.xfail与check函数一起使用对于已知未修复或依赖中的bug会更好。

此外,上下文管理器表单接受match关键字参数来测试正则表达式匹配中的异常(如unittest中的TestCase.assertRaisesRegexp方法):<

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值