被 pytest 的问题激发了一些,其实可能都是很多人知道的东西,不过看到论坛分享的理念东西比较多,具体东西少点,我就写写 pytest 相关的一些小东西吧.
下面介绍一个使用第三方库结合 pytest 机制,给 pytest 新增一个命令行参数实现所有不同环境信息在一个文件并且可以切换被测试环境的例子,
代码量实际上非常少,但是起作用的.
运行自动化测试的时候,最理想状态就是同一份代码在不同的环境中运行,那么如何让 pytest 运行时候切换运行环境呢?
一般会想到的就是配置文件,不同的配置文件对应不同的环境,然后通过环境变量去切换使用不同的配置文件.
这里尝试所有不同环境配置信息都在一个文件中,也可以在运行是切换环境的做法.
使用 dynaconf 管理环境信息, 配置文件在一份 toml 文件中,示例如下:
[default]
db = { url = "postgresql://postgres:changeit@localhost:7432/test_hub" }
[dev]
db_url = "postgresql://postgres:changeit@localhost:7432/test_hub"
[test]
db_url = "postgresql://postgres:changeit@test:7432/test_hub"
[product]
db_url = "postgresql://postgres:changeit@prod:7432/test_hub"
[product_new]
db_url = "postgresql://postgres:changeit@prod_new:7432/test_hub"
上面文件代表了四个环境的的 db_url 值,分别是dev/test/product/product_new
如何通过 dynaconf 获取这些不同的环境信息呢?
-
1. 首先获取配置信息, 所有在settings.toml文件中的配置信息都初始化加载
from dynaconf import Dynaconf
settings = Dynaconf(
settings_file=["configs/settings.toml", "configs/.secrets.toml",
"settings.toml", ".secrets.toml"],
environment=True,
load_dotenv=True,
dotenv_path="/.env", # custom path for .env file to be loaded
includes=["../config/custom_settings.toml"],
)
settings.validators.validate()
-
2. 获取默认信息:直接使用 settings.db_url 就可以获取
@allure.feature("getting default db_url")
def test_get_default_settings():
logging.info(settings.db_url)
assert settings.db_url == "postgresql://postgres:changeit@default:7432/test_hub"
返回的是默认的 db_url: postgresql://postgres:changeit@default:7432/test_hub
-
3. 获取其他环境的信息:
切换获取那个环境信息
def ensure_env_settings(env_name: str):
env_switcher_key = settings.ENV_SWITCHER_FOR_DYNACONF
os.environ[env_switcher_key] = env_name
settings.reload()
获取新的环境变量:切换环境之后,再获取 db_url,这个时候就变成了 test 环境的 db_url:postgresql://postgres:changeit@test:
7432/test_hub
@allure.feature("getting test env db_url")
def test_get_test_env_db_url():
ensure_env_settings("test")
print(settings.db_url)
上面说明了环境配置切换的原理,那么结合 pytest 就是接收一个名行行参数 env,然后根据这个命令行参数去获取不同环境配置,
实现也算比较简单,只要在 tests 目录下的conftest.py文件中实现:
定义新命令行参数:
## 定义新的命令行参数
def pytest_addoption(parser):
parser.addoption("--env", action="store", default="dev",
help="Environment to run tests in")
接收命令行参数值到 request 并且实现切换环境参数:
@pytest.fixture(scope="session", autouse=True)
def setup_environment_setting(request):
env_name = request.config.getoption("--env")
ensure_env_settings(env_name)
这个时候针对步骤 1 中的那个测试运行以下四个环境参数的命令,就会得到不同的测试结果了,
也就是这个环境变量生效了.
poetry run pytest tests/test_settings.py --evn default
poetry run pytest tests/test_settings.py --evn test
poetry run pytest tests/test_settings.py --evn product
poetry run pytest tests/test_settings.py --evn product_new