跳转至

环境变量

环境变量的作用

在自动化测试中,有时需要借助环境变量实现某些特定的目的,常见的场景包括:

  • 切换测试环境
  • 切换测试配置
  • 存储敏感数据(从信息安全的角度出发)

设置环境变量

使用环境变量之前,需要先在系统中设置环境变量名称和值,传统的方式为使用 export 命令(Windows系统中使用 set 命令):

$ export UserName=admin
$ echo $UserName
admin
$ export Password=123456
$ echo $Password
123456

然后,在程序中就可以对系统中的环境变量进行读取。

$ python
>>> import os
>>> os.environ["UserName"]
'admin'

除了这种方式,HttpRunner 还借鉴了 pipenv 加载.env的方式

默认情况下,在自动化测试项目的根目录中,创建.env文件,并将敏感数据信息放置到其中,存储采用name=value的格式:

$ cat .env
UserName=admin
Password=123456
PROJECT_KEY=ABCDEFGH

同时,.env文件不应该添加到代码仓库中,建议将.env加入到.gitignore中。

HttpRunner 运行时,会自动将.env文件中的内容加载到运行时(RunTime)的环境变量中,然后在运行时中就可以对环境变量进行读取了。

若需加载不位于自动化项目根目录中的.env,或者其它名称的.env文件(例如production.env),可以采用--dot-env-path参数指定文件路径:

$ hrun /path/to/testcase.yml --dot-env-path /path/to/.env --log-level debug
INFO     Loading environment variables from /path/to/.env
DEBUG    Loaded variable: UserName
DEBUG    Loaded variable: Password
DEBUG    Loaded variable: PROJECT_KEY
...

引用环境变量

在 HttpRunner 运行时,读取环境变量的逻辑需要在 debugtalk.py 文件中实现,通过 os.environ 获取指定的环境变量数据。

import os

UserName = os.environ["UserName"]           # admin
Password = os.environ["Password"]           # 123456
PROJECT_KEY = os.environ["PROJECT_KEY"])    # ABCDEFGH

然后,在 YAML/JSON 格式的测试用例中,就可以通过$var的方式引用环境变量的值了。

- test:
    name: login
    request:
        url: http://host/api/login
        method: POST
        headers:
            Content-Type: application/json
        json:
            username: $UserName
            password: $Password
        validate:
            - eq: [status_code, 200]

或者借助函数对环境变量进行读取和处理后,再进行引用。

例如,若发起请求的密码需要先与密钥进行拼接并生成MD5,那么就可以在 debugtalk.py 文件中实现如下函数:

def get_encrypt_password():
    raw_passwd = os.environ["Password"]
    PROJECT_KEY = os.environ["PROJECT_KEY"])
    password = (raw_passwd + PROJECT_KEY).encode('ascii')
    return hmac.new(password, hashlib.sha1).hexdigest()

然后,在 YAML/JSON 格式的测试用例中,就可以通过${func()}的方式引用环境变量的值了。

- test:
    name: login
    request:
        url: http://host/api/login
        method: POST
        headers:
            Content-Type: application/json
        json:
            username: $UserName
            password: ${get_encrypt_password()}
        validate:
            - eq: [status_code, 200]