接口之用例编写、验证

一、用Excel编写用例(xlsx格式)

截图仅供参考,实际用例编写需要根据实际情况来。

二、用例加载、验证

 1、数据的加载

import xlrd,xlwt
#python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库

def datacel():
    try:
        filepath='.\test_case\jenkins_case.xlsx'
        file=xlrd.open_workbook(filepath)#打开excel文件工作簿
        me=file.sheets()[3]#指定到具体sheet4表
        nrows=me.nrows#读行数
        #用例ID
        listid=[]
        # 用例名称
        listname = []
        # key
        listkey = []
        #参数
        listcontent=[]
        #url
        listurl=[]
        #请求方式
        listfangshi=[]
        #断言 期望值
        listqiwang=[]

        for i in range(1,nrows):
            listid.append(me.cell(i,0).value)
            listname.append(me.cell(i, 1).value)
            listkey.append(me.cell(i,2).value)
            listcontent.append(me.cell(i,3).value)
            listurl.append(me.cell(i,4).value)
            listfangshi.append(me.cell(i,5).value)
            listqiwang.append(me.cell(i,6).value)
        return listid,listname,listkey,listcontent,listurl,listfangshi,listqiwang
    except:
        print("数据错误,请检查表格")

def makedata():
    listid, listname, listkey, listcontent, listurl, listfangshi, listqiwang=datacel()
    make_data=[]
    for i in range(len(listid)):
        make_data.append({'url':listurl[i],'key':listkey[i],'content':listcontent[i],
                          'fangshi':listfangshi[i],'qiwang':listqiwang[i]})
    return make_data

if __name__ == '__main__':
    data_test = makedata()
    for i in range(len(data_test)):
        print(data_test[i])

2、数据使用

import unittest, requests
from ddt import ddt,data   #数据驱动
from unittest_excel.get_excel import makedata   #引用数据加载模块

data_exce=makedata()        #变量=makedata()返回值 list,每个元素是字典、用例

@ddt
class TestStringMethods(unittest.TestCase):

    def setUp(self):
        print('+++')

    def tearDown(self):
        print('---')

    @data(*data_exce)
    def test_url(self,data_exce):
        print(data_exce['url'])
        print(data_exce['key'])
        print(data_exce['content'])
        print(data_exce['fangshi'])
        print(data_exce['qiwang'])

    @data(*data_exce)
    def test_request(self,data_exce):
        r=requests.post(url=data_exce['url'],json=data_exce['key'])
        print(data_exce['url'],r.status_code)

if __name__ == '__main__':
    unittest.main()

 3、单个目标验证

'''
这里暂时只比较了返回的value是否和预期一致的情况,没有比较目标的键值都相同以及目标的层级
dict:待测目标
objkey:目标key
objvalue:目标value
'''
def dict_get(dict, objvalue, default):
    tmp = dict
    for k,v in tmp.items():
        # 如果dict中的value和目标value相同,则返回value,这里也可以改成键值都相等
        if v == objvalue:
            return v
        else:
            if (type(v).__name__ == 'list'):#如果类型是list,且不为空
                if len(v)>=1:
                    for i in range(0,(len(v))) :
                        ret= dict_get(v[i], objvalue, default)#递归调用,如果不是返回default,则跳出递归
                        if ret is not default:
                            return ret
            if (type(v).__name__ == 'dict'):#如果类型是dict,且不为空
                if len(v)>=1:
                    for i in range(0,(len(v))) :
                        ret = dict_get(v, objvalue, default)#递归调用,如果不是返回default,则跳出递归
                        if ret is not default:
                            return ret

    return default#找不到时返回的默认值

if __name__ == '__main__':
    test={
    "sites": [
                { "name":"test" , "url":"www.test.com" },
                { "name":"google" , "url":"www.google.com" },
                { "name":"weibo" , "url":"www.weibo.com" }
    ]

}
    a=dict_get(test,"www.weibo.co",'未找到')
    print(a)

4、整个response验证,这里是以单个目标验证为基础的方法

from Template_Log.log import LOG,logger
from unittest_t3.check_kv import   dict_get

@logger('断言测试结果,通过返回pass,失败返回fail')
def assert_in(assert_hope,response):
    if len(assert_hope.split('=')) > 1:#目标示例: assert_hope:name=google&url=www.google.com
        data = assert_hope.split('&')#分割后示例:[name=google,url=www.google.com]
        result = dict([(item.split('=')) for item in data])#分割后示例: {name:google,url:www.google.com}

        value1=[]
        for value in result.values():
            s=dict_get(response, value, None)#期望的value和响应response对比,如果有相同就返回value
            if (s != None):
                value1.append(s)
            else:
                return 'fail'
        print('断言通过,断言的实际值是:',value1)
        return  'pass'
    else:
        LOG.info('填写测试预期值')
        raise ('请填写期望值')

三、实例

import json,ddt
import unittest,requests
from Template_Log.log import LOG,logger

#数据驱动
from unittest_t2.get_excel import makedata
from unittest_t3.check_all import assert_in
from unittest_t3.xmltojson import Xml2Json
data_exce=makedata()

@ddt.ddt
class TestStringMethods(unittest.TestCase):
    def setUp(self):
        LOG.info("start_here")

    def tearDown(self):
        LOG.info("end_here")

    @logger('进入用例test_insert')
    @ddt.data(*data_exce)
    def test_insert(self,data_exce):
        r=requests.post(data_exce['url'],data=data_exce['key'])
        try:
            apijson = json.loads(r.text)
        except Exception:
            apijson = Xml2Json(r.text).result

        print('返回结果:', r.json())
        print('期望值:',data_exce['qiwang'])
        LOG.info('返回结果:%s'%apijson)
        qingwang=assert_in(data_exce['qiwang'],apijson)
        LOG.info('断言结果:%s'%qingwang)
        self.assertEqual(qingwang,'pass',msg='预期和返回一致')

if __name__ == '__main__':
    unittest.main()
原文地址:https://www.cnblogs.com/yinwenbin/p/10610986.html