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

实际工作中如何去实现数据和代码的分离
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')
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值