目录
1.4 --maxfail=num 第1(N)次失败后停止测试
2.3 通过pytest.mark.xfail 标记用例失败
3.3 pytest是按照fixture的名称搜索fixture。
3.5 生效范围:在测试类/测试模块/测试会话中共享fixture对象#
2.使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例
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 用例失败重跑
用例失败重跑的方法:
-
在用例上添加装饰器@pytest.mark.flaky(reruns=2, reruns_delay=4) reruns为次数,reruns_delay间隔时间,单位s(对部分用例生效)
-
在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
方法):<