等峰也等你

博客园 首页 新随笔 联系 订阅 管理

 

多环境介绍

 
环境使用场景备注
dev 开发环境 开发自测
QA 测试环境 QA日常测试
preprod 预发布环境 回归测试、产品验测试
prod 线上环境 用户使用的环境

多套被测环境切换的意义和价值

 
  • 访问信息: 不同环境的域名或ip都不一样,部分产品Host也会有区别
  • 配置信息: DB、Redis、ES等中间件的配置信息不同环境也不一样
# 每条用例的url都是写死的,一旦切换环境,所有的用例都要修改。
r = requests.post("https://httpbin.ceshiren.com/post",
                    data=data)

实现目标

 
  1. 全局控制,一键切换
  2. 可维护性和扩展性强,可以应对不断演进的环境变化。
  • 环境管理
  • 环境切换

实现方案-环境管理

 
  • 使用环境管理文件
    • 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"


 
posted on 2024-01-17 18:47  等峰也等你  阅读(12)  评论(0编辑  收藏  举报