美文网首页软件测试程序员
记一次接口测试分享

记一次接口测试分享

作者: 迈阿密小白 | 来源:发表于2018-06-02 15:18 被阅读24次

    前言

    5月初的时候,接到上头需求,要求5月底做一次接口测试分享,不巧5月最后10天需求特别多,所以就在加班空隙写了一个稿子,如下文。

    有点简单,只是一个概要,大部分语言还是自己组织,中间顺便写了几个demo,大概花了一个多小时,最终也算顺利分享完成。

    常用抓包工具

    开发者工具F12
    wireshark
    fiddler
    burpsuite
    charles(选用)
    tcpdump
    mitmproxy

    接口分析

    • URL 请求地址
    • response code 状态码
      • 200 ok
      • 400 请求参数错误
      • 404 请求失败,资源在服务器上未发现
      • 500 服务器出现错误
      • 504 未收到响应
    • Method get、post、put、delete等。
    • Query String 请求参数
    • Response 响应

    接口测试方法

    • 工具:

      Postman Jmeter SoapUi curl命令

    • 代码:

      RobotFramework

      python + urlib / requests (选用)

      java + httpclient / rest-assurd

    • 用例管理:

      yaml json xml Excel(选用)

    结构介绍

    主要依赖Excel管理用例,读取表格中相关数据后发送请求,并将结果写入一个新的Excel表格中。

    读取Excel

    • 依赖第三方库:

      • xlrd
    • 主要思路:

      将所有测试数据读取----保存在一个list中,该list有一个个dict组成

      一行用例是一个dict,key为第一个行标题,value为对应的单元格中的值

    • 核心代码:

    path = os.path.abspath(fpath)
    myworkbook = xlrd.open_workbook(path)
    mysheets = myworkbook.sheets()
    data = []
    l_col_names = []
    datas = []
    l_data = mysheet.row_values(i)    #返回一个列表
    if i == 0:
        l_col_names = l_data
        else:
            c = len(l_col_names) - len(l_data)
            for i in range(c):
                l_data.append('')        # 缺少元素用''补
            data.append({k: v for k, v in zip(l_col_names, l_data)})   #生成个key为第一行数据,value为下面行的数据 dict
    datas.append(data)  #最终将所有的数据都存在一个list datas中
    

    发送请求

    • 依赖第三方库:

      • requests (核心)
    • 主要思路:

      将读取到的Excel内容(URL、Method、Body等)按照格式发送请求,并返回结果。

      将请求返回的test_name, code, cost_time, case_name, host, message, isok, url, body的信息,装入列表中

    • 发送请求核心代码:

    def post(url, body, headers):               #post请求,url,body,headers均来自于读取到的Excel内容
        start = time.time()
        body = json.loads(body)                   
        r = requests.post(url, data=body, headers=headers)
        body = r.text
        status = r.status_code
        message = r.reason
        end = time.time()
        return status, message, body, end - start    #返回的结果用于写入Excel中
    
    def get(url, headers):                    #get请求
        start = time.time()
        r = requests.get(url, headers=headers)
        message = r.reason
        status = r.status_code
        body = r.text
        end = time.time()
        return status, message, body, end-start
    
    def do_resultV_temp(url, body, headers, result_code, test_name, case_name, host, case_result, method):
        try:
            (HTTPRESP, HTTPMSG, RESP_BODY, LATTENCY) = post(url, body, headers)
            case_result_code = "ERROR"
            if HTTPRESP == 200:
                cost_time = int(LATTENCY * 1000)   # 接口请求耗时
                code = json.loads(RESP_BODY)['code']   # code
                if str(code) == str(result_code):
                    case_result_code = 'PASS'
                # 1604 测试环境 文章不足导致
                elif str(code) == '-1604':
                    case_result_code = 'PASS'
                else:
                    case_result_code = 'FAIL'
                isok = case_result_code        
                message = json.loads(RESP_BODY)['message']      
                post_result = [test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method]       #将相关结果存入一个list中
                case_result.append(post_result)
            else:
                cost_time = '3000'
                isok = case_result_code
                message = 'ERROR'
                post_result = [test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method]        
                case_result.append(post_result)
            return RESP_BODY
        except Exception, ex:
            code = "%s ERROR" % HTTPRESP
            RESP_BODY = ex
            isok = 'FAIL'
            message = 'ERROR'
            cost_time = '3000'
            RESP_BODY = str(RESP_BODY)
            post_result = [test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method]
            case_result.append(post_result)
            return RESP_BODY
       
    def run(fpath):
        l_data = file_utils.case_xlsx_loader(fpath)
        results = []       # 这边的result就是上面的case_result
        run_test(l_data, results)
        return results
    def excute(fpath):
        all1 = run(fpath)   # 这边调用run方法,返回所有的测试结果,就是上面的[test_name, code, cost_time, case_name, host, message, isok, url, body, RESP_BODY, method] 列表
        all = all1
        all_result = []
        for item in all:
            result = {}
            result['test_path'] = item[0]
            result['test_time'] = item[2]
            result['test_code'] = item[1]
            result['test_name'] = item[3]
            result['test_url'] = item[4]
            result['test_message'] = item[5]
            result['test_result'] = item[6]
            result['test_request'] = str(item[7])
            result['test_body'] = item[8]
            result['test_response'] = item[9]
            result['test_method'] = item[10]
            all_result.append(result)  #以dict的形式,保存测试结果
    
        new_all_result = []
        new_all_result = coding.to_unicode(all_result)
        return new_all_result
    
    

    保存结果

    • 依赖第三方库:

      • xlsxwritter
    • 主要思路:

      将 excute 这个方法返回的所有测试结果,根据key读取value并以此写入表格对应的列中

    • 核心代码:

      def test_detail(fpath, worksheet, workbook):
        test_data = runner.excute(fpath)
          temp = 3        #从第三行开始,根据字典key写入测试结果
          for item in test_data:
              _write_center(worksheet, u"A" + str(temp), item["test_name"], workbook)
              _write_center(worksheet, u"B" + str(temp), item["test_method"], workbook)
              _write_center(worksheet, u"C"+str(temp), item["test_url"], workbook)
              _write_center(worksheet, u"D"+str(temp), item["test_path"], workbook)
              try:
                  _write_center(worksheet, u"E"+str(temp), item["test_code"], workbook)
              except:
                  pass
              _write_center(worksheet, u"F"+str(temp), item["test_message"], workbook)
              _write_center(worksheet, u"G"+str(temp), item["test_result"], workbook)
              _write_center(worksheet, u"H"+str(temp), item["test_time"], workbook)
              _write_center(worksheet, u"I" + str(temp), "URL="+item["test_request"], workbook)
              _write_center(worksheet, u"J"+str(temp), item["test_body"], workbook)
              _write_center(worksheet, u"K"+str(temp), item["test_response"], workbook)
              
              temp = temp + 1
      

    相关文章

      网友评论

        本文标题:记一次接口测试分享

        本文链接:https://www.haomeiwen.com/subject/uzsrsftx.html