pytest_collection_modifyitems钩子方法作用于用例收集以后,对测试集中的用例进行重新排序等等操作。
项目需求:
完成IB/CL账号的注册-发送邮件-kyc接口自动化脚本:业务逻辑比较简单,涉及到三个接口:发送图片验证码,识别验证码,注册接口的请求体数据中添加进识别的验证码来完成注册。
接口逻辑:
前置:发送验证码、识别验证码
后置:删除前置设置的全局变量:验证码code、验证码id
考虑到验证码不一定识别正确,这时候需要加上失败重跑机制,但是由于用例中的每个接口并不一定需要加上这个前置和后置,需要对收集的用例进行处理,自定义一个规则:当用例的title包含‘验证码时’,加上识别验证码的前置及后置,以及验证码识别失败导致的注册失败的重跑机制。
前置后置处理如下,用到了pytest_collection_modifyitems钩子方法:
#conftest.py
@pytest.fixture()
def verify_code():
logger.info('============运行用例前置:verify_code,满足用例的预置条件==============')
captcha_url = SystemEnv.CAPTCHA.get(SystemEnv.ENTITY).get(env)
if hasattr(SystemEnv,'cp_token'):
token = getattr(SystemEnv,'cp_token')
else:
token = None
captcha_resp = HandelRequests.request('get',captcha_url,token=token)
#设置全局变量
verify_img_code(captcha_resp)
handleExtract('{"captchaid":"$..id"}',captcha_resp.json())
yield
#环境恢复,删除全局变量
logger.info('运行用例后置:verify_code,环境恢复:删除设置的全局变量')
delattr(SystemEnv,'imgcode')
delattr(SystemEnv,'captchaid')
#收集用例以后:
def pytest_collection_modifyitems(items):
logger.info('================================================开始为每个用例加上必须夹具=======================================================')
for item in items:
case_title = item.callspec.params.get('case').title
if '验证码' in case_title:
logger.info(f'用例{item.nodeid}需要加上前置verify_code夹具:发送验证码并识别验证码')
logger.info(f'加上夹具的用例title为:{case_title}')
item.add_marker(pytest.mark.verify_code)
item.fixturenames.append('verify_code')
踩坑点:
item.add_marker(pytest.mark.verify_code)
给用例加上标记verify_code,运行verify_code这个fixture
这里需要注意的是:pytest.ini或者其他pytest的配置文件的addopts配置不能加上--strict-markers参数:只允许使用已知标记,未在pytest.ini文件中注册的任何标记都将引发异常。否则会报错;或者我们把fixture函数verify_code加入到markers中。