1、fixture之autouse=True
调用fixture三种方法
1)函数或类里面方法直接传fixture的函数参数名称
2)使用装饰器@pytest.mark.usefixtures()修饰
3)autouse=True自动使用(autouse,默认是Fasle没开启的)
2、配置文件pytest.ini
pytest里面有些文件是非test文件:
pytest.ini pytest的主配置文件,可以改变pytest的默认行为
conftest.py 测试用例的一些fixture配置
__init__.py 识别该文件夹为python的package包
tox.ini 与pytest.ini类似,用tox工具时候才有用
setup.cfg 也是ini格式文件,影响setup.py的行为
ini文件基本格式:
# 保存为pytest.ini文件
[pytest]
addopts = -rsxX
xfail_strict = true
--rsxX 表示pytest报告所有测试用例被跳过、预计失败、预计失败但实际被通过的原因
多个标签写入ini文件内:
markers =
webtest: Run the webtest case
hello: Run the hello case
标记好之后,可以使用pytest --markers查看到
禁用xpass
设置xfail_strict = true可以让那些标记为@pytest.mark.xfail但实际通过的测试用例被报告为失败
addopts:
addopts参数可以更改默认命令行选项,这个当我们在cmd输入指令去执行用例的时候,会用到,比如我想测试完生成报告,指令比较长
pytest -v --rerun 1 --html=./report/report.html --self-contained-html
3、doctest测试框架
文档测试:是单元测试的一种
doctest测试用例可以放在两个地方:
1)函数或者方法下的注释里面
2)模块的开头
import doctest
doctest.testmod(verbose=True)
verbose参数,设置为True则在执行测试的时候会输出详细信息
执行命令:python -m doctest -v xxx.py
m 参数指定运行方式doctest
-v参数是verbose,带上-v参数相当于verbose=True
pytest框架运行:
pytest -v --doctest-modules xxx.py
doctest独立文件
doctest内容也可以和代码抽离开,单独用一个.txt文件保存
在当前xxx.py同一目录新建一个xxx.txt文件,写入测试的文档,要先导入该功能,导入代码前面也要加>>>
cmd执行“python -m doctest -v xxx.txt”测试结果
fixture的目的是提供一个固定基线,在该基线上测试可以可靠地和重复地执行。fixture提供了区别于传统单元测试(setup/teardown)有显著改进:
(1)有独立的命名,并通过声明它们从测试函数、模块、类或整个项目中的使用来激活。
(2)按模块化的方式实现,每个fixture都可以互相调用。
(3)fixture的范围从简单的单元扩展到复杂的功能测试,允许根据配置和组件选项对fixture和测试用例进行参数化,或者跨函数 function、类class、模块module或整个测试会话sessio范围。
定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要用test_开头,跟用例区分开。用例才是test_开头的命名。
fixture是可以有返回值的,如果没return默认返回None。用例调用fixture的返回值,直接就是把fixture的函数名称当成变量名称
error和failed区别
测试结果一般有三种:passed、failed、error。(skip的用例除外)
如果在test_用例里面断言失败,那就是failed
如果在fixture里面断言失败了,那就是error (代码错误也是error)
4、使用多个fixture和fixture直接互相调用
如果用例需要用到多个fixture的返回数据,fixture也可以return一个元组、list或字典,然后从里面取出对应数据;也可以分开定义成多个fixture,然后test_用例传多个fixture参数。
5、fixture的作用范围
scope参数可以控制fixture的作用范围:session > module > class > function(默认)
unction 每一个函数或方法都会调用
class 每一个类调用一次,一个类可以有多个方法
module,每一个.py文件调用一次,该文件内又有多个function和class
session 是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
6、pytest-html报告优化
(nodeid中文显示[\u6350\u52a9\u6211\u4eec]问题解决)
字符串变量.encode("utf-8").decode("unicode_escape")
7、conftest.py作用范围
一个测试工程下是可以有多个conftest.py的文件,一般在工程根目录放一个conftest.py起到全局作用。
在不同的测试子目录也可以放conftest.py,作用范围只在该层级以及以下目录生效。
8、运行上次失败用例(--lf和--ff)
命令行输入pytest -h,找到里面两个命令行参数: --lf 和 --ff
--lf, --last-failed 只重新运行上次运行失败的用例(或如果没有失败的话会全部跑)
--ff, --failed-first 运行所有测试,但首先运行上次运行失败的测试(这可能会重新测试,从而导致重复的fixture setup/teardown)
9、pytest分布式执行(pytest-xdist)
cmd里面使用pip安装分布式执行插件pytest-xdist:pip install pytest-xdist
pytest-xdist插件扩展了一些独特的测试执行模式pytest:
测试运行并行化:如果有多个CPU或主机,则可以将它们用于组合测试运行。会加快运行速度
--looponfail:在子进程中重复运行测试。每次运行之后,pytest会等待,直到项目中的文件发生更改,然后重新运行以前失败的测试。
重复此过程直到所有测试通过,之后再次执行完整运行。
多平台覆盖:您可以指定不同的Python解释器或不同的平台,并在所有平台上并行运行测试。
在远程运行测试之前,pytest有效地将您的程序源代码“rsyncs”到远程位置。报告所有测试结果并显示给您的本地终端。您可以指定不同的Python版本和解释器。
如果您想知道pytest-xdist如何在幕后工作,可以看
https://github.com/pytest-dev/pytest-xdist/blob/master/OVERVIEW.md
并行测试
多cpu并行执行用例,直接加个-n参数即可,后面num参数就是并行数量,比如num设置为3:pytest -n 3
用pytest-xdist插件生成html报告:pytest -n 3 --html=report.html --self-contained-html
10、重复执行用例(pytest-repeat)
使用pip安装pytest-repeat:pip install pytest-repeat
使用--count命令行选项指定要运行测试用例和测试次数:py.test --count=10 test_file.py
--repeat-scope
--repeat-scope类似于pytest fixture的scope参数,--repeat-scope也可以设置参数: session , module,class或者function(默认值)
function(默认)范围针对每个用例重复执行,再执行下一个用例
class 以class为用例集合单位,重复执行class里面的用例,再执行下一个
module 以模块为单位,重复执行模块里面的用例,再执行下一个
session 重复整个测试会话,即所有收集的测试执行一次,然后所有这些测试再次执行等等
使用--repeat-scope=session重复执行整个会话用例
pytest baidu/test_1_baidu.py -s --count=5 --repeat-scope=session
@pytest.mark.repeat(count)
如果要在代码中标记要重复多次的测试,可以使用@pytest.mark.repeat(count)装饰器
强制测试运行器在第一次失败时停止:py.test --count=1000 -x test_file.py
pytest-repeat无法使用unittest.TestCase测试类