• pytest自动化测试两种执行环境切换的解决方案


    一、痛点分析
    在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、UAT环境、线上环境等等,并且在DevOps理念中,往往自动化都会与Jenkins进行CI/CD,不论是定时执行策略还是迭代测试,那么问题来了,难道每次切换环境都需要提供一套测试代码?或者每次切换都要需修改我们的自动化环境配置?答案当然不是,不然怎么能叫测试自动化呢! 在未使用pytest的Hook相关方法之前,切换环境我们一般会使用python的内置模块sys,它有一个argv的方法,可以从我们的命令行接收参数,通过它也可以实现上面的需求,就像如下部分代码这样:

    1. try:
    2. if sys.argv[1] == '-p':
    3. # 预上线环境
    4. conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,
    5. data=p_api_address)
    6. modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,
    7. url=p_api_address["request"]["url"])
    8. elif sys.argv[1] in [f't{i}' for i in range(1, 8)]:
    9. # 测试环境
    10. conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,
    11. data=test_api_address(sys.argv[1][1:]))
    12. modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,
    13. url=test_api_address(sys.argv[1][1:])["request"]["url"])
    14. else:
    15. case_logger.error("Please confirm the environmental information.")
    16. print("Please confirm the environmental information.")
    17. raise Exception
    18. except IndexError:
    19. # 生产环境
    20. conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,
    21. data=formal_api_address)
    22. modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,
    23. url=formal_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 通过配置对象读取参数的值
    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参数说明:

    name:自定义命令行参数的名字,可以是:"xx", "-xx" 或 "--xx"
    action:在命令行中遇到此参数时要采取的基本操作类型
    - store:默认,只存储参数的值,可以存储任何类型的值,此时 default 也可以是任何类型的值,而且命令行参数多次使用也只能生效一个,最后一个值覆盖之前的值
    - append:存储一个列表,用 append 模式将可以同时多次使用自定义参数,并且 default  默认值必须是一个列表,pytest 会把 default  默认参数的值和多个自定义参数的值放在一个列表中
    - store_const:用 const 为命令行参数指定一个常量值,必须和 const 参数同时使用,使用这个模式后命令行参数不能赋值
    - append_const:存储一个列表,使用 const 为命令行参数指定一个常量值,并将 default 默认值和 const  常量值添加到列表中,这个模式可以同时多次使用自定义参数,但是还是不能赋值,只能使用常量
    nargs:应该使用的命令行参数的数量
    const:某些操作和nargs选择所需的常量值
    default:如果参数的值不在命令行中,则使用默认值
    type:可以是 python 的基础类型,比如:int,str,float,list 等类型,如果不指定类型的话,pytest会把接受到的参数值都默认为 str 类型,所以我们有时需要指定参数的类型,在使用 type 指定类型时,也需要把 default 的类型修改为同样的类型!
    choices:choices 可以指定几个值,自定义参数必须在这几个值中选择一个,否则会报错
    required:命令行选项是否可以省略(仅可选)
    help:对参数作用的简要说明
    metavar:用法消息中参数的名称
    dest:要添加到 parse_args() 返回的对象中的属性的名称
    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命令行传参一键化实现环境切换和测试用例执行

    方法二:使用插件pytest-base-url进行命令行传参
    1.安装pytest-base-url

    pip install pytest-base-url -i https://pypi.douban.com/simple
    2.将base_url参数传入到fixture函数中

    1. @pytest.fixture
    2. def driver_setup(base_url):
    3. try:
    4. URL = base_url
    5. start_chrome(URL, options=browser_options(), headless=False)
    6. driver = get_driver()
    7. except Exception as e:
    8. log.error(e)
    9. else:
    10. yield driver

    3.pytest命令行传参

    使用 --base-url https://www.xxx.com/ 形式传参

    pytest --base-url https://www.cnblogs.com/
    第一种不局限于环境切换,任何想通过pytest命令行传入自定义的参数都可以通过方法一实现,因此杀鸡焉用牛刀,环境切换优先推荐方法二!

    下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

  • 相关阅读:
    生产环境sql优化日记——从几十分钟优化到几十秒钟
    Linux基础必备的100 个命令,你都知道吗?
    CANoe制作网关实现CAN(FD)报文故障注入(报文长度/timeout/信号错误/E2E)2
    ps神经网络滤镜安装包,ps神经网络滤镜用不了
    mt4量化交易接口:分享日常量化选股方法
    根号重构AC自动机:HDU4787
    PowerDesigner 连接 MYSQL
    Zotero(1)---文献管理软件Zotero安装教程
    CentOS上安装Docker
    git协同操作
  • 原文地址:https://blog.csdn.net/2301_76643199/article/details/133036869