接口之用例编写、验证-程序员宅基地

一、用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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30445169/article/details/99492755

智能推荐

360服务器linux版,360浏览器Linux版-程序员宅基地

文章浏览阅读2.1k次。原文来自:https://bbs.360.cn/thread-15529293-1-1.html 【Ubuntu & Deepin 系统】下载链接:https://yunpan.360.cn/surl_yHYBghptmsK (提取码:347d); 【Deepin(龙芯_MIPS64) 】下载链接:https://yunpan.360.cn/surl_yFvrPRipiFU (提取码:c9..._360浏览器;inux 专业版注册码

【Android进阶笔记】事件分发机制_android 事件分发机制-程序员宅基地

文章浏览阅读135次。文章目录1. DOWN 事件的流向2. MOVE 和 UP 事件的流向2.1. dispatchTouchEvent 返回 true2.2. onTouchEvent 返回 true2.3. 总结3. setOnTouchListener1. DOWN 事件的流向【关键点】dispatchTouchEvent、onTouchEvent 返回 true:事件就停止传递了(没有谁能再收到这个事件)。dispatchTouchEvent 返回 false:事件停止往子 View 传递和分发同时开_android 事件分发机制

彻底搞懂错排问题_错牌问题-程序员宅基地

文章浏览阅读6.2k次,点赞30次,收藏35次。问题:现有10本书按照顺序摆放,现要求重新排列,使得新的书的顺序中每一本书都不在原来的位置,求有多少种排列方式?这个问题推广一下,就是错排问题,是组合数学中的问题之一。考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排。 n个元素的错排数记为D(n)。 研究一个排列错排个数的问题,叫做错排问题或称为更列问题OK,现在详细分析这个问..._错牌问题

java 画笔 粗细_java中如何设置线条的粗细例题?-程序员宅基地

文章浏览阅读2.2k次。展开全部Java线条粗细32313133353236313431303231363533e58685e5aeb931333337386665一般要使用java Swing方面的知识importjavax.swing.*;importjava.awt.*;importjava.awt.geom.*;publicclassExample6_5extendsJFrame{publicEx..._javafx line粗细

[210923]操作系统(自考)重点笔记_必须根据分配给程序的内存区域对程序中指令 和数据的存储地址进行重定位,即要把-程序员宅基地

文章浏览阅读2.0k次,点赞5次,收藏43次。操作系统(自考)引导参考资源你当初是如何学会操作系统这门课程的? - happywei的回答 - 知乎如何学好操作系统原理这门课? - 程序员cxuan的回答 - 知乎哈尔滨工业大学 - 操作系统-MOOC应试技巧 * *简答题综合题进程调度送分题。关键:弄懂进程调度算法的规则、周转时间的计算方法(结束时间-达到时间)PV操作磁盘优化移臂调度页面调度PV操作概论/运行环境 *OS基本概念从定义、特征、功能、体系结构(*)、分类、设计(*)6个方_必须根据分配给程序的内存区域对程序中指令 和数据的存储地址进行重定位,即要把

小学生该学什么编程语言入门?-程序员宅基地

文章浏览阅读3w次。【原始问题】孩子小学6年级,对编软件感兴趣,说上初中学函数以后,打算学习编软件,但是我不懂啊,无法指导。有懂这方面的,可否指点一二,从什么地方入手?再有就是为啥我建议娃学习Python, 而不是Scratch呢?我觉得MIT的Scratch虽然很不错,但是它不够抽象化,不是一个真正的通用的编程语言。5,6岁的小小娃学scratch还行,大娃还是应该学真正的general pur

随便推点

CodeForces 982 C Cut 'em all!-程序员宅基地

文章浏览阅读62次。Cut 'em all!题意:求删除了边之后,剩下的每一块联通块他的点数都为偶数,求删除的边最多能是多少。题解:如果n为奇数,直接返回-1,因为不可能成立。如果n为偶数,随意找一个点DFS建树记录下他的子孙+本身的个数。然后再DFS一下,对于每一个点,他的个数为偶数,就把他与父节点的边隔断, cnt++。 最后cnt就是答案。代码: 1 #include<bits/s...

zabbix-agent key属性列表_system.hw.cpu[<cpu>,<info>]-程序员宅基地

文章浏览阅读5.4w次。Key描述返回值参数详细说明agent.hostname返回被监控端名称字符串-返回配置文件中配置的被监控端的名称agent.ping检测被监控端是否存活1 - 运行中 其他 - 未运行-使用函数 nodata()检测客户端是否正在运行_system.hw.cpu[,]

Qt下libusb-win32的使用方法(转)-程序员宅基地

文章浏览阅读147次。源:Qt下libusb-win32的使用方法之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下载软件。 发现了libusb这个库可以用作无驱USB开发,就是说根本不需要了解Window驱动开发的知识就可以开发USB设备驱动,只需要了解一下USB的相关协议即可。Wi..._qt win32 libusb库

HTML+CSS+JS实现 ️制作loading动画效果️_js实现好看的loading效果-程序员宅基地

文章浏览阅读1.1k次,点赞3次,收藏9次。???? 作者主页:Java李杨勇???? 简介:Java领域优质创作者????、Java李杨勇公号作者 简历模板、学习资料、面试题库、技术互助【关注我,都给你】???? 欢迎点赞 ???? 收藏 留言 ???? 效果演示:文末获取源码代码目录:主要代码实现:CSS样式:.load1 .loader,.load1 .loader:before,.load1 .loader:after { background: #FFF; -w_js实现好看的loading效果

嵌入式基础知识总结_嵌入式软件基础知识点总结-程序员宅基地

文章浏览阅读7.2k次,点赞16次,收藏80次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、选择题二、填空题三、简答题四、综合题2.读入数据总结前言 本篇为嵌入式知识点总结,花费了大概一两天时间整理的,现在分享给大家!!!一、选择题1.以下哪个不是嵌入式系统的特点?( )A.面向特定应用 B.高质量高可靠 C.可裁剪性 D.具备二次开发能力 解析:嵌入式系统本身不具备二次开发能力,即_嵌入式软件基础知识点总结

[学习] 鸿洋大大的万能适配器(1)_鸿洋 commonadapter-程序员宅基地

文章浏览阅读953次。总结一下从 ViewHolder 开始学习public ViewHolder(Context context, View itemView) { super(itemView); mContext = context; mConvertView = itemView; mViews = new SparseArra..._鸿洋 commonadapter

推荐文章

热门文章

相关标签