4.pytest接口自动化之yaml文件用途与数据驱动

1.yaml

(1)yaml简介

  • YAML是一种数据类型,它可以和json之间灵活的切换,支持注释、换行、字符串。
  • YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。

(2)语法

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释

(3)YAML 支持以下几种数据类型

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值

a.YAML 对象: 键值对使用冒号结构表示 key: value,冒号后面要加一个空格。

request:
    method: post
    url: http://test/api/v1/authentication/auth/
    headers:
       Content-Type: application/json
    datas:
       username: test
       password: testpassword
    validate: none

b.数组 : 以 - 开头的行表示构成一个数组

- A
- B
- C

c.纯量:纯量是最基本的,不可再分的值,包括

# 字符串
string:
    - 你好
    - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符
    - newline
      newline2    #字符串可以拆成多行,每一行会被转化成一个空格
     
# 布尔值(true,True,false,False 大小写都可以)
boolean: 
    - TRUE
    - FALSE 
  
# 整数
int:
    - 123456
   
# 浮点数
float:
    - 3.1415
   
# Null (使用~表示null)
params: ~ 

# 日期(日期必须使用ISO 8601格式,即yyyy-MM-dd)
 - 2022-07-08

#时间 (时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区)
 -  2022-07-08T10:06:31+08:00 

2.YAML文件在pytest中的用途

  • 配置文件
  • 编写测试用例

3.Pytest用例管理框架使用yaml文件做数据驱动

(1)数据驱动装饰器

  • @pytest.mark.parametrize(args1, args2)
    • args1: 参数名,用于传值
    • args2: 参数值(数据可以为:列表、元祖、字典列表、字典元祖)。注:如列表中有多个值,这个用例就执行多少次
class TestLogin:

	@pytest.mark.parametrize("testcase", ["用例1", "用例2", "用例3"])
    def test_login3(self, testcase):
        print('测试数据驱动:%s' % testcase)

# test_login3会被执行三次,每次分别把列表中的“用例1”、”用例2”、”用例3”依次传入test_login函数,分三次传入执行

4.pytest接口自动化之yaml文件用途与数据驱动_第1张图片

(2)读取yaml文件中的用例

  • b.我们已知通过数据驱动装饰器可以遍历列表中的数据,依次循环执行用例,那么我们可以将多条用例构造成一个列表数据
  • a.如何使用yaml文件写测试用例,我们知道一个请求最重要的是:请求方法,请求路径,请求头,请求参数。如:
-
  name: "测试正确账号密码登录:获取接口统一鉴权token"
  request:
    method: post
    url: http://ip/api/v1/authentication/auth/
    headers:
       Content-Type: application/json
    datas:
       username: testuser
       password: 123456
    validate: none

-
  name: "测试错误的账号登录"
  request:
    method: post
    url: http://ip/api/v1/authentication/auth/
    headers:
       Content-Type: application/json
    datas:
       username: testuser2
       password: 123456
    validate: none

-
  name: "测试错误的密码登录"
  request:
    method: post
    url: http://ip/api/v1/authentication/auth/
    headers:
       Content-Type: application/json
    datas:
       username: testuser3
       password: 123456
    validate: none

4.pytest接口自动化之yaml文件用途与数据驱动_第2张图片

  • c.有了yaml文件写好的用例,我们如何去读取yaml文件的用例,传入数据驱动器呢,我们需要写一个方法来读取yaml文件用例
def read_yaml(yaml_file_path):
    with open(os.getcwd() + yaml_file_path, encoding="utf-8") as f:
        value = yaml.load(stream=f, Loader=yaml.FullLoader)
        print(value)
        return value

4.pytest接口自动化之yaml文件用途与数据驱动_第3张图片

  • d.数据驱动装饰器传入从yaml文件中读取的用例
@pytest.mark.parametrize("testcase", read_yaml("/authentication_auth/auth.yaml"))
    def test_login3(self, testcase):
        print(testcase)

4.pytest接口自动化之yaml文件用途与数据驱动_第4张图片

  • e.从用例中,获取请求所需要的数据
   @pytest.mark.parametrize("authinfo", read_yaml("/authentication_auth/auth.yaml"))
    def test_login2(self, authinfo):
        request_obj = authinfo.get("request")
        print(authinfo)
        print("\n %s" % authinfo.get("name"))
        url = request_obj.get("url")
        method = request_obj.get("method")
        datas = json.dumps(request_obj.get("datas"))
        headers = request_obj.get("headers")
        res = requests.request(method, url=url, data=datas, headers=headers)
        if "token" in res.json().keys():
            data = {
                "token": res.json()['token']
            }
            clear_yaml()
            write_yaml(data)

# url = request_obj.get("url") 获取请求路径
# method = request_obj.get("method") 获取请求方法
#  headers = request_obj.get("headers") 获取请求头
# datas = json.dumps(request_obj.get("datas")) 获取请求数据

# requests.request(method, url=url, data=datas, headers=headers) 发送http请求:传入method、url、headers、data

# 得到响应结果

4.pytest接口自动化之yaml文件用途与数据驱动_第5张图片

你可能感兴趣的:(#,pytest,pytest,自动化,python)