Pytest调用和使用

文章目录

        • 从命令行通过python解释器调用测试
        • 退出代码
        • 获取有关版本,选项名称,环境变量的帮助
        • 在第一次或n次失败后停止
        • 指定测试/选择测试
        • 修改python回溯打印
        • 详细的总结汇报
        • 在失败时丢弃到pdb(python调试器)
        • 在测试开始时删除pdb
        • 设置断点
        • 使用内置断点功能
        • 分析测试执行持续时间
        • 创建JUint xml格式文件
        • 创建结果日志格式文件
        • 将测试报告发送到在线的pastebin服务
        • 禁用插件
        • 从python代码中调用pytest

从命令行通过python解释器调用测试

python -m pytest […]
等同于直接调用命令行脚本pytest […] ,除了通过python调用也将当前目录添加到sys.path

退出代码

退出代码0:收集并成功通过所有测试
退出代码1:手机并运行测试但是有一些测试失败了
退出代码2:用户中断了测试执行
退出代码3:执行测试时发生内部错误
退出代码4:pytest命令行使用错误
退出代码5:没有收集任何测试

获取有关版本,选项名称,环境变量的帮助

pytest --version #显示从哪里导入pytest
pytest --fixtures #显示可用的内置函数参数
pytest -h #显示命令行和配置文件的帮助

在第一次或n次失败后停止

pytest -x #在第一次失败后退出
pytest --maxfail=2 #在第二次失败后退出

指定测试/选择测试

  • 在模块内运行测试
    pytest test_mod.py
  • 在目录中运行测试
    pytest testing/
  • 按关键字表达式运行测试
    • pytest -k "MyClass and not method"
      会运行TestMyClass.test_something
      但不会运行TestMyClass.test_method_simple
    • 运行包含与给定字符串表达式匹配的名称的测试
      包括使用文件名、类名和函数名作为变量的Python运算符
  • 按节点id运行测试
    每个收集的测试都分配了一个唯一的nodeid,包含模块文件名,后跟说明符,如类名,函数名和参数化参数,用::字符分隔
    • 在模块中运行特定测试
      pytest test_mod.py::test_func #运行test_mod.py文件中test_func函数
    • 在命令行中指定测试方法
      pytest test_mod.py::TestClass::test_method #运行test_mod.py文件中TestClass类中test_func函数
  • 通过标记表达式运行测试
    pytest -m slow
    将运行@pytest.mark.slow装饰器装饰的所有测试(@pytest.mark.为标记)
  • 从包中运行测试
    pytest --pyargs pkg.testing
    将导入pkg.testing包并使用其文件系统位置来查找和运行测试

修改python回溯打印

  • 示例
    pytest --showlocals #在回溯中显示局部变量
    pytest -1 #显示局部变量(快捷方式)
    pytest --tb = auto #(默认)'long’追溯第一个和最后一个
    #entry,但其他条目的’short’样式
    pytest --tb = long #详尽,信息丰富的回溯格式
    pytest --tb = short #较短的追溯格式
    pytest --tb = line #每次失败只有一行
    pytest --tb = native #Python标准库格式
    pytest --tb = no #根本没有回溯
  • -full-trace导致在错误时打印非常长的跟踪(长于–tb = long)。 它还确保在KeyboardInterrupt(Ctrl + C)上打印堆栈跟踪。 如果测试花费的时间过长,并且使用Ctrl + C中断它们以找出测试挂起的位置,这非常有用。 默认情况下,不会显示任何输出(因为python会捕获KeyboardInterrupt)。 通过使用此选项,您可以确保显示跟踪

详细的总结汇报

版本2.9中的新功能

  • -r标志可用于在测试会话结束时显示测试结果摘要,从而可以在大型测试套件中轻松获得所有的 failures, skips, xfails等的图像
  • -r选项在它之后接受许多字符
    f - failed 失败
    E - error 错误
    s - skipped 跳过
    x - xfailed
    X - xpassed
    p - passed 通过
    P - passed with output 通过输出传递
    a - all except pP 除了传递之外的所有字符
  • 可以使用多个字符
    例如,pytes -rfs 只查看失败和跳过的测试

在失败时丢弃到pdb(python调试器)

python附带一个名为pdb的内置python调试器,pytest允许用户通过命令行选项进入pdb提示符

  • 命令:pytest --pdb
    这将在每次失败时调用Python调试器(或KeyboardInterrupt)
    命令:pytest -x --pdb #只在第一次失败的测试中执行此操作
  • 命令:pytest --pdb --maxfail = 3#在前三次失败时调用
  • 注意:
    • 在任何失败时调用,异常信息都存储在sys.last_value、sys.last_type和sys.last_traceback
    • 在交互式使用中,这允许用户使用任何调试工具进行事后调试,也可以手动访问异常数据
      import sys
      sys.last_value

在测试开始时删除pdb

python允许用户通过命令行选项在每次测试开始时立即进入pdb提示符
pytest --trace
这将在每次测试开始时调用Python调试器

设置断点

要在代码中设置断点,请在代码中使用本机Python调用,pytest会自动禁用该测试的输出捕获:import pdb;pdb.set_trece()

  • 其他测试中的输出捕获不受影响
  • 任何先前的测试输出已经被捕获并将被处理
  • 在同一测试中生成的任何后续输出都不会被捕获,而是直接发送到sys.stdout
    • 注意:即使对于退出交互式pdb跟踪会话并继续常规测试运行后发生的测试输出,这也适用

使用内置断点功能

Python3.7引入了内置breakpoint()函数,pytest支持适用breakpoint()以下行为

  • 当breakpoint()调用并PYTHONBREAKPOINT设置为默认值时,pytest将使用自定义内部pdb跟踪UI而不是系统默认的pdb
  • 测试完成后,系统将默认返回系统pdb跟踪UI
  • 随着–pdb传递给pytest,自定义内部pdb跟踪ui使用既breakpoint()和失败的测试/未处理的异常
  • –pdbcls可用于指定自定义调试器类

分析测试执行持续时间

pytest --durations=10
获得最慢的10个测试持续时间的列表
默认情况下,除非运行-vv,否则pytest不会显示太小的测试持续时间(<0.01s)

创建JUint xml格式文件

要创建可由Jenkins或其他continuous集成服务器读取的结果文件,可使用此调用
pytest -- junitxml=path
(未完待续)

创建结果日志格式文件

不推荐使用,4.0版本会删除
pytest --resultlog=path

将测试报告发送到在线的pastebin服务

  • 为每个失败测试创建一个url
    pytest --pastebin=failed
  • 为整个测试会话日志创建url
    pytest --pastebin=all

禁用插件

要在调用时禁用加载特定插件,请将该-p选项与前缀一起使用no:
pytest -p no:doctest #禁用加载插件doctest,负责从文本文件执行doctest测试,调用pytest

从python代码中调用pytest

2.0版本的新功能
命令:pytest.main()

  • 介绍
    这就像你从命令中调用“pytest”一样,不会raise SystemExit而是返回exitcode
    可以传入选项和参数
    • pytest.main(['-x','mytestdir'])
    • pytest.main可以指定其他参数
  • 注意
    调用pytest.main()将导致导入测试及其导入的任何模块
    由于python导入系统的缓存机制,pytest.main()从同一进程进行后续调用不会反应调用之间对这些文件的更改
    因此pytest.main()不建议从统一进程进行多次调用(例如,为了重新运行测试)

你可能感兴趣的:(自动化测试)