• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

pytest接口自动化-参数化:csv文件

武飞扬头像
派大星的喵
帮助1

实际工作中如何去实现数据和代码的分离
1.通过创建csv文件来存请求数据(请求参数,请求方法,请求地址,请求结果)
2.使用python自带的文件读取方法
3.读取csv文件时需要注意首行,如首行对应的是键,那么需要跳过首行
4.由于csv文件里面的内容格式为字符串,这时需要将字符串转换为列表格式
5.使用pytest中的parametrize函数来读取csv文件里面的参数
6.由于前面将csv的数据格式转换为列表格式了,那么可以通过索引去定位需要的数据
7.最后再断言返回结果
8.由于返回的内容是字典类型,csv文件里面是列表类型,现在是无法断言的,这时就需要对csv里面的内容进行反序列化操作。
(1).先通过反序列化将csv里面数据转为字典
(2).然后再取字典里面对应的键
9.建议:其实不管是csv,json,yaml,excel都是为了实现代码和数据的分离,方便后续的维护,可以适当根据自己喜好调整。我是比较喜欢yaml文件的,能帮我省下不少事。比如数据类型。

1、读取csv

# 读取csv文件
def readCsv():
    # 定义一个列表(由于csv文件里面的数据类型是字符串,所以需要先定义列表,后面再反序列化为字典)
    data=list()
    with open('csv.csv','r',encoding='utf-8')as f:
        reader = csv.reader(f)
        # 不执行首行数据
        next(reader)
        for item in reader:
            # 将csv里面的数据追加到列表当中
            data.append(item)
        return data

2、参数化及使用csv文件里面的数据

# 参数化
@pytest.mark.parametrize('data',readCsv())
def test_login(data):
    r = requests.post(
        url=data[0],
        # headers=json.loads(data[1]),
        json=json.loads(data[1]))
    # 先将csv文件里面预期结果反序列化为字典
    int1 = json.loads(data[2])
    # 再取到对应的code的值
    int2 = int1["code"]  #这一步可以直接省去,后面直接调用 int1["code"] 就行
    # 这时断言就不会出现数据类型不一致的问题了
    assert r.json()["code"] == int2

3.完整代码
(1).csv数据

url,parametrize,expect
http://xxxx:2222/login,"{""account"":""pos"",""passwd"":""2""}","{""code"":0}"
http://xxxx:2222/login,"{""passwd"":""2""}","{""code"":100999}"
http://xxxx:2222/login,"{""account"":""passwd""}","{""code"":100999}"
http://xxxx:2222/login,"{""account"":""12321"",""passwd"":""2""}","{""code"":1100}"
http://xxxx:2222/login,"{""account"":""pos"",""passwd"":""12321""}","{""code"":1100}"

(2).代码

import csv
import pytest
import requests
import json



'''
实际工作中如何去实现数据和代码的分离
1.通过穿件csv文件来存请求数据(请求参数,请求方法,请求地址,请求结果)
2.使用python自带的文件读取方法
3.读取csv文件时需要注意首行,如首行对应的是键,那么需要跳过首行
4.由于csv文件里面的内容格式为字符串,这时需要将字符串转换为列表格式
5.使用pytest中的parametrize函数来读取csv文件里面的参数
6.由于前面将csv的数据格式转换为列表格式了,那么可以通过索引去定位需要的数据
7.最后再断言返回结果
8.由于返回的内容是字典类型,csv文件里面是列表类型,现在是无法断言的,这时就需要对csv里面的内容进行反序列化操作。
    (1).先通过反序列化将csv里面数据转为字典
    (2).然后再取字典里面对应的键
'''

# 读取csv文件
def readCsv():
    # 定义一个列表(由于csv文件里面的数据类型是字符串,所以需要先定义列表,后面再反序列化为字典)
    data=list()
    with open('csv.csv','r',encoding='utf-8')as f:
        reader = csv.reader(f)
        # 不执行首行数据
        next(reader)
        for item in reader:
            # 将csv里面的数据追加到列表当中
            data.append(item)
        return data

# 参数化
@pytest.mark.parametrize('data',readCsv())
def test_login(data):
    r = requests.post(
        url=data[0],
        # headers=json.loads(data[1]),
        json=json.loads(data[1]))
    # 先将csv文件里面预期结果反序列化为字典
    int1 = json.loads(data[2])
    # 再取到对应的code的值
    int2 = int1["code"]  #这一步可以直接省去,后面直接调用 int1["code"] 就行
    # 这时断言就不会出现数据类型不一致的问题了
    assert r.json()["code"] == int2

    # 查看反序列化后的数据类型
    # print(type(int2))
    # 查看接口返回的数据类型
    # print(type(r.json()["code"]))

if __name__ == '__main__':
    pytest.main('-v','-s','test_csv.py')
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfjbaec
系列文章
更多 icon
同类精品
更多 icon
继续加载