多环境介绍
环境 | 使用场景 | 备注 |
---|---|---|
dev | 开发环境 | 开发自测 |
QA | 测试环境 | QA日常测试 |
preprod | 预发布环境 | 回归测试、产品验测试 |
prod | 线上环境 | 用户使用的环境 |
多套被测环境切换的意义和价值
- 访问信息: 不同环境的域名或ip都不一样,部分产品Host也会有区别
- 配置信息: DB、Redis、ES等中间件的配置信息不同环境也不一样
# 每条用例的url都是写死的,一旦切换环境,所有的用例都要修改。
r = requests.post("https://httpbin.ceshiren.com/post",
data=data)
实现目标
- 全局控制,一键切换
- 可维护性和扩展性强,可以应对不断演进的环境变化。
- 环境管理
- 环境切换
实现方案-环境管理
- 使用环境管理文件
- 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"