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

记一次接口测试分享

作者: 迈阿密小白 | 来源:发表于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
    

相关文章

  • 记一次接口测试分享

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

  • 接口测试是什么及用处

    接口测试是百人计划分享中的一部分,在16次分享中有3次是关于接口测试的。所以这里对接口测试做个小结。对于接口测试我...

  • jmeter进行dubbo接口测试

    使用JMETER进行DUBBO接口测试 1. 分享背景: dubbo接口进行接口的访问测试 2.Dubbo插件的...

  • SpringMVC中的@RequestBody

    记一次用postman测试接口的傻逼历程 首先来看看docs.spring.io@RequestBody的定义: ...

  • 接口测试概述

    接口(interface)的概念 常见接口名词 接口测试: 接口测试目的: 接口测试的重要性: 接口测试流程 接口...

  • 接口、安全、性能测试

    接口测试 1.定义:接口测试时测试系统组件间接口的一种测试 包括:模块接口测试、后端服务器接口测试、外部接口测试。...

  • 记一次简单的接口测试

    功能测试做长了,老感觉很慌,最近学习了接口测试,书上的例子比较简单,在实际工作了实现了两遍,都是登录功能,流程基本...

  • 服务端接口测试指南

    本文为内部分享文档,意在从基础到深入分享单接口测试及系统接口测试内容。 此文借鉴和引用了多位同行的文章内容,均已标...

  • 接口测试 - 测试流程

    接口测试流程逐步分为: 接口需求调研 -> 接口测试工具选择 -> 接口测试计划 -> 接口测试的用例编写...

  • 接口测试初解

    1.什么是接口 2.什么是接口测试: 接口测试主要包含三方面:接口功能测试、接口安全测试、接口性能测试 3.接口测...

网友评论

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

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