Pytest 学习笔记

命名规则

测试文件:test_file_name.py

测试函数:test_function_name()

测试类:Test_class_name

测试结果

「.」: Passed,测试通过

「F」:Failure,测试失败

「s」:Skip,测试未被执行

「x」:xfail,预期失败

「X」:xpass,预期失败但通过

「E」:Error,触发异常

常用命令

-v/–verbose 测试结束输出详细的信息,最明显的区别就是每个测试用例都占一行,否则就是一个「.」

-q 简化输出信息 ,与–tb=line(仅打印异常代码位置)搭配

–help/-h 查看 pytest 用法,也可以展示新添加的插件的选项和用法

–collect-only 查看哪些用例会被执行

-k “name1 or name2” 指定希望运行的测试用例

-m mark_name 在函数上方标记@pytest.mark.mark_naem,可以运行相同标记的用例(自定义标记名),还可以使用 -m “mname1 and mname2” / “mname1 or mname2” 进行过滤, and or not 关键字

-x 默认测试失败继续执行之后的用例,加-x后可以立即停止

–maxfail 使用–maxfail=num 指定可以失败几次,–maxfail=1 与-x 效果一样

-s 允许终端在测试运行时输出某些结果

–lf last-failed 定位到最后一个失败的测试用例重新运行

–ff 运行完剩余的测试用例

-l 显示局部变量和其值

预期异常

with pytest.raises(ErrorName)

跳过测试

@pytest.mark.skip()

@pytest.mark.skipif( expression )

加上这个注解的测试用例会直接跳过而不执行,运行时加上 -rs 可以显示跳过的原因

标记预期会失败的测试
@pytest.mark.xfail()

执行结果 x 代表 expected to fail,预期失败,实际也失败了

X 代表 expected to fail but passed,预期失败,但实际运行并没有失败

运行测试子集
运行单个目录下的所有测试,以目录作为 pytest 的参数即可

运行点个文件里的全部测试,以路径名加文件名作为 pytest 的参数即可

运行单个测试函数,只需要在文件名后面添加「::」符号和函数名,pytest tests/test.py::test_func_name

运行测试类需要在文件名后面添加「::」符号和类名

参数化测试

@pytest.mark.parametrize( argnames, argvalues ) 可以达到批量传送参数的目的

Fixture

fixture 的优势在于用户在编写测试函数时可以只考虑核心测试逻辑,而不需要考虑测试前的准备工作。在 fixture 中的错误会被报告为 Error 而不是 Fail。

参考 https://www.jianshu.com/p/54b0f4016300

@pytest.fixture()装饰器用于声明函数是一个 fixture。如果测试函数的参数列表中包含 fixture 名,pytest 会检测到并在运行测试函数之前执行该 fixture。在编写测试函数的时候,可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数

fixture 可以放在单独的测试文件里,但如果希望多个测试文件共享 fixture,可以在某个公共目录下新建一个 conftest.py 文件,将 fixture 放在其中

fixture 的调用

  1. 在测试用例中直接调用
  2. 使用装饰器调用@pytest.mark.usefixtures(“fixture_name1” , “fixture_name2”)
  3. 用 autos 调用 fixture
    fixture decorator 一个 optional 的参数是autouse, 默认设置为False。
    当默认为False,就可以选择用上面两种方式来试用fixture。
    当设置为True时,在一个session内的所有的test都会自动调用这个fixture。
    权限大,责任也大,所以用该功能时也要谨慎小心。
    fixture scope
    function:每个test都运行,默认是function的scope
    class:每个class的所有test只运行一次,无论测试类里有多少个方法都可以共享这个 fixture
    module:每个module的所有test只运行一次,无论模块中有多少个测试函数、类或其它 fixture 都可以共享该 fixture
    session:每个session只运行一次,一次 pytest 的会话中所有的函数、方法都可以共享这个 fixture
    比如所有test都需要连接同一个数据库,那可以设置为module,只需要连接一次数据库,对于module内的所有test,这样可以极大的提高运行效率,fixture 只能使用同级别的 fixture 或者更高级别的

fixture 参数与返回值
fixture还可以带参数,可以把参数赋值给params,默认是None。对于param里面的每个值,fixture都会去调用执行一次,就像执行for循环一样把params里的值遍历一次。
fixture返回值默认是None,我们可以选择让fixture返回我们需要的东西。如果你的fixture需要配置一些数据,读个文件,或者连接一个数据库,那么你可以让fixture返回这些数据或资源。

fixture 会在测试函数之前运行,如果 fixture 包含 yield 那么系统会在 yield 处停止,转而运行测试函数,等测试函数执行完毕之后再回到 fixture 继续执行 yield 之后的代码,因此可将 yield 之前的代码视为配置过程(setup),将 yield 之后的代码视为清理过程(teardown)过程,无论测试过程中发生了什么,yield 之后的代码都会被执行。

–setup-show 可以实现看到测试过程中执行的是什么

你可能感兴趣的:(学习笔记)