全面评测哪个接口自动化测试框架最好用?

大家都知道接口测试框架有很多,到底哪个最好用呢?他们都有哪些优缺点?今天我们就来评测一下这些框架。

 Java Rest-assured:是使用代码来实现接口的请求,封装业务流程,对于公司的业务支持比较高,灵活度很强,可以通过代码的方式打造自己公司的接口自动化框架,上手有点难度,需要有Java 编程基础,才可以使用。

 Python + Request 框架:是使用代码来实现接口的请求,封装业务流程,对于公司的业务支持比较高,可以根据业务的灵活度来定制化开发接口框架,再加上Jenkins 就可以持续化集成。上手有点难度,需要有Python 编码的基础,才可以使用。

Robot Framework

机器人框架是一个通用的开放源码自动化框架,用于验收测试、验收测试驱动开发(ATDD)和机器人过程自动化(RPA)。它具有易于使用的表格测试数据语法,并利用关键字驱动的测试方法.它的测试功能可以通过用Python或Java实现的测试库来扩展,用户可以使用与创建测试用例相同的语法从现有的测试库中创建新的更高级别的关键字  。

  HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求,中文地址  https://cn.httprunner.org/ 官网已经有很详细的介绍。

 robot framework

  优点

关键字驱动,自定义用户关键字。

支持测试日志和报告生成。

支持系统关键字开发,可扩展性好。

支持数据库操作。

  缺点

接口测试用例写起来不简洁。

需要掌握特定语法。

*** Settings ***

Library    RequestsLibrary

Library    Collections

*** Test Cases ***

test_get_event_list    # 查询发布会(GET请求)

${payload}=    Create Dictionary    eid=1

Create Session    event    http://127.0.0.1:8000/api

${r}=    Get Request    event    /get_event_list/    params=${payload}

Should Be Equal As Strings    ${r.status_code}    200

log    ${r.json()}

${dict}    Set variable    ${r.json()}

#断言结果

${msg}    Get From Dictionary    ${dict}   message

Should Be Equal    ${msg}    success

${sta}    Get From Dictionary    ${dict}    status

${status}    Evaluate    int(200)

Should Be Equal    ${sta}    ${status}

  结果:不考虑,没人愿意这么写接口用例。

postman + Newman  + Jenkins 

  postman + Newman  + Jenkins 实现接口自动化框架,postman 方便日常的调试,非常的方便,测试的断言,设置前置条件,环境变量,response 参数提取 非常方便,我在日常工作中经常使用 postman进行接口的调试。postman高级的功能可以付费进行定制化(我还没有试验过付费的功能,在日常工作中 免费版本就已经够使用的了)。官网文档 https://learning.getpostman.com/docs/

JMeter

Jmeter 可以做于接口自动化工具,也可以用于性能测试,在性能测方面很强大,我在工作中用的不多,Vue+Flask 搭建自己公司的接口测试平台,可以自由定制化自己公司的业务,实现公司特殊的需求,接口测试平台,对于测试的开发能力有要求,前端 Vue ,后端 Flask & Django 框架,代码能力要求高,前后端的技术都需要懂。

    JMeter

优点

支持参数化

不需要写代码

  缺点

创建接口用例效率不高。

不能生成查看每一个接口执行情况的测试报告。

  总结:不考虑,接口编写不方便,最主要是不能生成测试报告,如果做接口性能的话可以考虑。

HttpRunner

优点:

基于YAML/JSON格式,专注于接口本身的编写。

接口编写简单

生成测试报告

接口录制功能。

  缺点:

没有编辑器插件对语法校验,容易出错。

官方文档没有详细的说明。

扩展不方便。

[

{

"config": {

"name": "testcase description",

"variables": [],

"request": {

"base_url": "http://127.0.0.1:5000",

"headers": {

"User-Agent": "python-requests/2.18.4"

}

}

}

},

{

"test": {

"name": "test case name",

"request": {

"url": "/api/get-token",

"headers": {

"device_sn": "FwgRiO7CNA50DSU",

"user_agent": "iOS/10.3",

"os_platform": "ios",

"app_version": "2.8.6",

"Content-Type": "application/json"

},

"method": "POST",

"date": {"sign": "958a05393efef0ac7c0fb80a7eac45e24fd40c27"}

},

"validate": [

{"eq": ["status_code", 200]},

{"eq": ["headers.Content-Type", "application/json"]},

{"eq": ["content.success", true]},

{"eq": ["content.token", "baNLX1zhFYP11Seb"]}

]

}

}]

  总结:可以考虑,至于接口数据的初始化可能需要单独处理。

