技术控

    今日:19| 主题:49390
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] 微服务场景下的自动化测试

[复制链接]
我的闺蜜会发光 发表于 2016-10-2 12:41:16
186 5

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
新的挑战

   微服务和传统的单块应用相比,在测试策略上,会有一些不太一样的地方。简单来说,在微服务架构中,测试的层次变得更多,而且对环境的搭建要求更高。比如对单块应用,在一个机器上就可以setup出所有的依赖,但是在微服务场景下,由于依赖的服务往往很多,要搭建一个完整的环境非常困难,这对团队的 DevOps 的能力也有比较高的要求。
  相对于单块来说,微服务架构具有以下特点:
  
       
  • 每个微服务在物理上分属不同进程   
  • 服务间往往通过 RESTful 来集成   
  • 多语言,多数据库,多运行时   
  • 网络的不可靠特性   
  • 不同的团队和交付周期  
  上述的这些微服务环境的特点,决定了在微服务场景中进行测试自然会面临的一些挑战:
  
       
  • 服务间依赖关系复杂   
  • 需要为每个不同语言,不同数据库的服务搭建各自的环境   
  • 端到端测试时,环境准备复杂   
  • 网络的不可靠会导致测试套件的不稳定   
  • 团队之间的 沟通成本  
  测试的分层

   相比于常见的 三层测试金字塔 ,在微服务场景下,这个层次可以被扩展为5层(如果将UI测试单独抽取出来,可以分为六层)。
  
       
  • 单元测试   
  • 集成测试   
  • 组件测试   
  • 契约测试   
  • 端到端测试  
   
微服务场景下的自动化测试-1 (金字塔,数据库,成本,而且,能力)

  和测试金字塔的基本原则相同:
  
       
  • 越往上,越接近业务/最终用户;越往下,越接近开发   
  • 越往上,测试用例越少   
  • 越往上,测试成本越高(越耗时,失败时的信息越模糊,越难跟踪)  
  单元测试

  单元测试,即每个微服务内部,对于领域对象,领域逻辑的测试。它的隔离性比较高,无需其他依赖,执行速度较快。
  对于业务规则:
  
       
  • 商用软件需要License才可以使用,License有时间限制   
  • 需要License的软件在到期之前,系统需要发出告警  
         [code]@Test
public void license_should_expire_after_the_evaluation_period() {
    LocalDate fixed = getDateFrom("2015-09-03");
    License license = new License(fixed.toDate(), 1);

    boolean isExpiredOn = license.isExpiredOn(fixed.plusYears(1).plusDays(1).toDate());
    assertTrue(isExpiredOn);
}

@Test
public void license_should_not_expire_before_the_evaluation_period() {
    LocalDate fixed = getDateFrom("2015-09-05");
    License license = new License(fixed.toDate(), 1);

    boolean isExpiredOn = license.isExpiredOn(fixed.plusYears(1).minusDays(1).toDate());
    assertFalse(isExpiredOn);
}
[/code]        上面这个例子就是一个非常典型的单元测试,它和其他组件基本上没有依赖。即使要测试的对象对其他类有依赖,我们会Stub/Mock的手段来将这些依赖消除,比如使用 mockito / PowerMock 。
  集成测试

  系统内模块(一个模块对其周边的依赖项)间的集成,系统间的集成都可以归类为集成测试。比如
  
       
  • 数据库访问模块与数据库的集成   
  • 对外部 service 依赖的测试,比如对第三方支付,通知等服务的集成  
   集成测试强调模块和外部的交互的验证,在集成测试时,通常会涉及到外部的组件,比如数据库,第三方服务。这时候需要尽可能真实的去与外部组件进行交互,比如使用和真实环境相同类型的数据库,采用独立模式(Standalone)的 WireMock 来启动外部依赖的RESTful系统。
  通常会用来做模拟外部依赖工具包括:
  
       
  • WireMock   
  • mountebank  
  其中,mountbank还支持Socket级别的Mock,可以在非HTTP协议的场景中使用。

微服务场景下的自动化测试-2 (金字塔,数据库,成本,而且,能力)

  组件测试

   贯穿应用层和领域层的测试。不过通常来说,这部分的测试不会访问真实的外部数据源,而是使用同 schema 的内存数据库,而且对外部service的访问也会使用Stub的方式:
  
       
  • 内存数据库   
  • Stub外部服务( WireMock )   
  • RestAssured  
   比如使用 h2 来做内存数据库,并且自动生成schema。使用WireMock来Stub外部的服务等。
         [code]@Test
public void should_create_user() {
    given().contentType(ContentType.JSON).body(prepareUser()).
            when().post("/users").
            then().statusCode(201).
            body("id", notNullValue()).
            body("name", is("Juntao Qiu")).
            body("email", is("[email protected]"));
}

private User prepareUser() {
    User user = new User();
    user.setName("Juntao Qiu");
    user.setEmail("[email protected]");
    user.setPassword("password");
    return user;
}
[/code]        如果使用Spring,还可以通过 profile 来切换不同的数据库。比如下面这个例子中,默认的profile会连接数据库 jigsaw ,而 integration 的profile会连接 jigsaw_test 数据库:
         [code]spring:
  datasource:
    url: jdbc:mysql://localhost:3306/jigsaw
    driver-class-title: com.mysql.jdbc.Driver
    username: root
    password: password

---

spring:
  profiles: integration

  datasource:
    url: jdbc:mysql://localhost:3306/jigsaw_test
    driver-class-title: com.mysql.jdbc.Driver
    username: root
    password: password
[/code]       组件测试会涉及到的组件包括:
  
       
  • URL路由   
  • 序列化与反序列化   
  • 应用对领域层的访问   
  • 领域层对数据的访问   
  • 数据库访问层  
  前后端分离

  除了后端的测试之外,在目前的前后端分离场景下,前端的应用越来越复杂,在这种情况下,前端的组件测试也是一个测试的重点。
  一个前端应用至少包括了这样一些组件:
  
       
  • 前端路由   
  • 模板   
  • 前端的MVVM   
  • 拦截器   
  • 事件的响应  
   要确保这些组件组合起来还能如预期的执行,相关测试必不可少。这篇文章详细讨论了前后端分离之后的测试及开发实践。
  契约测试

   在微服务场景中,服务之间会有很多依赖关系。根据 消费者驱动契约 ,我们可以将服务分为消费者端和生产者端,通常消费者自己会定义需要的数据格式以及交互细节,并生成一个契约文件。然后生产者根据自己的契约来实现自己的逻辑,并在持续集成环境中持续验证。
   Pact 已经基本上是 消费者驱动契约 (Consumer Driven Contract)的事实标准了。它已经有多种语言的实现,Java平台的可以使用 pact-jvm 及相应的 maven / gradle 插件进行开发。
  
       
  • pact / pact-jvm   
  • pact-broker  

12下一页
友荐云推荐




上一篇:Linux Journal October 2016
下一篇:Different JSON files in ASP.net Core
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

飞槐 发表于 2016-10-2 20:15:30
太邪乎了吧?
回复 支持 反对

使用道具 举报

uyadz 发表于 2016-10-8 22:54:54
围观 围观 沙发在哪里!!!
回复 支持 反对

使用道具 举报

v信956924057 发表于 2016-10-10 11:35:01
只要不下流,我们就是主流!  
回复 支持 反对

使用道具 举报

wx_M7I0pc0D 发表于 2016-10-13 14:31:01
顶起出售广告位
回复 支持 反对

使用道具 举报

yxlamkiv 发表于 2016-11-6 16:23:41
1v1飘过
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表