Python 自动化测试如何动态的选择用例执行

本贴最后更新于 1301 天前,其中的信息可能已经事过境迁

问题

在做自动化测试时,往往需要根据任务的不同选择不同的用例集来执行。怎么优雅的来解决这个问题呢?

答案就是:pytest框架的标记功能。

使用方法如下:

1. 注册标记

在项目根目录下创建pytest.ini,在其中注册标记如下:

[pytest]
markers =
    success: marks success tests
    fail: marks fail tests

定义了success,fail两个标记,冒号后面是标记的注释,可以省略。

2.标记测试

1. 标记方法

标记测试方法,我们在前面进行参数化时已经使用过非常简单。

在要标记的测试方法上应用装饰器

@pytest.mark.mark_name
def some_test_function()
    pass

这里的mark_name就是你自己定义的标记名称,例如上面定义的success,就可以写成

@pytest.mark.success
def some_test_function()
    pass

2. 标记测试类

与标记方法一致,在要标记的类定义语句上方应用装饰器

@pytest.mark.mark_name
class TestClass:
    pass

3. 标记测试模块

标记模块需要在模块顶部创建全局变量pytestmark,如下:

import pytest
pytestmark = pytest.mark.mark_name
# 或者多个标记
pytestmark = [pytest.mark.mark_name1, pytest.mark.mark_name2]

4.分开标记使用了参数化的用例

import pytest


@pytest.mark.foo
@pytest.mark.parametrize(
    ("n", "expected"), [(1, 2), pytest.param(1, 3, marks=pytest.mark.bar), (2, 3)]
)
def test_increment(n, expected):
    assert n + 1 == expected

在上面的案例中,标记foo会应用到每个用例,标记bar只会应用在第二个用例上。

3. 运行指定标记

当使用自定义的标记对测试做好标记后,在pytest命令中使用-m参数即可选择指定的标记运行。

pytest -v -m success
# 多个标记可以用 and or进行组合
pytest -v -m "mark1 and mark2"  # 选取同时被mark1和mark2标记的测试
pytest -v -m "mark1 or mark2"   # 选取被mark1或mark2标记的测试

4. 通过命令行动态指定标记

实际运行项目时,需要根据测试任务的不同,动态执行对应的用例,所以我们需要能够动态的接收命令行参数。

1. 参数解析模块

common目录下创建tools.py模块,编写如下函数:

import sys


def get_opts(name):
    args = sys.argv[1:]
    if name in args:
        return args[args.index(name)+1]
    else:
        return ''

2. main.py模块代码

修改main.py模块代码如下:

import pytest

import settings
from common.tools import get_opts


if __name__ == '__main__':
    args = ['-s', '-v', '--clean-alluredir', '--alluredir=./reports', settings.TEST_CASE_DIR]
    arg = get_opts('-m')
    if arg:
        args.insert(0, '-m {}'.format(arg))
    pytest.main(args)

那么接下来就可以通过命令来动态指定参数了:

python main.py -m mark1
1 操作
877649301 在 2021-05-31 19:35:14 更新了该帖
回帖
请输入回帖内容 ...