BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

测试微服务之单元测试

| 作者 Nathan Peck 关注 0 他的粉丝 ,译者 薛命灯 关注 12 他的粉丝 发布于 2017年11月6日. 估计阅读时间: 5 分钟 | QCon北京2018全面起航:开启与Netflix、微软、ThoughtWorks等公司的技术创新之路!

亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要资讯的邮件和网页通知

上一篇文章里,我们介绍了测试金字塔以及如何将它应用在分布式系统里。



这篇文章将关注测试金字塔里的单元测试层,并探讨如何高效地为分布式系统(如微服务)构建单元测试。

定义测试边界

定义测试边界是实现高效测试的第一步。测试的目的是为了验证边界里“黑盒”的行为是否符合预期,我们向黑盒输入数据,然后验证输出的正确性。

在单元测试里,黑盒指的是函数或者类的方法,目的是单独测试特定代码块的行为。为了更好地理解这个概念,我们以简单的注册功能为例:



我们可以看到这个函数包含了一些输入和输出。这个函数接受基本的用户注册信息作为输入参数,并返回新创建的用户ID。

不过这里也有一些不是很明显的输入数据。这个函数调用了另个外部函数:一个向数据库插入数据,一个对密码进行散列和持久化。在某些情况下,数据库可能会返回错误。比如,因为用户名唯一性问题导致数据库插入失败,又或者需要通过调用外部的微服务进行密码散列,如果网络连接出现问题或密码散列服务因发生过载导致服务超时,那么密码散列函数就会返回错误。

为了全面测试用户注册功能,单元测试所要做的不仅仅是简单地传进去不同的输入参数,它还要能够让外部依赖项能够使用这些输入来验证函数的行为是否符合预期。在测试函数的错误处理逻辑时,这点很重要的。

Stub和Mock

为了制造各种输入数据,需要使用stub,也叫作mock。这个可以使用依赖注入或方法搅拌(swizzle)来实现。测试框架在运行被测试的函数时可以确保对底层依赖项的调用会被重定向到stub上:



我们可以使用stub来达到各种目的:

  • stub可以什么事也不做。这样可以加快个别单元测试的速度,如果后续有其他单元测试可用于测试边界情况的话就可以这样做。
  • stub可返回任意的值,用于模拟外部函数的输出。这在测试罕见的边界情况时会非常有用,比如有些错误场景很少会发生或者难以重现。
  • stub也可以用于捕捉被测试函数欲传给外部函数的参数,或者把这些参数记录下来。这样就可以验证被测试函数需要调用哪些外部函数以及需要传给外部函数哪些参数。

测试分布式系统需要有一套很好的stub,有了这些stub,单元测试才能够在没有外部服务的情况下运行。下面列出了一些工具,用于创建各种stub。

Node.js/JavaScript

  • nock (主要用于模拟HTTP请求行为)

Python

Go

Java

单元测试流程

单元测试的目的是为了给开发人员提供快速验证他们所写代码的行为。因为对外部依赖的调用使用了stub,所以通常可以在几秒钟内就可以执行数千个单元测试。所以,开发人员可以把单元测试加入到他们的开发工作流当中,要么直接集成到他们的IDE里,要么通过终端命令行来运行。开发人员在编写代码的同时频繁地运行单元测试可以帮助他们及早地发现代码中的问题。

一旦开发人员养成了这样的习惯,那么就可以进行测试驱动开发了。开发人员在开发新特性之前会先准备好单元测试,在新特性被加进来之前,测试总是失败。在经过不断的测试和代码修改之后,一个完整的功能被开发出来了,最后再运行测试就能通过。

单元测试的作用不应局限于代码开发,它们也应该被集成到代码合并流程里。GitHub支持一些主流持续集成服务器的状态检查。一般的流程是这样的:保护好“master”分支,不允许开发人员向该分支提交代码,而是让他们把代码提交到其他分支上。在将代码合并到master分支的时候,GitHub要求先通过状态检查。

Jenkins、CircleCI和TravisCI都提供了状态检查钩子(hook),它们会从分支上获取代码并运行单元测试。如果通过了,就允许合并代码,否则就不允许。

总结

单元测试是测试工具箱里的一个非常重要的工具。为了对分布式系统代码进行全面的单元测试,有必要利用一些支持stub的测试框架,用于模拟各种错误场景或外部依赖的各种响应。

查看英文原文Microservice Testing: Unit Tests

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

As we all kown by yang shuqing

As we all kown

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT