zoukankan      html  css  js  c++  java
  • 接口之用例编写、验证

    一、用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()
  • 相关阅读:
    IDEA 2020.1 使用eclipse快捷键
    IDEA 2020.1 配置自定义Maven
    Maven 下载、安装、设置国内镜像
    IDEA 2020.1 下载、安装、激活
    MySQL 5.5/5.7 zip版 下载、安装、卸载、报错
    JDK8 下载、安装、配置环境变量
    如何在虚拟机VM15中安装W10
    虚拟机的安装,VMware-workstation-full-15.5.1-15018445
    为什么要买云服务器
    输入子系统实现的按键驱动
  • 原文地址:https://www.cnblogs.com/yinwenbin/p/10610986.html
Copyright © 2011-2022 走看看