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

发布于 更新于
本文目录
  1. 问题
  2. 1. 注册标记
  3. 2.标记测试
  4. 1. 标记方法
  5. 2. 标记测试类
  6. 3. 标记测试模块
  7. 4.分开标记使用了参数化的用例
  8. 3. 运行指定标记
  9. 4. 通过命令行动态指定标记
  10. 1. 参数解析模块
  11. 2. main.py模块代码

技术文章自动化测试

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

问题

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

答案就是: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

来源:testingpai

继续阅读