最强自动化框架,Pytest自动化测试-动态切换环境实战(超细整理)


前言

在开始前,我们可以先思考几个问题:动态切换测试环境的目的是什么(能够解决什么问题)?该如何实现(实现方案)?具体步骤是什么(实现过程)?

1、动态切换测试环境的目的是什么?

动态切换测试环境的目的是什么,或者说它能解决什么样的问题:
便于快速验证功能在不同环境中的表现。

比如:有的功能(背后的接口)在开发环境是正常的,但到了测试或预发布环境就出问题了,可以便于快速验证各个功能在不同环境中的表现;

省去修改配置参数的繁琐步骤。通常情况下,我们的配置信息都是写在配置文件中,然后测试用例读取配置文件中不同的配置信息。如果想要切换环境,就需要修改配置文件或读取配置的逻辑。

而动态切换测试环境则可以自动根据我们传入的命令行参数和预制好的读取配置的策略,自动识别、解析并返回对应的数据。

为测试框架赋能。测试框架要能做到,一套脚本多环境运行,支持环境切换,并且能根据环境进行自动化的配置(包括系统配置、测试数据配置等)。

其实以上总结起来就是:一套测试脚本,能根据环境进行自动化的配置,省去手动配置参数的步骤,可以实现在多环境中运行,从而快速验证各个接口及相关服务在不同环境中的表现。

2、动态切换测试环境如何实现?

实现方案:
我们希望:可以有个开关,自由控制执行脚本的运行环境,而不是需要我们手动修改。

比如:选择dev时,自动读取的是开发环境的配置及测试数据:url、数据库配置、账号密码、测试数据;
当切换到test时,自动读取的是测试环境的配置及测试数据。

大致实现原理如下所示:

C1

用户通过pytest命令行传入参数驱动脚本执行(pytest_addoption用于实现自定义命令行参数);

fixture函数get_env用于获取用户输入的命令行参数,传递给fixture.py中的各个fixture函数;

fixture.py中的各个fixture函数根据get_env提供的环境参数值,解析测试环境对应的数据文件内容:URL(get_url)、账号(get_user)、数据库配置(get_db),同时传递给api类(api_module_A…B…C)、登录方法(login)、数据库连接方法(use_db)等,用于实例化操作,这部分fixture函数再传递给测试用例,用于用例前后置操作(相当于setup/teardown);

最后测试用例再根据各个fixture函数返回的实例对象、配置信息,调用各个模块的api函数,执行测试,并读写数据库实现数据校验、断言,从而最终实现切换环境策略;

3、目录结构&框架设计小技巧

目录结构:
项目结构大致如下,至于目录结构和文件命名,只能说萝卜青菜各有所爱。比如有人喜欢把存放公共方法的common目录命名为utils,存放各个api模块的api目录命名为src…

C2

自动化测试框架设计小技巧:
api:存放封装各个项目、各个模块的api,如jk项目支付模块,可以命名为jk_pay.py;
config:存放配置文件,直接用py文件即可,不推荐使用ini、yaml,反而会多了一层解析,增大出错概率;

common:存放公共方法,如基于http协议requests库,则可以命名为http_requests.py;通过文件名称,大概率就能知道这个文件的作用,比如通过parse_excel的命名直接就能知道是解析excel文件;

main:框架主入口,存放用来批量执行用例的文件,比如:run_testcase_by_tag.py(前提是用例都打了标签)、run_testcase_by_name.py;
fixture:存放fixture文件,建议每个项目一个fixture文件,互不影响,如:jk_fixture.py、jc_fixture.py;
test_case:存放测试用例文件;

conftest.py:存放一些hook函数、全局fixture函数,如前面提到的自定义命令行参数的函数pytest_addoption、获取命令行参数的fixture函数get_env;
pytest.ini:pytest框架配置文件;

4、实现过程

上述的方案单从文字层面可能有些难以理解,下面我们结合具体的代码案例来详细讲述一下实现过程。

实现自定义命令行参数工具:
在conftest.py中定义一个hook函数,实现自定义命令行工具,名为pytest_addoption(固定写法),用来在命令行中传入不同的环境参数;

def pytest_addoption(parser):
    """
    添加命令行参数
    parser.addoption为固定写法
    default 设置一个默认值,此处设置默认值为test
    choices 参数范围,传入其他值无效
    help 帮助信息
    """
    parser.addoption(
        "--env", default="test", choices=["dev", "test", "pre"], help="enviroment parameter"
    )

定义获取命令行参数的fixture函数:
在conftest.py中定义get_env的fixture函数,用来获取用户在命令行输入的参数值,传递给fixture.py中的各个fixture函数。pytestconfig是request.config的快捷方式,所以request.config也可以写成pytestconfig。

@pytest.fixture(scope="session")
def get_env(request):
    return request.config.getoption("--env")

来测试一下命令行能否输入参数以及fixture函数get_env能否获取到。我们可以简单定义一个测试用例:

def test_env(get_env):
    print(f"The current environment is: {
     get_env}")

然后通过命令行执行此测试用例:

pytest -s -v --env dev test_env.py::test_env

执行结果如下:

C3

定义环境解析策略:
例如当前项目为jc项目,则可以在fixture目录下定义一个jc_fixture.py的文件,用于专门存放此项目相关的fixture函数。

fixture.py中的各个fixture函数根据get_env提供的环境参数值,解析测试环境对应的数据文件内容:URL(get_url)、账号(get_user)、数据库配置(get_db),同时传递给api类(api_module_A…B…C)进行实例化,登录方法(login)、数据库连接方法(use_db)等,进行初始化,这部分fixture函数再传递给测试用例,用于用例前后置操作(相当于setup/teardown);

import pytest
from config.config import URLConf, PasswordConf, UsernameConf, ProductIDConf
from api.jc_common import JCCommon
from api.jc_resource import JCResource
from config.db_config import DBConfig
from common.mysql_handler import MySQL

@pytest.fixture(scope="session")
def get_url(get_env):
    """解析URL"""
    global url
    if get_env == "test":
        print("当前环境为测试环境")
        url = URLConf.RS_TEST_URL.value
    elif get_env == "dev":
        print("当前环境为开发环境")
        url = URLConf.RS_DEV_URL.value
    elif get_env == "pre":
        print("当前环境为预发布环境")
        url = URLConf.RS_PRE_URL.value
    return url

@pytest.fixture(scope="session&
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值