实现方案-环境管理
- 使用环境管理文件
- yaml
- ini
- 常量类
- 使用不同的文件管理不同的环境
- 在接口用例中只指定path,不指定url
# test.yaml 测试环境的配置
env_config:
base_url: https://httpbin.org/
db_config:
host: httpbin.org
username: xxxx
password: xxxx
redis_config:
host: httpbin.org
port: 8100
# dev.yaml 开发环境的配置
env_config:
base_url: https://httpbin.ceshiren.com/
db_config:
host: httpbin.ceshiren.com
username: xxxx
password: xxxx
redis_config:
host: httpbin.ceshiren.com
port: 8100
环境切换
通过环境变量进行切换
- 设置环境变量
- 读取环境变量
# mac设置环境变量
export env=dev
# windows 设置环境变量
set env=dev
# 在python中读取环境变量
import os
import requests
import yaml
class TestMulitiEnv:
def setup_class(self):
default = os.getenv("env", default="test")
data = yaml.safe_load(open(f"{default}.yaml"))
self.env = data
self.base_url = self.env["env_config"]["base_url"]
def test_devenv(self):
path = "/get"
r = requests.get(self.base_url+path)
assert r.json()["headers"]["Host"] == "httpbin.org"
def test_testenv(self):
path = "/post"
r = requests.post(self.base_url+path)
assert r.json()["headers"]["Host"] == "httpbin.ceshiren.com"
使用命令行进行切换
与《selenium 多浏览器处理》章节逻辑相同
participant 命令行参数 as command
participant 测试用例 as cases
participant 环境配置 as env
autonumber
command -> cases : 通过命令执行测试用例,通过参数指定环境
command -> env: 通过命令行参数获取指定的环境
cases -> env: 测试用例获取指定的环境。如果没有指定,那么就执行默认的环境
# conftest.py
global_env = {}
def pytest_addoption(parser):
# group 将下面所有的 option都展示在这个group下。
mygroup = parser.getgroup("hogwarts")
# 注册一个命令行选项
mygroup.addoption("--env",
# 参数的默认值
default='test',
# 存储的变量
dest='env',
# 参数的描述信息
help='设置接口自动化测试默认的环境'
)
def pytest_configure(config):
default_ev = config.getoption("--env")
tmp = {"env": default_ev}
global_env.update(tmp)
# test_muliti_env.py
class TestMulitiEnv:
def setup_class(self):
# 获取命令行配置的环境变量
default = global_env.get("env", "test")
data = yaml.safe_load(open(f"{default}.yaml"))
self.env = data
self.base_url = self.env["env_config"]["base_url"]
def test_devenv(self):
path = "/get"
r = requests.get(self.base_url+path)
assert r.json()["headers"]["Host"] == "httpbin.org"
def test_testenv(self):
path = "/post"
r = requests.post(self.base_url+path)
assert r.json()["headers"]["Host"] == "httpbin.ceshiren.com"