Django实现接口自动化平台(六)httprunner(2.x)基本使用【持续更新中】

上一章:

Django实现接口自动化平台(五)httprunner(2.x)基本使用【持续更新中】_做测试的喵酱的博客-CSDN博客

下一章:

Django实现接口自动化平台(七)数据库设计_做测试的喵酱的博客-CSDN博客

一、 api 文件夹(没有任何数据依赖的场景)

api 文件夹:执行接口case的最小单元。如果一个接口case,没有任何数据依赖,就可以直接在api文件夹中,完成编写。

如不依赖登录信息的接口:

api/baidu_api.yml

name: 百度接口
variables:
    var1: value1
    var2: value2
request:
    url: https://ug.baidu.com/mcp/pc/pcsearch
    method: POST
    headers:
        Content-Type: "application/json"
    json:
        invoke_info: {"pos_1":[{}],"pos_2":[{}],"pos_3":[{}]}
validate:
    - eq: ["status_code", 200]

 执行case:

hrun api/baidu_api.yml --report-dir=reports

二、 实现数据/接口依赖的case场景(testcases 文件夹)

2.1 举例

查看商品列表接口 goods/list ,依赖登录接口/user/login/ 

需要先通过/user/login/  获取登录信息token

再拿着token,去请求goods/list接口。

2.1.1 在api文件夹中,编写/goods/list 接口 ,/user/login/  的基础信息。

/user/login/  登录接口信息:/api/login_api.yml

name: '登录api接口'

base_url: "${ENV(BASE_URL)}"
request:
    url: "/user/login/"
    method: POST

    headers:
        Content-Type: "application/x-www-form-urlencoded"
        User-Agent: "Mozilla/5.0"

    data:
        username: "$username"
        password: "$password"

    verify: false

validate:
    - eq: ["status_code", 200]

/goods/list 接口信息:/api/goods_list_api.yml

name: "获取项目列表数据"
base_url: "${ENV(BASE_URL)}"

request:
    url: "/projects/"
    method: GET
    headers:
        Accept: "application/json"
        Authorization: "JWT $TOKEN"
    params:
        size: 3
        page: 2

validate:
    - eq: ["status_code", 200]
    - eq: ["json.results.0.id", 3]

注意:

获取商品列表接口/goods/list,需要依赖token,我们在header中,编写token时,直接使用变量的形式 $TOKEN 就可以了。(在后续步骤中,我们需要提供一个名称为TOKEN的变量)

2.1.2 在testcases文件夹中,组装/goods/list用例

/testcases/goods_list_testcase.yml

# 指定用例的全局配置信息
config:
    name: "获取商品列表数据接口测试"

teststeps:
-
    name: "先登录"
    # 指定导入api文件夹下的接口的api最小执行单元
    api: "/api/login_api.yml"
    # 从相应结果中提取数据,并设置变量
    # 设置的变量,可以在当前yaml用例文件下方任意地方调用
    extract:
        - TOKEN: "content.token"

-
    name: "获取项目列表数据接口"
    api: "/api/goods_list_api.yml"

1、config 设置全局配置信息

2、teststeps 模块下,开始组装用例

3、第一步,先登录,调用执行登录接口/api/login_api.yml,然后将返回值token设置为变量

extract:
        - TOKEN: "content.token"

3、第二步,调用获取商品接口。(不需要手动传token变量)

三、自定义函数&动态参数

整体步骤:

1、在debugtalk.py 中,自定义函数

2、在yaml文件中,调用自定义函数

3.1 、在debugtalk.py 中,自定义函数

举个例子,定义两个函数,一个是生成随机数,一个是求和。


import time
import random


def sleep(n_secs):
    time.sleep(n_secs)
def get_random_num():
    return random.randint(1,1000)

def get_sum(x,y):
    return x+y

3.2 在yaml文件中,调用自定义函数

在yaml文件中,调用自定义函数,使用${方法名称()}

支持传参,参数也可以是变量

    json:
        id: "${get_random_num()}"
        total: "${get_sum(1,$price)}"

四、定义测试套件testsuites

测试套件testsuites的主要作用就是:

  • 1、批量执行case
  • 2、用不同的变量数据,组成不同的case

我们可以将api、testcases中的所有的动态数据,以变量表示。然后在testsuites中,写入不同的变量,组成不同的case。

