开发完成就能交测试报告?可轻松完成的接口自动化测试指南!

应用场景

开发还没有完成,这些都是服务上的验证,测试如何同步?这服务器刚配置起来,就要求测试交报告,又是加班?

测试看起来是后置的工作,只有开发出版本了或者服务器搭建起来了,才能真正的行动起来。而常常到了这个阶段,系统(程序)上线的日期也到了。真是前期没得做,后期累死人。

这次我们利用一些工具(MockServer 、 rest Assured)实现前瞻性的API(接口)测试在服务器还没启动之前。而等到真的服务器启动,只需要将测试代码连接到真实的服务器运行即可。

温馨提示:如果您要按着示例一起做,请务必配置如下工具。

用例主要是结合rest-Assured和MockServer的基本功能来做前置性的API 自动化测试,对于不了解rest-Assured 的小伙伴请做些额外功课吧(可以参考我之前写的rest-Assured的文章,有详细的配置与应用步骤,MockServer也有基础文章)。

  • IDE:  IntelliJ IDEA

  • 语言:Java

  • API 测试开发:Rest-Assured

  • API 服务器:MockServer

  • 测试框架:TestNg

  • 项目类型:Maven

知识重点

MockServer 应用:验证服务器收到的请求

rest Assured :模拟API 请求

Maven项目配置

配置MockServer、rest-Assured 在POM.xml。

如下图所示:需要将 MockServer、rest-Assured 正确的引入到 pom.xml 的<dependency>节点下。

提示:如果dependency没有自动加载,可以手动加载,相应的jar 包就会下载了。

MockServer:

图片

rest-Assured:

图片

测试用例分解

测试用例

下面的用例描述应该不陌生吧,典型的BDD 描述,这里我把参数 与验证请求写在了一起只是方便这次的讲解。真实的环境可以把数据与场景分开,这样会更清晰。

Given: API 服务器正在运行

