pytest + yaml 框架 -13.多环境配置切换

2023-01-03 14:07:28 浏览数 (1)

前言

当我们在测试环境写好自动化的代码,领导说你把代码部署到联调环境再测一测,这时候去改用例里面的配置是很痛苦的。 所以我们在设计自动化用例的时候,就先要想到多环境的配置与切换。

多环境配置

如果需用到多套环境 test/uat 等,那么应该在用例的根目录(pytest.ini 同级文件)创建一个config.py 文件 pip 安装插件

代码语言:javascript复制
pip install pytest-yaml-yoyo

多套环境切换功能在 v1.1.0 版本上实现

代码语言:javascript复制
class Config:
    """多套环境的公共配置"""
    version = "v1.0"

class TestConfig(Config):
    """测试环境"""
    BASE_URL = 'http://192.168.1.1:8000'
    MYSQL_HOST = "192.168.1.1"
    MYSQL_USER = "root"
    MYSQL_PASSWORD = "123456"
    MYSQL_PORT = 3306
    MYSQL_DATABASE = "xxx"   # 连接数据的库名

class UatConfig(Config):
    """联调环境"""
    BASE_URL = 'http://192.168.1.3:8080'
    MYSQL_HOST = "http://192.168.1.3"
    MYSQL_USER = "root"
    MYSQL_PASSWORD = "654321"
    MYSQL_PORT = 3306
    MYSQL_DATABASE = "xxx"  # 连接数据的库名

# 环境关系映射,方便切换多环境配置
env = {
    "test": TestConfig,
    "uat": UatConfig
}

按以上的配置格式,配置不同的环境,最后做一个环境名称和配置的映射关系,必须是 env 命名,格式如下

代码语言:javascript复制
env = {
    "test": TestConfig,
    "uat": UatConfig
}

那么在执行用例的时候,可以选择执行test 环境还是uat 环境,有 2 种方式可以配置待执行的环境

方法一: 在pytest.ini 中配置

代码语言:javascript复制
[pytest]

env = test

方法二: 执行 pytest 命令的时候设置

代码语言:javascript复制
pytest --env test

如果2个地方都有设置,那么优先级是:命令行参数--env test 大于 pytest.ini 中配置env = test.

测试环境的 BASE_URL

在上一篇中讲到 pytest yaml 框架 -11.全局 base_url 配置

代码语言:javascript复制
环境地址优先级使用如下:
1.全局配置命令行参数--base-url优先级大于 pytest.ini 文件中的base_url 配置。
2.yaml 文件 config 中的base_url 优先级大于全局配置
3.request 请求的url 如果是绝对地址,那么base_url 无效
总的来说 : url 绝对地址 > config 中的base_url > 命令行参数--base-url > pytest.ini 文件中的base_url

这里我们新增了一个在config.py 中也可以配置全局的base_url (config.py 中的配置用大写命名 BASE_URL)

如果在 config.py 中配置全局的 BASE_URL ,那么也会生效。优先级会低于命令行和 pytest.ini 的配置

总的来说:url 绝对地址 > config 中的base_url > 命令行参数—base-url > pytest.ini 文件中的 base_url > config.py 的 BASE_URL

多个base_url 切换

有同学提到说,如果一个用例中有多个base_url 需要切换,该如何解决?

我们在配置项中BASE_URL 项是设置默认的全局base_url地址,如果有多个地址,我们还可以用其它的配置参数,比如 BLOG_URLDEMO_URL

代码语言:javascript复制
class TestConfig(Config):
    """测试环境"""
    BASE_URL = 'http://192.168.1.1:8000'
    BLOG_URL = 'https://www.cnblogs.com'
    DEMO_URL = 'http://httpbin.org'
    MYSQL_HOST = "192.168.1.1"
    MYSQL_USER = "root"
    MYSQL_PASSWORD = "123456"
    MYSQL_PORT = 3306
    MYSQL_DATABASE = "xxx"   # 连接数据的库名

上面的配置中,我们就配置了3个环境地址

代码语言:javascript复制
    BASE_URL = 'http://192.168.1.1:8000'
    BLOG_URL = 'https://www.cnblogs.com'
    DEMO_URL = 'http://httpbin.org'

在yaml 用例中,如果没有传base_url, 那么会用默认的 BASE_URL = 'http://192.168.1.1:8000'

使用示例

代码语言:javascript复制
config:
  name: 示例

用例:
-
  name: GET
  request:
    method: GET
    url: /get
  validate:
    - eq: [status_code, 200]

当一个接口中同时用到3个测试地址 BASE_URLBLOG_URLDEMO_URL 时,可以通过 env 变量取值,如: ${env.BLOG_URL}

代码语言:javascript复制
config:
  name: 示例

用例:

-
  name: GET
  request:
    method: GET
    url: ${env.BLOG_URL}/yoyoketang
  validate:
    - eq: [status_code, 200]

-
  name: GET
  request:
    method: GET
    url: ${env.DEMO_URL}/get
  validate:
    - eq: [status_code, 200]

-
  name: GET
  request:
    method: GET
    url: /get
  validate:
    - eq: [status_code, 200]

其它配置参数

如果配置中需要加其它配置参数

代码语言:javascript复制
class TestConfig(Config):
    """测试环境"""
    BASE_URL = 'http://192.168.1.1:8000'
    USER = 'test'
    TEL = '100860000'

那么在用例中引用配置参数可以用 ${env.配置参数} 取到配置中的值。

0 人点赞