4.1 testsuites 中直接写入不同的变量,组成多个case

一个接口,根据不同的传参,组成不同的case。

举例:

登录接口,

testsuites/login_testsuite.yml

# 指定测试套件中的全局配置信息
config:
    name: "测试条件"

# 指定套件中的用例
testcases:
-
    name: "登录接口测试"
    testcase: "testcases/login_testcase.yml"
    parameters:
    - title-username-password-status_code-msg:
      - ["正常登录", "miaojiang", "123456", 200, "token"]
      - ["用户名为空", "", "123456", 400, "username"]
      - ["密码为空", "miaojiang", "", 400, "password"]
      - ["密码不正确", "miaojiang", "1234567", 400, "non_field_errors"]

config:测试套件的全局配置

testcases: 指定调用的登录接口case

parameters: 变量模块,以下是整个接口case,所有需要的变量的输入值

- title-username-password-status_code-msg: 整个接口中,(api、testcases中)所有涉及到的变量名称,将这些变量列出来,然后在-[]中,将变量的值一一对应。如下,就是登录接口的四条case。

    - title-username-password-status_code-msg:
      - ["正常登录", "miaojiang", "123456", 200, "token"]
      - ["用户名为空", "", "123456", 400, "username"]
      - ["密码为空", "miaojiang", "", 400, "password"]
      - ["密码不正确", "miaojiang", "1234567", 400, "non_field_errors"]

4.2 用csv文件存储一个接口所有case所需要的变量的值

在4.1 中,数据驱动,直接将数据写在了testsuites文件中。如果数据过多的话,会显得比较乱,我们可以将数据存储到csv文件中。

1、定义一个csv文件,存仓case数据

data/data.csv

title,username,password,status_code,msg
正常登录,miaojiang,123456,200,token
密码错误,miaojiang,123457,400,non_field_errors
账号错误,miaojiang,123456,400,non_field_errors
用户名为空,,123456,400,username
密码为空,miaojiang,,400,password

注意:

第一行,是所有涉及到的变量的名称,以逗号隔开。

2、在testsuites/login_testsuite.yml 中,引入csv文件

# 指定测试套件中的全局配置信息
config:
    name: "测试条件"

# 指定套件中的用例
testcases:
-
    name: "登录接口测试"
    testcase: "testcases/login_testcase.yml"
    parameters:
        - title-username-password-status_code-msg: ${P(data/data.csv)}

注意:

1、parameters下,设置接口所有case需要的数据

2、 title-username-password-status_code-msg,是所有涉及到的变量的名称,以-分割

3、${P()} 固定格式,读取某个文件

${P(data/data.csv)}

文件路径,为相对路径,或者绝对路径

4.3 函数方法的返回值为接口所有case需要的数据

1、在debugtalk.py中,定义一个方法,返回case所有需要的数据(为一个list),

def get_accounts():
    accounts = [
        {"title": "正常登录", "username": "miaojiang", "password": "123456",
            "status_code": 200, "msg": "token"},
        {"title": "密码错误", "username": "miaojiang", "password": "123457",
            "status_code": 400, "msg": "non_field_errors"},
        {"title": "账号错误", "username": "miaojiang", "password": "123456",
            "status_code": 400, "msg": "non_field_errors"},
        {"title": "用户名为空", "username": "", "password": "123456",
            "status_code": 400, "msg": "username"},
        {"title": "密码为空", "username": "miaojiang", "password": "",
            "status_code": 400, "msg": "password"},
    ]
    return accounts

注意:

  • 1、函数返回值,整体为一个list
  • 2、list中,每一个元素,是一个字典。每一个元素/字典,就对应一条case
  • 3、字典中,key为变量的名称,value为变量的值。

2、在testsuites/login_testsuite.yml 中,调用方法

# 指定测试套件中的全局配置信息
config:
    name: "测试条件"

# 指定套件中的用例
testcases:
-
    name: "登录接口测试"
    testcase: "testcases/login_testcase.yml"
    parameters:
        - title-username-password-status_code-msg: ${get_accounts()}

注意:

  • ${函数名称()}

五、运行测试套testsuites

格式:

hrun 测试套文件相对路径/绝对路径

举例:

hrun testsuites/login_testsuite.yml

猜你喜欢

转载自blog.csdn.net/qq_39208536/article/details/131134150