文章目录
- 一、意义
- 二、实现目标
- 三、实现方案
- 1、使用环境管理文件
- 2、使用不同的文件管理不同的环境(建议使用)
- 3、在接口用例中指定path,不指定url
- 4、环境切换
- a、通过环境变量进行切换
- b、通过命令行参数进行切换
- 四、代码实现
- 1、通过环境变量进行切换
- 2、通过命令行参数进行切换
一、意义
访问信息:不同环境的域名或ip都不一样,部分产品Host也会有区别
配置信息:DB、Redis、ES等中间件的配置信息不同环境也不一样
项目 | Value |
---|---|
dev | 开发环境,开发自测 |
test | 测试环境,日常测试 |
preprod | 预发布环境,回归测试,产品验收测试 |
prod | 线上环境,用户使用的环境 |
二、实现目标
1、全局控制
2、可维护性和拓展性强,可以应对不断演进的环境变化(环境管理、环境切换)
三、实现方案
1、使用环境管理文件
yaml
pytest.ini
常量类
2、使用不同的文件管理不同的环境(建议使用)
当测试环境中的信息发生变化了,只需要修改测试环境中的数据
当开发环境中的信息发生变化了,只需要修改开发环境中的数据
实现环境隔离
如果文件中的配置信息少,可以使用同一个文件进行管理
3、在接口用例中指定path,不指定url
4、环境切换
a、通过环境变量进行切换
1、设置环境变量(尽量不要使用env)
2、切换环境变量
b、通过命令行参数进行切换
通过hook函数实现
四、代码实现
1、通过环境变量进行切换
假设https://www.sogou.com为开发环境
https://www.baidu.com为测试环境
在接口用例中只指定path,不指定url;
从yaml文件读取数据
path_env=os.getenv("interface_env",default='test'):
根据interface_env传的变量,获取path_env环境;默认为test环境
env=yaml.safe_load(open(f"{path_env}.yaml",encoding='utf-8'))
根据path_env环境,打开对应的yaml文件,获取数据
命令行验证方法:
如果使用powsershell,需要使用 $env:interface_env=“dev” 命令设置环境变量
使用命令行执行测试用例 pytest test_muliti_env.py
如果使用windows, 需要使用 set interface_env = dev 命令设置环境变量
使用命令行执行测试用例 pytest test_muliti_env.py
import os
import requests
import yaml
'''
设置临时环境变量
windows set interface_env=test
'''
class TestMulitiEnv:
def setup_class(self):
#todo 目的:在接口用例中只指定path,不指定url
# 从yaml文件读取数据
# 第一种方式从环境读取名称为interface_env的配置环境
path_env=os.getenv("interface_env",default='test')
env=yaml.safe_load(open(f"{path_env}.yaml",encoding='utf-8'))
#读取对应的文件
self.base_url=env['base_url']
print(self.base_url)
def test_devenv(self):
"""
验证是否为开发环境
:return:
"""
r=requests.get(url=self.base_url)
print(r.json())
def test_testenv(self):
"""
验证是否为测试环境
:return:
"""
r = requests.get(url=self.base_url)
设置临时环境变量
windows set interface_env=test
命令行执行:
(api_env) D:\api_project\L4>set interface_env=test
(api_env) D:\api_project\L4>pytest test_muliti_env1.py
如果是开发环境的用例报错说明验证成功
命令行执行:
(api_env) D:\api_project\L4>set interface_env=dev
(api_env) D:\api_project\L4>pytest test_muliti_env1.py
如果是测试环境的用例报错说明验证成功
如果不设置set interface_env=dev,直接运行pytest test_muliti_env1.py
默认使用test测试环境
2、通过命令行参数进行切换
conftest.py
pytest_addoption(parser:Parser):是添加命令行参数使用
pytest_configure(config:Config):获取设置的命令行参数
mygroup=parser.getgroup("zhilong")
:注册一个命令行组
mygroup.addoption("--env",
default='test',
dest='env',
help='设置接口自动化测试的环境')
:
第一个参数为指定的命令行的参数形式,
default:参数的默认值;
dest:起别名;
help:提示信息
from _pytest.config.argparsing import Parser
from _pytest.config import Config
global_env={}
#hook函数,是添加命令行参数使用
def pytest_addoption(parser:Parser):
#todo 注册一个命令行组
mygroup=parser.getgroup("zhilong")
#todo 第一个参数为指定的命令行的参数形式
# 注册一个命令行参数
# default:参数的默认值;dest:起别名;help:提示信息
mygroup.addoption("--env",
default='test',
dest='env',
help='设置接口自动化测试的环境')
#获取设置的命令行参数
def pytest_configure(config:Config):
default_env=config.getoption("--env")
tmp={"env":default_env}
global_env.update(tmp)
命令行执行:
(api_env) D:\api_project\L4>pytest test_muliti_by_option1.py --env=test
如果是开发环境的用例报错说明验证成功
命令行执行:
(api_env) D:\api_project\L4>pytest test_muliti_by_option1.py --env=dev
如果是测试环境的用例报错说明验证成功