Pytest多环境切换实战:测试框架配置的最佳实践!

你是否也遇到过这种情况:本地测试通过,一到测试环境就翻车?环境变量错乱、接口地址混乱、数据源配置丢失......这些「环境切换」问题简直像定时炸弹,随时引爆你的测试流程!

测试人员每天都跟不同的环境打交道,比如线上环境,测试环境,预上线环境等等,那么作为自动化测试人员写的代码,我们也要具备能自由切换环境的能力,那么今天小编就给大家聊一下,如何能让我们python语言写的测试用例可以自由切换到不同的环境下面去运行呢

Pytest 作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换?有没有一种通用、实用、可复用的方案?

"Pytest如何实现环境切换,让测试适应不同场景?"这个问题曾让我挠头。配置文件怎么写?参数怎么传?能不能自动化切换而不用手动改代码?带着这些疑问,我开始摸索Pytest的环境管理功能。从简单的命令行参数到复杂的配置文件,我发现它不仅灵活,还能无缝对接团队协作。那么,具体该怎么操作呢?接下来,让我们一起进入实战,揭开Pytest环境切换的奥秘。

今天给他大家聊一下通过pytest框架实现自由环境切换的几种方法。

1 pytest-base-url

pytest有一个插件叫pytest-base-url ,是管理base_url非常好的一款插件,文档资料链接:https://pypi.org/project/pytest-base-url/

下载方式:

css 复制代码
pip install pytest-base-url

案例如下:

python 复制代码
import requests


def test_demo(base_url):
    resp = requests.get(base_url)
    status_code = resp.status_code
    assert status_code == 200

第1种使用方式是终端添加--base-url这个命令,如下所示:

第2种使用方式是在pytest.ini配置文件种去配置base_url,然后自动读取url的数据,这样就不用添加--base-url这个命令行参数了:

命令行直接运行pytest 即可。

2 hooks函数

pytest有个hooks函数,可以自定义命令行参数,一般在conftest.py中去引用。

Conftest.py中写pytest_addoption这个hooks函数,可以自定义命令行参数,base_url只能对一个url地址进行传递,那么有的项目不仅需要多项目请求的url地址进行不同环境的切换,还需要对mysql的url地址进行不同的切换,这个时候就可以用自定义命令,定义不同的命令行参数,这样我们在执行pytest的时候就可以自由进行传递。

代码如下:

通过pytest_addoption这个hooks函数,设置了两个命令行参数,一个是--mysql-url,另一个是--project-url,help后面是对这两个命令行的解释,解释说明这两个命令行代表什么含义

python 复制代码
import pytest


def pytest_addoption(parser):
    parser.addoption(
        "--mysql-url", action="store", help="这里可以传递mysql的url地址"
    )
    parser.addoption(
        "--project-url", action="store", help="这里可以传递项目的url地址"
    )

通过fixture函数中的request参数去读取命令行中传递的参数,赋值给一个变量,就可以在pytest中随便使用。

python 复制代码
@pytest.fixture(scope='class')
def get_url(request):
    mysql_url = request.config.getoption('--mysql-url')
    project_url = request.config.getoption('--project-url')
    return mysql_url, project_url

项目代码如下:

fixture函数的调用,直接把fixture的名字当成参数传递到测试用例里面即可

python 复制代码
import requests


def test_demo(get_url):
    mysql_url = get_url[0]
    print('mysql_url的地址是{}'.format(mysql_url))
    
    project_url = get_url[1]
    resp = requests.get(project_url)
    status_code = resp.status_code
    
    assert status_code == 200

运行测试的命令为:

css 复制代码
pytest -s --mysql -url 192.168.1.11--project-url http://www.example.com

|---|
| |

如下图所示:

3 yml和fixture

通过 yml文件fixture 进行配合使用,首先在项目目录下面创建一个conf.yml,然后里面去手动配置现在要运行的环境,截图如下:

然后在创建一个conftest.py,里面定义两个fixture函数,一个用来读取conf.yml里面的内容,另一个用来配置具体的环境信息

比如qa环境,release环境,然后通过conf.yml里面配置的qa还是release,来读取project_url 和 mysql_url,截图如下:

python 复制代码
import pytest
import yaml


@pytest.fixture(scope="session")
def config():
    with open('./conf.yml', 'r', encoding='utf-8') as f:
        conf = yaml.load(f.read(), Loader=yaml.FullLoader)
    return conf


@pytest.fixture(scope="session")
def env_vars(config):
    env = config["env"]
    mapping = {
        "qa": {
            "project_url": "http://121.42.15.146:9090",
            "mysql_url": "192.168.1.1"
        },
        "release": {
            "project_url": "https://release.com",
            "mysql_url": "127.0.0.1"
        }
    }
    project_url = mapping[env]["project_url"]
    mysql_url = mapping[env]["mysql_url"]
    return mysql_url, project_url

项目代码(还是之前的测试用例)如下:

python 复制代码
import requests


def test_demo(env_vars):
    mysql_url = env_vars[0]
    print('mysql_url的地址是{}'.format(mysql_url))
    
    project_url = env_vars[1]
    resp = requests.get(project_url)
    status_code = resp.status_code
    
    assert status_code == 200

命令行运行方式,正常运行即可,截图如下:

结论

随着 CI/CD 流水线普及,多环境并存已成常态。测试人员面临的环境复杂度越来越高,若不能实现配置统一、切换自如,将严重拖慢测试效率,甚至引发线上事故。

环境切换看似是小问题,实则影响自动化测试流程的稳定性与扩展性。掌握 Pytest 中的配置管理,就等于掌握了自动化测试的方向盘。

总的来说,Pytest的环境切换通过命令行参数、配置文件和插件支持,让测试灵活适应各种场景。从单人开发到团队协作,它都能大幅提升效率。这不仅是技术实践,更是现代测试思维的体现。掌握环境切换,你的测试流程将更加顺畅,代码质量也能更上一层楼。

测试环境千万条,配置管理第一条;配置不统一,Bug泪两行。

相关推荐
天才测试猿2 小时前
接口自动化测试之pytest接口关联框架封装
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
not coder1 天前
Pytest Fixture 详解
数据库·pytest
not coder1 天前
pytest 常见问题解答 (FAQ)
开发语言·python·pytest
程序员的世界你不懂1 天前
(1)pytest简介和环境准备
pytest
not coder1 天前
Pytest Fixture 是什么?
数据库·oracle·pytest
Tester_孙大壮1 天前
pytest中的元类思想与实战应用
pytest
<花开花落>1 天前
pytest 中 fixture 与类继承交互导致的问题
python·pytest
Julyyyyyyyyyyy2 天前
【软件测试】测试框架(unittest/pytest)
测试工具·pycharm·自动化·pytest
not coder2 天前
pytest 常用命令参数
pytest
not coder7 天前
Pytest 是什么
数据库·pytest