网站建设公司做销售好不好?,做文交所的都有哪些网站,wordpress 标签搜索引擎,免费网站发布怎么做的一、痛点分析 在实际企业的项目中#xff0c;自动化测试的代码往往需要在不同的环境中进行切换#xff0c;比如多套测试环境、预上线环境、UAT环境、线上环境等等#xff0c;并且在DevOps理念中#xff0c;往往自动化都会与Jenkins进行CI/CD#xff0c;不论是定时执行策略…一、痛点分析 在实际企业的项目中自动化测试的代码往往需要在不同的环境中进行切换比如多套测试环境、预上线环境、UAT环境、线上环境等等并且在DevOps理念中往往自动化都会与Jenkins进行CI/CD不论是定时执行策略还是迭代测试那么问题来了难道每次切换环境都需要提供一套测试代码或者每次切换都要需修改我们的自动化环境配置答案当然不是不然怎么能叫测试自动化呢 在未使用pytest的Hook相关方法之前切换环境我们一般会使用python的内置模块sys它有一个argv的方法可以从我们的命令行接收参数通过它也可以实现上面的需求就像如下部分代码这样
try:if sys.argv[1] -p:# 预上线环境conf_url.write_value(filenameCONFIGS_FILE_PATH_URL,datap_api_address)modify_properties_url(filenameENVIRONMENT_PROPERTIES_PATH,urlp_api_address[request][url])elif sys.argv[1] in [ft{i} for i in range(1, 8)]:# 测试环境conf_url.write_value(filenameCONFIGS_FILE_PATH_URL,datatest_api_address(sys.argv[1][1:]))modify_properties_url(filenameENVIRONMENT_PROPERTIES_PATH,urltest_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(filenameCONFIGS_FILE_PATH_URL,dataformal_api_address)modify_properties_url(filenameENVIRONMENT_PROPERTIES_PATH,urlformal_api_address[request][url]) 这种方式我们需要使用 python xxx.py -p 这种方式进行环境切换然后再执行pytest命令行去执行测试用例但是这种方法能在pytest的命令行中使用吗能不能将环境切换的命令行也集成到pytest的命令行中执行整个自动化项目只使用一条命令行呢
方法一Hook方法pytest_addoption注册命令行参数
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, actionstore,defaulthttps://www.cnblogs.com/,help将命令行参数 ’--env 添加到 pytest 配置中)
parser.addoption参数说明
name自定义命令行参数的名字可以是xx -xx 或 --xxaction在命令行中遇到此参数时要采取的基本操作类型 - store默认只存储参数的值可以存储任何类型的值此时 default 也可以是任何类型的值而且命令行参数多次使用也只能生效一个最后一个值覆盖之前的值- append存储一个列表用 append 模式将可以同时多次使用自定义参数并且 default 默认值必须是一个列表pytest 会把 default 默认参数的值和多个自定义参数的值放在一个列表中- store_const用 const 为命令行参数指定一个常量值必须和 const 参数同时使用使用这个模式后命令行参数不能赋值- append_const存储一个列表使用 const 为命令行参数指定一个常量值并将 default 默认值和 const 常量值添加到列表中这个模式可以同时多次使用自定义参数但是还是不能赋值只能使用常量nargs应该使用的命令行参数的数量const某些操作和nargs选择所需的常量值default如果参数的值不在命令行中则使用默认值type可以是 python 的基础类型比如intstrfloatlist 等类型如果不指定类型的话pytest会把接受到的参数值都默认为 str 类型所以我们有时需要指定参数的类型在使用 type 指定类型时也需要把 default 的类型修改为同样的类型choiceschoices 可以指定几个值自定义参数必须在这几个值中选择一个否则会报错required命令行选项是否可以省略仅可选help对参数作用的简要说明metavar用法消息中参数的名称dest要添加到 parse_args() 返回的对象中的属性的名称
3.使用request.config.getoption(--命令行)获取命令行参数的值
pytest.fixture(scopesession)
def get_env(request):从配置对象中读取自定义参数的值return request.config.getoption(--env)
4.fixture继承进行环境切换
pytest.fixture(autouseTrue)
def set_env(get_env):将自定义参数的值写入全局配置文件with open(ENV_TXT_FILE, w, encodingutf-8) as f:f.write(get_env)
5.通过pytest命令行传参一键化实现环境切换和测试用例执行 方法二使用插件pytest-base-url进行命令行传参
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_urlstart_chrome(URL, optionsbrowser_options(), headlessFalse)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命令行传入自定义的参数都可以通过方法一实现因此杀鸡焉用牛刀环境切换优先推荐方法二