gauge

  BDD行为驱动测试框架——gauge

  优点:

行为文件与脚本文件分离,本质上实现了数据驱动。

功能强大灵活,本质上还用Python写接口用例。

自动生成测试报告。

VS Code有支持插件

  缺点

门槛略高,需要了解BDD的用法。

需要会markdworn语法

  行为描述文件:

 ## test post request

  * post "http://httpbin.org/post" interface

  |key  | status_code|

  |------|-----------|

  |value1|200        |

  |value2|200        |

  |value3|200        |

  测试脚本:

  ……

  @step("post <url> interface <table>")

  def test_get_request(url, table):

  values = []

  status_codes = []

  for word in table.get_column_values_with_name("key"):

  values.append(word)

  for word in table.get_column_values_with_name("status_code"):

  status_codes.append(word)

  for i in range(len(values)):

  r = requests.post(url, data={"key": values[i]})

  result = r.json()

  assert r.status_code == int(status_codes[i])

 总结:推荐使用,BDD有一定门槛,看测试人员的学些能力和接受速度。

 Unittest+Request+HTMLRunner

利用现有的框架和库自己定制:Unittest+Request+HTMLRunner

  优点:

足够灵活强大: 分层测试、数据驱动、测试报告,集成CI...

  缺点:

有一定的学习成本

  数据文件:

{

"test_case1": {

"key": "value1",

"status_code": 200

},

"test_case2": {

"key": "value2",

"status_code": 200

},

"test_case3": {

"key": "value3",

"status_code": 200

},

"test_case4": {

"key": "value4",

"status_code": 200

}}

  测试用例:

import requests

import unittest

from ddt import ddt, file_data

@ddtclass InterfaceTest(unittest.TestCase):

def setUp(self):

self.url = "http://httpbin.org/post"

def tearDown(self):

print(self.result)

@file_data("./data/test_data_dict.json")

def test_post_request(self, key, status_code):

r = requests.post(self.url, data={"key": key})

self.result = r.json()

self.assertEqual(r.status_code, status_code)

 总结:推荐使用,代码相对简单,功能足够灵活。

  我花了两天时间整理这些框架,其实重点就是了解HttpRunner 和 gauge 。

  HttpRunner 没有编辑器插件,本身就是一个YAML/JSON配置文件,所以配置写错了,但只要是合法的YAML/JSON格式,也看不出来,只有运行的过后才知道。就像你用记事本写代码一样,只有运行了才知道代码有没有写错。

  另外,扩展起来也不是特别方便,单独用python实现一些函数:在json文件中

  {"device_sn": "${gen_random_string(15)}"}

  以这样的方式引用gen_random_string() 函数。

  gauge我已经分享过两篇基础文章了,虽然用BDD拿来做接口理念不搭,但并不是不可以,唯一的缺点是用BDD来描述接口行为不合适,其他的都没毛病,可以参数化,断言写起来也简单,测试报告也漂亮,本质上还是用Python实现一些功能,所以非常灵活。

  unittest + requests + HTMLTestRunner是我最熟悉的方案,几乎没什么短板。以前通过这种方案写过很多测试用例,这次把ddt加上似乎更完美了。

总结

  对于单接口,变化不多的可以使用  Postman、 Jmeter、HttpRunner框架就可以满足了,需要多个接口组合满足于一些场景的,需要自己编写代码来实现了 比如:

  登录,提取token,查询商品ID 订单ID 进行购买商品,支付,以及查询用户购买订单状态

对于一些业务场景涉及多个接口的,需要使用代码的方式来查询接口需要的前置信息,如 token, 商品ID,订单ID,订单状态,以实现业务场景的接口功能测试。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容