在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、UAT环境、线上环境等等,并且在DevOps理念中,往往自动化都会与Jenkins进行CI/CD,不论是定时执行策略还是迭代测试,那么问题来了,难道每次切换环境都需要提供一套测试代码?或者每次切换都要需修改我们的自动化环境配置?答案当然不是,不然怎么能叫测试自动化呢!
在未使用pytest的Hook相关方法之前,切换环境我们一般会使用python的内置模块sys,它有一个argv的方法,可以从我们的命令行接收参数,通过它也可以实现上面的需求,就像如下部分代码这样:
try:
if sys.argv[1] == '-p':
# 预上线环境
conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,
data=p_api_address)
modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,
url=p_api_address["request"]["url"])
elif sys.argv[1] in [f't{i}' for i in range(1, 8)]:
# 测试环境
conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,
data=test_api_address(sys.argv[1][1:]))
modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,
url=test_api_address(sys.argv[1][1:])["request"]["url"])
else:
case_logger.error("Please confirm the environmental information.")
print("Please confirm the environmental information.")
raise Exception
except IndexError:
# 生产环境
conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,
data=formal_api_address)
modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,
url=formal_api_address["request"]["url"])
这种方式我们需要使用 "python xxx.py -p" 这种方式进行环境切换,然后再执行pytest命令行去执行测试用例,但是这种方法能在pytest的命令行中使用吗?能不能将环境切换的命令行也集成到pytest的命令行中,执行整个自动化项目只使用一条命令行呢?
同时,在这我为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看,也可以直接【点击文末小卡片免费领取资料文档】
软件测试视频教程观看处:
2024年Python自动化测试全套保姆级教程,70个项目实战,3天练完,永久白嫖...
1、Hook方法注解
pytest_addoption:可以让用户注册一个自定义的命令行参数,方便用户将数据传递给 pytest
这个 Hook 方法一般和内置 fixture pytestconfig 配合使用
pytest_addoption 注册命令行参数,pytestconfig 通过配置对象读取参数的值
参考文档:Writing plugins — pytest documentation
2、使用方法
1.一般编写到conftest.py文件中
2.定义pytest_addoption方法注册pytest命令行参数,函数名和参数保持一致
def pytest_addoption(parser):
"""注册自定义参数 env 到配置对象"""
parser.addoption("--env", action="store",
default="https://www.cnblogs.com/",
help="将命令行参数 ’--env' 添加到 pytest 配置中")
parser.addoption参数说明:
3.使用request.config.getoption("--命令行")获取命令行参数的值
@pytest.fixture(scope="session")
def get_env(request):
"""从配置对象中读取自定义参数的值"""
return request.config.getoption("--env")
4.fixture继承,进行环境切换
@pytest.fixture(autouse=True)
def set_env(get_env):
"""将自定义参数的值写入全局配置文件"""
with open(ENV_TXT_FILE, 'w', encoding='utf-8') as f:
f.write(get_env)
5.通过pytest命令行传参一键化实现环境切换和测试用例执行
1.安装pytest-base-url
pip install pytest-base-url -i https://pypi.douban.com/simple
2.将base_url参数传入到fixture函数中
@pytest.fixture
def driver_setup(base_url):
try:
URL = base_url
start_chrome(URL, options=browser_options(), headless=False)
driver = get_driver()
except Exception as e:
log.error(e)
else:
yield driver
3.pytest命令行传参
使用 --base-url https://www.xxx.com/ 形式传参
pytest --base-url https://www.cnblogs.com/
第一种不局限于环境切换,任何想通过pytest命令行传入自定义的参数都可以通过方法一实现,因此杀鸡焉用牛刀,环境切换优先推荐方法二!
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。