pytest-13-其他

作者: 恶毒女配的日常 | 来源:发表于2020-12-10 13:09 被阅读0次

    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测试类

    相关文章

      网友评论

        本文标题:pytest-13-其他

        本文链接:https://www.haomeiwen.com/subject/lnizwktx.html