pytest系列之用例执行参数、执行顺序及用例的选择性执行

716 阅读2分钟

1.运行参数

1.1 输出基本信息的参数

-s:输出调试信息,包括用例中的print打印信息

-v:输出比-s更详细的信息,会输出类名、方法名

-vs:-v和-s的组合

1.2 分布式运行

-n:支持多线程或者分布式运行测试用例

pytest -vs ./testcase/test_login.py -n 3

pytest.main(['-vs', './testcase/test_login.py', '-n=3'])

表示开启两个线程来运行测试用例

1.3 失败用例重跑

pytest -vs ./testcase/test_login.py --reruns 2

pytest.main(['-vs', './testcase/test_login.py', '--reruns=2'])

表示失败用例重跑2次,意思失败的用例总共跑3次

1.4 用例停止的条件参数

-x:只要有一个用例报错,那么测试停止

--maxfail:表示出现指定个数的用例失败就停止

1.5 执行指定特定条件的测试用例

-k:根据测试用例的部分字符串指定测试用例

pytest.main(['-vs', './testcase/test_login.py', '-k=li'])

只允许名字包含li的用例

1.6 html报告

--html ./report/report.html 生成HTML的测试报告

2. pytest用例执行顺序

默认从上到向执行

测试用例前加上装饰器@pyest.mark.run()可以改变执行顺序

@pyest.mark.run(order=1)

代表当前用例第一个被执行,通过这里的数字可以调整用例的执行顺序

class TestInterface:
​
    def test_interface_01(self):
        print('第一个接口测试用例')
​
    @pytest.mark.run(order=1)
    def test_interface_02(self):
        print('第二个接口测试用例')
​
    def test_interface_03(self):
        print('第三个接口测试用例')

代表当前用例test_interface_02首先被执行,通过这里的数字可以调整用例的执行顺序

该用法依赖于pytest-ordering插件

3. 用例的标签选择性执行

3.1 分组执行(按照用例等级(冒烟、集成、回归),用例类别(UI、接口),模块,作者等特征进行分组)

这里配置文件需要事先配置好分组信息

此时配置文件如下:

[pytest]
addopts = -vs --html ./report/report.html
testpaths = '../pytest_project'
python_files = test*.py
python_classes = Test*
python_functions = test
markers =
    smoke:冒烟用例
    usermange:用户管理模块
    productmange:商品管理模块

其中的部分用例如下:

class TestLogin(object):
​
    def test_01_baili(self):
        print('测试百里1')
​
    @pytest.mark.smoke
    def test_02_baili(self):
        print('测试百里2')
​
    @pytest.mark.usermanage
    def test_03_yap(self):
        print('测试百里3')
pytest -vs -m "smoke"

表示执行带有smoke标签的用例

pytest -vs -m "smoke or usermanage"

表示执行带有smoke标签或者usermanage的用例

3.2 跳过部分测试用例

3.2.1无条件跳过

class TestLogin(object):
​
    @pytest.mark.skip(reason='异常')
    def test_04_login(self):
        print('测试百里4')
        assert 1 == 2

3.2.2 有条件跳过

class TestProduct(object):
    age = 19
    @pytest.mark.skipif(age>=18, reason='已成年')
    def test_01_product(self):
        time.sleep(3)
        print('测试商品')