在Chewy写自动化框架是一次很棒的学习经历。从一开始,我就可以灵活地探索市场上任何合理的自动化工具。当我开始在Chewy工作的时候,我第一次接触到了gRPC的概念。这就要求我熟悉gRPC的基本原理,并同时学习如何编写自动化程序。测试这个服务需要从服务架构层面了解这个协议,所以我不得不挖掘资源。在这篇博文中,我总结了我实现一个强大的gRPC测试自动化框架的方法,以及我如何使用Java来编写它。最近,我们开始从gRPC过渡到REST服务合同。关于这一点,我也包含了我的方法,以实现从gRPC框架到REST测试框架的平稳过渡,使用的工具是REST Assured。
gRPC
gRPC正在成为一个流行的RPC框架,被Netflix、Square、Cisco & Juniper Networks等各种现代公司使用[1]。它是由Google提供的一种远程过程调用,它定义了远程服务器上的服务调用方法,客户端创建一个服务器的存根,并向这些方法提供参数和返回类型。客户端创建一个服务器的存根,并为这些方法提供参数和返回类型,而服务器则实现这些方法并返回响应。数据的结构形式是protobuf文件,你可以在这里阅读更多关于它们的信息。gRPC的一些优点是:它支持多种语言,并且与普通的RPC服务相比具有较高的性能。更多关于gRPC在Java中的文档,请求和响应结构的细节可以在这里找到。
我们如何为gRPC服务编写测试
为了测试gRPC的客户端和服务器端行为,在Chewy我们编写了集成测试,实现了一个类似于上面解释的请求响应框架。文件的层级结构包括一个父类,父类定义了一个gRPC通道,建立了它,然后根据需求定义了一个模拟stub。该通道作为stub和客户端之间的连接,用于实现服务器端方法。这个通道可以被配置为指向任何特定的测试环境。在这篇文章中,我将它定义为指向本地环境(端口8888)。在下面的代码片段中,该通道被声明为managedChannel。
public abstract class AbstractClientIntegrationTest {
ServiceGrpc.ServiceBlockingStub stub;
String host = System.getProperty("dns:///localhost:8888”);
managedChannel = NettyChannelBuilder.forTarget(getTarget())
.build();
}
这个类被所有测试类文件继承,通过存根调用gRPC服务器方法。如前所述,gRPC支持多种语言和测试框架。在这篇文章中,我将使用Java语言和Junit5框架。下面是一个示例测试的代码片段,它可以进行客户端调用和模拟服务器响应。
@Test
void test_nonNullResponse_validChannel() {
ServiceProto.GetFeatureRequest request = SrviceProto.GetFeatureRequest.newBuilder().setParam("Param 1 Value").build();
Proto.Feature featureResponse = stub.getFeature(request);
assertNotNull(featureResponse, "The response valid request was null");
}
在这个测试中,客户端调用在服务器上使用ServiceProto定义的方法GetFeatureRequest,并在同一个调用中设置输入参数(这里用setParam表示)。此后,客户端存根实现该方法并返回响应。最后,测试使用Junit断言来验证响应是否不为空,并在响应为空的情况下抛出一个错误信息。
REST断言
REST Assured是一个用于测试Rest APIs的响应和请求的框架。它是用Java语言和行为驱动开发(BDD)格式编写的。Rest Assured框架可用于解析REST API响应,以验证JSON键值对或检查XML或JSON路径中响应的关键部分。REST Assured的文献比gRPC自动化框架更容易获得,并已在参考文献中提及。
Chewy的REST Assured测试
在开始在REST Assured框架中编写测试之前,在Maven或Gradle项目中包含正确的依赖关系是很重要的。REST Assured设置的完整文档可以在官方的入门页面找到。任何项目都需要以下关键的依赖关系来进行设置。
- REST-Assured
- Json Schema验证器
- JsonPath
- XmlPath
- 支持Scala和Kotlin扩展模块(可选)。
这里展示了一个依赖关系的示例gradle项目代码段,用于REST Assured特有的依赖关系。为了有效地实现REST Assured[2],我们还推荐从Rest Assured类中静态导入方法,下面的代码段中包含了一些例子。
testCompile group: 'io.rest-assured', name: 'rest-assured', version: '4.0.0'
testCompile group: 'io.rest-assured', name: 'json-schema-validator', version: '4.0.0'
testCompile 'io.rest-assured:json-path:4.0.0'
testCompile 'io.rest-assured:xml-path:4.0.0'
testCompile group: 'org.apache.geronimo.specs', name: 'geronimo-jms_1.1_spec', version: '1.1.1'
import static io.restassured.RestAssured.given;
import static io.restassured.matchers.RestAssuredMatchers.* ;
这里是一个测试的例子,以类似于Chewy的格式展示了REST Assured框架在BDD中的实现。
@Test
public void validate_nonNullResponse() {
String responseString =
given().
when().
get(url+"/?q=param1+param2").
then().
assertThat()
.statusCode(200)
log().ifError().
extract().
jsonPath().get().toString();
assertNotNull(responseString, , "The response was null"}
要在 REST Assured BDD 中写一个测试,你可以在给定的子句中指定查询参数和 URI,或者留空子句(如示例所示)。如果在上一步中没有完成的话,可以在后面的when子句中为Rest端点指定更多的条件(例如:任何详细的查询参数)或指定URI和主参数(如本例所示)。最后,在 "然后 "部分提到你要测试的断言,作为验收标准或预期测试条件的一部分。更多关于Rest Assured文档和可用库的细节可以在他们的官网上找到。
在Chewy的CI/CD实现
对于一个强大的回归框架测试,Chewy已经实现了gRPC和REST自动化框架。在广泛的层面上,使用的工具是Ansible Tower(AWX)进行部署,Atlassian Bamboo作为CI/CD服务器,GitHub作为版本控制。为了启动框架的流水线,在Ansible playbook中写了一个最后的任务,对竹子的API进行cURL调用。这个调用会触发一个驻扎在竹子中的自动化测试工作。一旦测试运行,通过/失败的状态就会通过一个内联的竹子shell脚本传达给GitHub。然后,GitHub就可以为初始部署分支启用/禁用合并功能,从而开始整个部署过程。
在Chewy开发一个自动化框架,可以说是最有趣、最能刺激精神、最能学习的一次经历。回顾这段旅程,看到我们取得的进步,让我充满了成就感。我想向团队的其他成员致敬,包括但不限于James、Amir、Pat、AP、Chris和Nelson,没有他们的帮助,这一切都不可能实现。
参考资料
[1] gRPC,2019年8月13日访问,grpc.io/docs/guides…
[2]John Haleby,2016年6月3日,2019年9月2日访问,github.com/rest-assure…
作者:Shvetashva Suri 二级质量工程师@Chewy
如果您对卓伟的工作有任何疑问,请访问www.chewy.com/jobs。
www.deepl.com 翻译
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!