五、YAML文件实现接口自动化

一、@pytest.mark.parametrize()基本用法

@pytest.mark.parametrize() 是用来给用例传递参数的一种方式
@pytest.mark.parametrize(args_name,args_value)
# args_name:参数名
# args_value:参数值(列表,元祖,字典列表,字典元祖),有多个值用例就会执行多少次
# 创建 test_api.py 文件

import pytest


class TestApi:

    @pytest.mark.parametrize("args", ["测试", "自动化", "学习"])
    def test_api_01(self, args):  # parametrize的参数"args" 和 test_api_01的参数 args一样
        print(args)

    @pytest.mark.parametrize("name, age", [["王勇", 29], ["薇薇", 18]])
    def test_api_02(self, name, age):
        print(name, age)


if __name__ == '__main__':
    pytest.main(["-vs", "./test_api.py"])

二、YAML 文件操作

2.1 yaml 简介以及语法规则

yaml是一种数据格式,支持注释,换行,多行字符串,裸字符串(整形,字符串)。

1.区分大小写
2.使用缩进表示层级,不能使用tab键缩进,只能用空格(和python一样)
3.缩进没有数量的,只要前面是对其的就行。
4.注释是#

2.2 yaml数据组成格式

YAML、YML在线编辑(校验)器  https://www.bejson.com/validators/yaml_editor/#google_vignette

2.2.1 map 对象(键值对 键:(空格)值)

# 多行的写法
wangyong:
    name: "王勇"
    age: 29

 

// json 格式

{
  "wangyong": {
    "name": "王勇",
    "age": 29
  }
}

 

# 一行写法
wangyong: {name: 王勇, age: 29}

// json 格式

{
  "wangyong": {
    "name": "王勇",
    "age": 29
  }
}

2.2.2 数组(list),用一组横线开头

# 多行的写法
-
    wangyong:
        - name: 王勇
        - age: 29
-
    weiwei:
        - name: 薇薇
        - age: 18

// json 格式

[
  {
    "wangyong": [
      {
        "name": "王勇"
      },
      {
        "age": 29
      }
    ]
  },
  {
    "weiwei": [
      {
        "name": "薇薇"
      },
      {
        "age": 18
      }
    ]
  }
]

 

# 一行的写法
-
    wangyong: [{name: 王勇}, {age: 29}]
    weiwei: [{name: 薇薇}, {age: 18}]

 

// json 格式

[
  {
    "wangyong": [
      {
        "name": "王勇"
      },
      {
        "age": 29
      }
    ]
  },
  {
    "weiwei": [
      {
        "name": "薇薇"
      },
      {
        "age": 18
      }
    ]
  }
]

 

三、YAML实现接口自动化

3.1 安装python使用的yaml

pip install pyyaml

3.2 读取yaml文件操作

# test_api.yaml

-
    wangyong:
        - name: 王勇
        - age: 29
-
    weiwei:
        - name: 薇薇
        - age: 18
# yaml_util.py
import yaml


class YamlUtil:
    yaml_file = None

    def __init__(self, yaml_file):
        """
        通过 init 方法 把 yaml 文件传入到这个类
        :param yaml_file:
        """
        self.yaml_file = yaml_file

    def read_yaml(self):
        """
        读取 yaml, 对 yaml 文件进行发序列化, 就是把 yaml 格式转换成 字典格式
        :return:
        """
        with open(self.yaml_file, encoding="utf-8") as f:
            # yaml.load(stream, Loader) # Loader 加载方式
            value = yaml.load(f, Loader=yaml.FullLoader)
            """
            [{'wangyong': [{'name': '王勇'}, {'age': 29}]}, 
            {'weiwei': [{'name': '薇薇'}, {'age': 18}]}] 
            <class 'list'>
            """
            print(value, type(value))

    def write_yaml(self):
        """
        :return:
        """
        pass


if __name__ == '__main__':
    yaml_util = YamlUtil("./interface_testcase/test_api.yaml")
    yaml_util.read_yaml()

3.3 使用yaml文件实现接口自动化简单操作

框架如下

 

# testcase/interface_testcase/test_api.py

import pytest
import requests
from testcase.yaml_util import YamlUtil


class TestApi:

    # 访问微信公众号接口测试
    @pytest.mark.parametrize("args", YamlUtil('./testcase/interface_testcase/test_api.yaml').read_yaml())
    def test_request_url(self, args):
        # print(args)
        url = args['request']["url"]
        params = args["request"]["params"]
        res = requests.get(url, params=params)  # 目前网页已经无法访问,思路是这个思路
        # print(res.text)  # 获取返回文本内容
        # assert args["vaildate"]["eq"] in res.text  断言不全,可能存在用例失败的情况,所以断言需要封装
# testcase/interface_testcase/test_api.yaml
# 用例1
-
    name: 获取token鉴权码的接口
    request:
        url: https://api.weixin.gg.com/cgi-bin/token
        method: get
        headers:
            Content-Type: application/json
        params:
            grant_type: client_credential
            ppid: wx6b11b3efd1cdc290
            secret: 106a9c6157c4db5f6029918738f9529d
    vaildate:
        - eq: {express_in: 7200}

# 用例2
-
    name: 获取token鉴权码的接口
    request:
        url: https://api.weixin.gg.com/cgi-bin/token
        method: get
        headers:
            Content-Type: application/json
        params:
            ppid: wx6b11b3efd1cdc290
            secret: 106a9c6157c4db5f6029918738f9529d
    vaildate:
        - eq: {express_in: 7200}
# testcase/yaml_util.py

import yaml
import os


class YamlUtil:
    yaml_file = None

    def __init__(self, yaml_file):
        """
        通过 init 方法 把 yaml 文件传入到这个类
        :param yaml_file:
        """
        self.yaml_file = yaml_file

    def read_yaml(self):
        """
        读取 yaml, 对 yaml 文件进行发序列化, 就是把 yaml 格式转换成 字典格式
        :return:
        """
        with open(self.yaml_file, encoding="utf-8") as f:
            # yaml.load(stream, Loader) # Loader 加载方式
            value = yaml.load(f, Loader=yaml.FullLoader)
            """
            [{'wangyong': [{'name': '王勇'}, {'age': 29}]}, 
            {'weiwei': [{'name': '薇薇'}, {'age': 18}]}] 
            <class 'list'>
            """
            return value

    def write_yaml(self):
        """
        :return:
        """
        pass
# all.py

import os
import pytest


if __name__ == '__main__':
    pytest.main()
    os.system('allure generate ./temp -o ./report --clean')
;; pytest.ini
[pytest]
addopts = -vs --alluredir ./temp
testpaths = ./testcase/interface_testcase/test_api.py
python_files = test*.py
python_classes = Test*
python_functions = test
markers =
    smoke:冒烟模块
    usermanage:用户管理模块
    productmanage:商品管理模块

 

posted on 2024-07-30 10:34  软饭攻城狮  阅读(89)  评论(0)    收藏  举报

导航