问题
在做自动化测试时,往往需要根据任务的不同选择不同的用例集来执行。怎么优雅的来解决这个问题呢?
答案就是: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.com!
注册 关于