记一次接口测试分享

前言

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
    

你可能感兴趣的:(记一次接口测试分享)