mark
pytest 提供了标记机制, 允许你使用 marker 对测试函数做标记, 一个测试函数可以有多个 marker, 一个 marker 也可以用来标记多个测试函数
比如我们需要进行冒烟测试, 不可能把所有的用例都跑一遍, 我们可以挑选一些重要的用例进行冒烟测试, 为了把选定的测试加入冒烟测试, 可以对他们添加 @pytest.mark.smoke 装饰器. 我们有两个文件, 里面分别放了两个测试用例
test_demo.py
- import pytest
- @pytest.mark.get
- def test_demo3():
- print('我是 tets demo 3')
- @pytest.mark.smoke
- @pytest.mark.get
- def test_demo4():
- print('我是 tets demo 4')
test_mark.py
- import pytest
- @pytest.mark.get
- def test_demo1():
- print('我是 tets demo 1')
- @pytest.mark.smoke
- @pytest.mark.get
- def test_demo2():
- print('我是 tets demo 2')
我们可以看到, 冒烟测试两个文件里面各有一个, 来使用 - m 参数执行一下, 这样我们标记的 smoke 的用例就被执行了, 其他的没有被执行
-m 后面也可以使用表达式, 可以在标记之间添加 and,or,not 关键字
跳过测试
要跳过某个测试, 只需要简单的在测试函数上方添加 @pytest.mark.skip() 装饰器即可
比如下面的两个测试用例, 我们只想执行 test_demo2, 则我们可以给 test_demo1 加上装饰器
- import pytest
- @pytest.mark.skip()
- def test_demo1():
- print('我是 tets demo 1')
- def test_demo2():
- print('我是 tets demo 2')
skipif
我们可以给要跳过的测试添加理由和条件, 这时应当使用 skipif 来替代 skip
- import pytest
- @pytest.mark.skipif(3<5, reason='版本不匹配')
- def test_demo1():
- print('我是 tets demo 1')
- def test_demo2():
- print('我是 tets demo 2')
前面的是个条件, 可以是 python 的表达式, 表达式的值为 True 时跳过, 为 false 时执行. 后面的是原因, 在来执行一次
但我们仍然看不到跳过的原因, 这时可以使用 - rs
运行测试子集
运行测试有很多方式, 不但可以选择运行某个测试目录, 文件, 类中的测试, 还可以选择运行某一个测试用例
运行单个目录
运行单个目录下的所有测试, 以目录作为 pytest 的参数即可
比如我 testpytest 目录下有两个测试文件, 分别是 test_demo.py 和 test_mark.py
运行单个测试文件
运行单个文件里的全部测试, 以路径名加文件名作为 pytest 参数即可
比如我们只想运行 testpytest 目录下的 test_demo.py 文件
运行单个测试函数
运行单个测试函数, 只需要在文件名后添加:: 符号和函数名
比如我们只想运行 testpytest 目录下的 test_demo.py 文件里的 test_demo3 这个函数
运行单个测试类
与运行单个函数类似, 只需要在文件名后面加上:: 符号和类名
- import pytest
- class Test1():
- def test_demo3(self):
- print('我是 tets demo 3')
- def test_demo4(self):
- print('我是 tets demo 4')
- class Test2():
- def test_demo1(self):
- print('我是 tets demo 1')
- def test_demo2(self):
- print('我是 tets demo 2')
比如我们只想运行 Test2 的类
运行单个测试类中的测试方法
如果不希望运行测试类中的所有测试, 只想指定运行其中一个, 则在类名后面再加上:: 符号和方法名
用测试名划分测试集合
-k 选项允许用一个表达式指定需要运行的测试, 该表达式可以匹配测试名 (或者子串). 表达式中可以包含 and,or,not
- def test_demo1():
- print('我是 tets demo 1')
- def test_demo2():
- print('我是 tets demo 2')
- def test_demo3():
- print('我是 tets demo 3')
- def test_parm():
- print('我是 tets parm')
如上代码我们只想运行测试函数里面有 demo 的所有用例
参数化
可以使用 @pytest.mark.parametrize(argnames, argvalues) 装饰器达到批量传送参数的目的
parametrize() 的第一个参数是用逗号分割的字符串列表, 第二个参数是一个值列表
- import pytest
- @pytest.mark.parametrize("a,b,c",
- [(1, 2, 3),
- (3, 2, 5),
- (4, 5, 9)])
- def test_add(a, b, c):
- assert a + b == c
来源: http://www.bubuko.com/infodetail-3168680.html