看啥推荐读物
专栏名称: Sunbreak
客户端架构-高级工程师
今天看啥  ›  专栏  ›  Sunbreak

[Web翻译]为gRPC和REST服务实施测试自动化框架。

Sunbreak  · 掘金  ·  · 2021-03-26 17:09
阅读 4

[Web翻译]为gRPC和REST服务实施测试自动化框架。

原文地址:medium.com/chewy-innov…

原文作者:medium.com/@lifeatchew…

发布时间:2019年9月20日 - 5分钟阅读

image.png

作者:Shvetashva Suri,二级质量工程师 @ Chewy。

在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 翻译




原文地址:访问原文地址
快照地址: 访问文章快照