Pytest(二)命令行用法

本文介绍了一些pytest命令的退出码、调用的选项和参数、在python中调用pytest等。此外,本文省略了pytest命令行集成到CI的介绍。

通过python -m pytest调用pytest

可以在cmd中使用python解释器来运行pytest测试:

1
python -m pytest [...]

这个方式等同于直接使用pytest [...]运行pytest测试。但是,通过python调用的话,会添加当前路径到sys.path中。

pytest退出码

运行pytest的退出码有以下6种:

  • Exit code 0:所有检测到的测试用例测试通过
  • Exit code 1:检测到测试用例,但是有部分测试不通过
  • Exit code 2:pytest测试被用户中断
  • Exit code 3:执行测试用例时,发生了内部错误
  • Exit code 4:pytest命令行使用有错误
  • Exit code 5:没有检测到测试用例

如果想要自定义Exit code,可以考虑使用pytest-custom_exit_code插件.

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

1
2
3
pytest --version # shows where pytest was imported from
pytest --fixtures # show available builtin function arguments
pytest -h | --help # show help on command line and config file options

在第1(或n)个测试用例失败后停止测试

可以通过下面的命令指定pytest在第1(或n)个测试用例失败后停止测试:

1
2
pytest -x   # 一旦有测试用例失败,就停止pytest测试
pytest -maxfail=3  # 有3个测试用例失败时,停止pytest测试

指定测试用例集

pytest支持多种指定测试用例集运行测试的方法:

  • 运行一个module中的测试用例
1
pytest test_mod.py
  • 运行一个目录下的测试用例
1
pytest testing_dir/
  • 通过keywords表达式匹配
1
pytest -k "expressions"
  • 通过指定唯一id运行

每个被检测到的测试用例,都会有一个唯一id。id以module文件名开头,后面加上指定的类名/函数名,并且通过::分割。

例如,运行module中指定的测试用例:

1
pytest test_mod.py::test_func

例如,运行module中的指定类中的指定测试用例:

1
pytest test_mod.py::Testclass::test_method
  • 通过mark表达式匹配
1
pytest -m slow

执行上面的命令,pytest只会运行使用了@pytest.mark.slow装饰器的测试用例。可以进一步了解pytest.mark

详细的总结报告

pytest的-r参数可以用来在测试session的最后,展示简短的测试总结报告。当运行大量测试用例的时候,-r命令很有用。

-r命令后面一般会指定一些字符,比如-ra表示展示所有不通过的测试用例。-r后面可以指定的字符如下:

  • f 失败的
  • E 错误的
  • s 跳过的
  • x 希望失败,实际失败的
  • X 希望失败,实际成功的
  • p 通过的
  • P 通过且有输出的
  • a 除了pP的
  • A 所有的

可以同时指定多个字符。(有点类似rpm的-q命令)

在python代码中调用pytest

通过pytest.main()就可以通过python代码直接调用pytest。就像从命令行调用pytest一样。它不会引发SystemExit,而是返回exitcode。

通过给main()传入list,就可以指定选项和参数。例如:pytest.main(["-x", "mytestdir"])等同于pytest -x mytestdir