问题
在做自动化测试时,往往需要根据任务的不同选择不同的用例集来执行。怎么优雅的来解决这个问题呢?
答案就是: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
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】