许多公司正在朝其软件应用程序的微服务模型迈进。 这意味着其应用程序的不同部分可以具有单独的数据存储和单独的用于与该数据存储进行交互的命令。
微服务之所以吸引软件提供商,是因为它们可以更快地部署软件组件。 在更新应用程序的一个区域时,该应用程序的其他区域可以继续运行。
我们生活在一个用户希望软件随时随地可以使用的时代,而微服务模型可确保应用程序在用户想要使用时不会停机。
大多数微服务都在使用应用程序编程接口(API) ,这是用于如何使用服务的一组命令。 而且大多数API都通过超文本传输协议(HTTP)使用表示状态传输(REST)请求来请求和发送数据。
尽管如此,许多软件测试人员仍继续使用基于用户界面(UI)的测试来实现其测试的自动化,这些测试与浏览器直接交互。 这主要归功于Selenium用于测试自动化的工具套件的成功,该套件可在Web浏览器中运行。
硒已经使用了几年,大多数软件测试人员都熟悉它的使用。 但是,最熟悉的工具并不总是在测试自动化中使用的最合适的工具。
尽管将始终需要一些UI测试来验证元素是否显示在页面上并可以与之交互,但API测试比基于UI的测试要快得多且更可靠。 在测试诸如在数据库中添加和删除记录之类的操作时,自动化的UI测试可能既耗时又重复。 API测试允许快速记录操作。
此外,API测试允许测试人员在开发过程的早期(通常在创建UI之前)发现错误。 API测试允许测试人员发出可能无法通过UI发出的请求,这对于暴露应用程序中潜在的安全漏洞至关重要。
由于当今软件的变化速度如此之快,因此拥有能够为开发人员和测试人员提供快速反馈的测试非常重要。 API测试可以满足这一需求。 我们将描述API测试的基础知识,包括REST请求如何工作以及如何设置请求和断言。
REST请求如何工作?
在进行API测试之前,您需要学习一些基础知识。 API由一组REST请求组成。 这些是对应用程序服务器发出的请求,这些请求用于检索,删除或操作应用程序数据库中的数据。
REST请求由以下部分组成:
- HTTP动词 ,描述应采取的措施
- 定义请求位置的统一资源定位符(URL)
- HTTP标头 ,向服务器提供有关请求的信息
- 提供请求详细信息的请求正文 (有时可以为空)
以下是最常见的HTTP动词:
- GET请求从数据库中获取一条记录
- POST请求将新记录添加到数据库
- PUT请求将记录替换为新记录
- PATCH请求用新信息替换记录的一部分
- DELETE请求从数据库中删除一条记录
请求中使用的URL阐明了请求将更改哪种记录类型。 例如,与URL https://www.example.com/cars/1一起使用的GET请求将在汽车表中返回记录号1。
同样,与URL https://www.example.com/trees/2一起使用的GET请求将返回树表中的第二条记录。 URL的末尾指定一个端点 -API中使用的数据对象。 在这些示例中,端点将是/ cars和/ trees。
HTTP标头可以向服务器提供信息,例如:
- 主机 :发出请求的用户的域和端口号
- 授权 :发出请求的用户的凭证
- Content-Type :请求正文中提供的信息格式
发出POST,PUT或PATCH请求时使用请求主体。 该主体确切指定应将哪些信息添加到数据库。 它通常采用JavaScript对象表示法(JSON)或可扩展标记语言(XML)格式。
这是一个JSON请求主体在执行将客户添加到数据库的POST请求时可能看起来像的示例:
{
“firstName”: “John”,
“lastName”: “Smith”,
“emailAddress”: “jsmith@example.com”
}
了解REST请求的各个部分将有助于软件测试人员制定用于测试目的的请求。 仅仅知道单击表单中的“发送”按钮将发送POST请求是不够的。 要真正测试API,测试人员应该知道如何在不依赖UI的情况下创建和发送请求。
了解发送测试请求时作为响应的期望也很重要。 否则,测试人员将无法知道API是否正常运行。
对REST请求的响应中包括什么?
对REST请求的响应是服务器在收到并处理了请求之后发回的信息。 它将包括描述响应的HTTP标头 ,描述响应成功或失败的响应代码以及包含请求的或相关信息(有时可能为空)的响应主体 。
响应中的HTTP标头将信息提供给请求方,例如:
- 访问控制标头 :告诉请求者允许哪些类型的请求和标头
- Content-Type :响应中返回的信息的格式
- 服务器 :响应请求的服务器的名称
响应代码是用于描述REST请求结果的三位数代码。 最常见的响应代码属于以下三类之一:
- 200个级别的响应指示已接收,理解和处理了请求
- 400级别的响应表明已接收到请求,但来自客户端的错误
- 500级别的响应表明存在某种服务器错误
响应主体将根据发出的请求类型以及请求中是否存在错误而有所不同。
成功的GET请求将返回具有所请求信息的正文。 成功的POST请求可能返回与POST发送的正文相呼应的正文,或者可能返回带有200级响应代码的空正文。 返回错误的请求可能在响应的正文中有一条错误消息。
我们如何测试API?
既然您已经了解了REST请求和响应的工作原理,现在该学习如何测试它们了。 测试API的第一步是确定API可以发出哪种类型的REST请求以及每个请求的限制。 可以通过查看文档来完成。
一些开发人员可能选择使用Swagger来记录API,这是一个开放源代码框架,可以清楚地描述API的行为。 还有其他可用的文档工具。
为了完整地测试API,了解API中每个REST请求的局限性很重要。 查找,测试和验证这些限制对于确保API能够以用户期望的方式运行以及确保恶意用户无法利用API来获取他们不应该访问的信息至关重要。
在收集有关API的信息时,会向API开发人员提出以下问题:
- 哪些端点可用?
- 我可以在这些端点上使用哪些HTTP动词?
- 动词是否受授权限制?
- 请求中需要哪些字段?
- 字段的验证限制是多少?
- 对于成功的请求,我应该期望什么响应代码?
- 对于不成功的请求,我应该期望什么响应代码?
- 不成功的请求正文中将返回哪种错误消息?
下一步是在API测试工具中设置所有这些请求。
为此可以使用多种工具。 也可以将API测试直接写到代码中,但是API测试工具的优点是易于使用,并提供了可视化响应的方法。
使用最简单的API测试工具是Postman 。 它具有100%的免费版本,可以快速下载,并且还为团队提供付费版本。 Runscope和SoapUI是另外两个流行的工具。 有关API测试工具的更多建议,请参阅《简单程序员的终极自动化测试指南》 。
选择API测试工具后,首先要设置的请求是“ happy path”请求。 这些是API开发人员希望用户在使用应用程序的正常过程中提出的请求。
设置“快乐路径”样式的请求时,包含断言很重要。 一个断言应该是返回正确的响应代码(通常为200响应)。
如果响应中包含一个主体,则也应该对此有一个断言。 例如,如果正在测试GET请求,则应断言响应的主体包含该记录所期望的数据。
一旦创建了所有“快乐道路”测试,就可以添加否定测试。 负性测试是确保正确处理任何类型的错误的测试。 重要的是,当用户意外导入无效数据时,应用程序不会崩溃,并且必须禁止恶意用户将有害脚本输入数据库。 以下是一些负面测试的示例:
- 使用错误的HTTP动词发送请求
- 使用错误的端点发送请求
- 发送带有错误标题的请求
- 发送缺少标题的请求
- 未经适当授权发送请求
- 请求数据以获取不存在的记录
- 发送带有缺少必填字段的正文的请求
- 发送带有无效字段值的正文的请求
听起来不错,但您能帮我举一个例子吗?
是! Swagger UI的开发人员已经创建了一个可以实践的API,称为Swagger Petstore。 这是我所知道的唯一的公共实践API,可以清楚地显示每个API请求的工作方式,还提供了一种直接在文档中尝试请求的方法。 我们可以在Postman中创建一个指向该API的请求,添加一些断言,然后使用Newman从命令行运行它。 Newman是Postman创建的命令行运行工具,可以通过节点包管理器(npm)安装。
步骤1:
- 导航到http://petstore.swagger.io并单击请求“ GET / pet / {petId}”以将其打开
- 点击“试用”按钮
- 在标有“要返回的宠物的ID”的字段中输入数字1
- 点击“执行”按钮
- 向下滚动到“响应”正文,并验证是否已返回宠物记录(如果未返回记录,请使用“返回宠物的ID”字段中的其他ID再次尝试该请求)
第2步:
- 通过转到https://www.getpostman.com并单击“下载应用程序”按钮来下载Postman
第三步:
- 发射邮递员
- 在屏幕的顶部中间,确认您在HTTP动词下拉列表中看到单词“ GET”
- 在“ GET”旁边的空间中,输入以下URL: http : //petstore.swagger.io/v2/pet/1 (如果您使用的ID不同于1,则将1替换为您选择的ID。)
- 单击“发送”按钮,并确认您收到的响应码为200 OK,并且响应正文中包含该宠物的记录。
第四步:
- 单击邮递员请求的URL下方的“测试”选项卡
- 在屏幕右侧,滚动选择代码段,直到找到标题为“状态代码:代码为200”的代码段,然后单击此标题。
- 请注意,此断言已添加到测试窗口。 该代码断言200是您发送请求时获得的响应代码。
步骤5:
- 滚动选择代码段,直到找到标题为“ Response Body:JSON值检查”的代码段,然后单击此标题
- 请注意,此断言已添加到测试窗口
- 将字符串“您的测试名称”更改为“返回正确的宠物ID”; 这将是测试的名称
- 将单词“ expect”后的括号中的值从“ jsonData.value”更改为“ jsonData.id”; 测试将检查宠物ID的值
- 将单词“ eql”后的括号中的值从“ 100”更改为“ 1”(或您在GET请求中选择使用的任何ID)
- 再次单击“发送”按钮,然后单击“测试结果”选项卡
- 确认您看到创建的两个测试,并在其旁边带有“通过”字样
步骤6:
- 在屏幕左侧,点击“收藏”标签
- 单击带有文件夹的图标和加号按钮以创建请求集合
- 在弹出窗口中,将集合命名为“宠物商店”,然后单击“创建”按钮
- 在屏幕右侧,点击“保存”按钮
- 在弹出窗口中,将请求命名为“ Get Pet”
- 选择宠物店集合
- 点击“保存到宠物店”按钮
步骤7:
- 将鼠标悬停在集合名称“宠物商店”上
- 单击出现在集合名称旁边的三个点,然后选择“导出”
- 选择v.2.1收集选项,然后单击“导出”按钮
- 选择要将集合保存到的位置,例如您的桌面
- 在文件名中删除单词“宠物”和单词“存储”之间的空格
- 点击“保存”按钮
- 您的收藏集将另存为名为PetStore.postman_collection.json的JSON文件”
步骤8:
- 如果您尚未在计算机上安装Node.js,请按照https://nodejs.org/en/download上的说明进行安装
- 打开命令窗口,键入“ npm install -g newman”,然后单击Return键。 这会将Newman安装到您的计算机上。 如果您不熟悉命令行, 请参阅本文以了解一些常用命令
- 使用命令窗口,导航到保存JSON文件的位置(例如,您可以键入“ cd Desktop”以更改为Desktop文件夹)
- 在命令窗口中键入以下命令:“ newman run PetStore.postman_collection.json”
- 您应该在命令窗口中看到测试正在运行并通过!
我们如何使API测试自动化?
一旦创建了一套完整的正面和负面测试,就可以设置自动化。 可以将运行测试的Newman命令集成到一个持续集成(CI)项目中。 同样,Runscope和SoapUI也提供命令行功能以与CI工具集成。
下一步
上面的教程只是API测试中可能的简单示例。 要走得更远,您可以在Swagger Petstore中尝试更多的请求,并在Postman中为它们创建测试。
如果您的公司正在开发API,则可以查看一下API,以了解可以为您的软件设置哪些类型的自动化API测试。
检查您的自动化UI测试,以查看哪些API测试可能更好。 例如,如果您有一个UI测试来填写客户表单并向数据库添加新记录,则可以使用API测试来使用POST请求添加记录。 API测试最适合测试数据的创建和操作,而UI测试最适合检查屏幕上的可用性和按钮和链接的可用性。
将大量自动化测试转移到API测试将使您的测试套件运行得更快,更可靠。 您将能够快速发现数据存储操作中的缺陷,并在利用任何潜在的安全漏洞之前将其暴露出来。 测试愉快!
翻译自: https://www.javacodegeeks.com/2018/04/what-is-api-testing-and-why-should-we-be-using-it.html