应用场景
开发还没有完成,这些都是服务上的验证,测试如何同步?这服务器刚配置起来,就要求测试交报告,又是加班?
测试看起来是后置的工作,只有开发出版本了或者服务器搭建起来了,才能真正的行动起来。而常常到了这个阶段,系统(程序)上线的日期也到了。真是前期没得做,后期累死人。
这次我们利用一些工具(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%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。