When: 服务器接受到API (api 地址:http://localhost:10800/testing.retry/{id})的请求

And: 参数是 "?testParameter=false"

And:(header)头字段:headerId="id"; headerVersion="version"; headerName="name"

Then: 验证服务器接受到正确的请求

Example:次数:1,

(header)头字段:headerId="id"; headerVersion="version"; headerName="name"

参数: "?testParameter=false"

And: 验证服务器响应代码(200)

用例分析

首先要搭建一个接受API的服务器,并且能够对有符合条件的API请求做出200的响应。

地址:http://localhost:10800/testing.retry/{id}

参数:?testParameter=false

(header)头字段:headerId = "id"; headerVersion = "version"; headerName = "name";

当服务器接收到请求时,需要验证服务器接收到的是正确请求,且请求次数是1,返回200。

1. 代码响应可以由rest-Assured 验证。

2. 服务器接收的数据由MockSever验证。

有了上面的理解,现在就是实现步骤:

1. API 服务器 - MockServer。

2. 创建API 响应期待(Active Expectations) - MockServer。

3. 模拟请求 – rest-Assured 并验证返回状态。

4. 验证请求次数、参数、头字段 - MockServer。

5. 关闭MockerServer。

提示:这一步非常的重要,使得后续的测试条理化,能系统性的、逻辑性的组织测试代码。

TestNg 用例脚本

依照上面分析,让我们一步一步看下代码的实现吧。

提示:本示例用的Java + Maven + testNg (如若对这个组合有点陌生的小伙伴,可以看看我相关的基础文章)。

下图所示的完整测试脚本。

图片

代码详解

1. 全局参数

我们可以把共用的信息定义成变量,考虑到的应用的范围可以定义成局部变量或是全局变量。

确定不了 哪些定义局部变量或是全局变量,该怎么办?

提示:开始写测试代码时,都会遇到这个问题,即使一位有经验的也会有相同的问题。这个不用担心,通常我会先写成局部变量 ,或是不定义变量,直接写成 固定的。到最后,一条用例的代码写完整了,在检查代码时就会一目了然的知道定义局部变量或是全局变量了。

String headerId = "id";
String headerVersion = "version";
String headerName = "name";
String queryParameter = "testParameter";
String queryParameterValue = "false";
String baseURI = "http://localhost:10800";
int requestTime = 1;
private ClientAndServer mockServer;

2. API 服务器 - Mock Server

如图:  我们先建立一个方法 startMockServer(), 这个方法是启动一个MockServer 端口10800. 默认地址是本机:http://localhost:10800。MockServer 变量因为还要被其他方法调用。这里定义的是全局变量。

private void startMockServer() {
    mockServer = startClientAndServer(10800);
}

3. 创建API 响应期待(Active Expectations) - MockServer

如前分析,我们需要API服务器能够对如下的请求做出200的响应。

注意事项:请求地址的{id}这是一个变量,代码中 参数化这个变量pathId

mockServerActiveExpectations () 方法,启动API 服务器,并创建API响应期待(Active Expectations)。

地址:http://localhost:10800/testing.retry/{id}

参数:?testParameter=false

(header)头字段:headerId = "id"; headerVersion = "version"; headerName="name"

图片

mockServerActiveExpectations ()应用:

startMockerServer()启动API 服务器http://localhost:10800。

代码mockServer.when(request().withPath…. 就是创建一个Active Expectations ,这些都是标准的MockServer 语法,不用担心看不懂,试一下就明白了。

图片

4. 模拟请求 – rest-Assured,验证响应代码 200

图片

这是 rest-Assured 的语法,简单的说就是模拟用户的行为向服务器http://localhost:10800/发送一个api 请求.

注:header (头字段)都是测试数据,用的都是”test”。

log().all :只是为了调试用,其后可以移除也可以保留。

5.验证请求次数、参数、头字段 - MockServer

图片

为了代码简洁易读, 同时具备重用性,这里单独写了一个验证的方法。

verifyReceivedRequestDataAndTimes(),通过代码可以看出这里会验证 请求的路径、参数、方法、头字段的具体数据以及 接收到的请求次数。

不用担心,这些也都是MockServer 语法。

图片

6. 关闭Mocker Server

别忘了,这一步也很关键。测试环境非常的重要,特别是在有一组测试用例时。不清除环境造成的麻烦数不胜数。

图片

图片

用例运行

好了,先在运行下测试结果吧。这里我就直接在IDE里运行了。

同时打开 MockerSever 的dashboard : http://localhost:10800/mockserver/dashboard

提示:代码运行的很快,为了捕捉到 dashboard 的记录,在代码关闭 MockerSever  之前加20秒的等待时间。

图片

关于如何看这个 dashboard,有不太理解的小伙伴可以查阅我之前关于MockServer 配置与搭建的文章里有详细的介绍。

图片

下图显示了MockerSever  对请求做的验证结果。

1. 验证请求的详情;

2. 验证请求的次数。

图片

rest-Assured 模拟的API请求的数据可以在运行的代码log里查看,如下图所示:

图片

错误排查及代码优化

现在我们做些负面测试,验证这个用例在 请求与期待 “错误”下是可以逮到bug的。

我们验证 API 服务器收到了2次请求

图片

运行代码以后,我们会得到如下错误, 我们期待服务器收到的是2次请求,而实际是1次请求,因此报错没有找到匹配的2次请求。

图片

点击 click to see difference, 在新的窗口的右边显示了服务器实际接收到的请求(只有一次)。其他的不同可以忽略,因为这里并没有验证。

图片

基于这个改动,要是查看dashboard 是看不到验证的信息的。验证代码因为失败,整个脚本就停止了。

所以我们改进下 verifyReceivedRequestDataAndTimes(),添加 try …catch..

注意:这个方法改成了返回一个 Boolean 值,因为我们需要这个Boolean值做 测试用例的成功与失败的验证。否则,测试验证显示的失败,但是测试用例运行成功。参看下面介绍的SoftAssert。

图片

再运行下代码:dashboard 就可以显示验证失败的信息了。

图片

验证方法的添加SoftAssert,让代码遇到验证失败,且继续执行。还要再结尾加上 asserAll()。这样,验证失败,用例失败。

图片

为了在运行的结果里能够一眼就就能排查到错误在那里,再改进一下try..catch.. 把错误打印出来(这里我用的是 print,, 推荐在真实环境用Log)。这样就实现,验证失败、用例失败、失败原因。

图片

我们验证 header 不匹配

比如我们期待 请求 headerId值 是 “ID”, 但是服务器接收的请求 的“test”。

图片

验证失败结果如下:

图片

总结

好了,这就完成了如何把大象放进冰箱里,不难吧!

当真的服务器上线以后,只需要把 rest-Assured的请求指向真实的测试服务器, 把 MockServer 注释一下就可以,哪怕是老板当天要报告我们都能交付。

以上是做个抛砖引玉吧,最主要的还是有切合自己的测试需求来使用各类型的测试工具。各位测试大咖们可以灵活应用,举一反三。

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

猜你喜欢

转载自blog.csdn.net/wx17343624830/article/details/132669691
今日推荐