单元测试中的Fluent Interface

简介:
  测试的重要性是每个程序员都明白的, 但真正自己去做测试(Unit Test)的却很少, 曾经我也是其中的一员.
  因为写个main调用一些方法, 打印出结果或状态, 然后人工肉眼去排查, 若不是迫于无奈, 我相信没有程序员愿意纠结于这些琐碎的东西.
  其实, 测试本可以很有趣的.借助 JUnit, 我们可以将测试按不同的场景组织起来, 在”一键”之后的红绿条的反馈下, 快速解决代码中存在的问题. 如果你还不太了解JUnit, 请先去这里. 后文将以JUnit为基础, 以Fluent Interface(这个在国内还比较时髦的术语)为切入点, 展示一下更有趣的测试.
  在解释什么是Fluent Interface之前, 请先看这样一段测试代码:
public class Calculator {
public int sum(int one, int other);
}
public class CalculatorTest {
private final Calculator calc = new Calcuator();
@Test public void 08 onePlusOne() {
assertEquals(2, calc.sum(1, 1));
}
}
  上述代码是基于JUnit4编写的, 用assertEquals来测试Calculator的sum方法对一加一计算的结果. 这种写法很简单, 但从语义上并不是那么流畅, 若换种写法, 如:
public class CalculatorTest {
[...]
@Test public void
assertThatOnePlusOneIsEqualToTwo() {
assertThat(calc.sum(1, 1)).isEqualTo(2);
}
}
  这样阅读起来是否感到更为清晰呢? 若是将语句中的符号换成空格:
  assert that calc sum 1 and 1 is equal to 2
  这几乎就是人类的自然语言了(囧, 尽管是e文).
  也许这个例子只是让大家看到易读性的优势, 那么再看看下面这个易编写的例子:
public interface Querier {
Collection<String> findNameBy(int age);
}
public class OrderQuerier {
private final Querier querier = [...]
@Test public void
findNamesWithAgeInThirty() {
Collection<String> names = querier.findNameBy(30);
assertEquals(2, names.size());
assertTrue(names.contains("allen"));
assertTrue(names.contains("john"));
}
@Test public void
findNamesWithAgeInThirty() {
Collection<String> names = querier.findNameBy(30);
assertThat(names).hasSize(2).contains("allen", "john");
}
}
  怎么样, 上面这个对比下, 后者是否能让你感到”清爽”呢?
  assertThat风格的assert正是应用了Fluent Interface, 使得测试的代码流畅易读, 编写简单.
  Fluent interface可以看作是借用了Method Chaining来实现的一种Internal DSL(Domain-Specific Language), 关于它这儿有更为全面的介绍.
  前面展示的assertThat仅是FEST-Assert提供一组API的很小一部分, 它还支持其它的:
  Primary Type
  Object
  Array
  Iterator
  Throwable
  File
  Map
  除了FEST-Assert, 其实还有另一个在JUnit测试中被广泛应用的”assertThat”——hamcrest, 它使用静态导入加工厂方法实现的Internal DSL, 同样很有趣的, 不妨look一下.
最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
6月前
|
Serverless
函数计算中,测试代码“failed to match interface”
函数计算中,测试代码“failed to match interface”
61 0
|
Go C++
测试Go语言的interface的效率
interface是Go语言中的一大特点,甚至说是灵魂也不为过。 interface应该会在Go程序中大量出现和使用,因为有必要了解和测试下它的效率。
720 0
|
15天前
|
测试技术 C语言
网站压力测试工具Siege图文详解
网站压力测试工具Siege图文详解
23 0
|
1月前
|
JavaScript jenkins 测试技术
这10款性能测试工具,收藏起来,测试人的工具箱!
这10款性能测试工具,收藏起来,测试人的工具箱!
|
1月前
|
人工智能 监控 测试技术
利用AI辅助工具提升软件测试效率
【2月更文挑战第17天】 随着科技的不断发展,人工智能(AI)在各个领域的应用越来越广泛。在软件测试领域,AI技术也发挥着重要作用。本文将探讨如何利用AI辅助工具提升软件测试效率,包括自动化测试、智能缺陷识别和预测等方面。通过引入AI技术,软件测试过程将变得更加高效、准确和可靠。
182 1
|
1月前
|
Web App开发 前端开发 测试技术
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
|
1月前
|
测试技术
现代软件测试中的自动化工具与挑战
传统软件测试面临着越来越复杂的系统架构和不断增长的测试需求,自动化测试工具应运而生。本文将探讨现代软件测试中自动化工具的应用和挑战,深入分析其优势与局限性,为软件测试领域的发展提供思路和启示。
|
30天前
|
jenkins 测试技术 持续交付
现代软件测试中的自动化工具与挑战
随着软件开发领域的不断发展,自动化测试工具在测试过程中扮演着越来越重要的角色。本文将探讨现代软件测试中自动化工具的应用及面临的挑战,旨在帮助开发人员和测试人员更好地理解和应对自动化测试中的问题。
|
15天前
|
测试技术 Linux Apache
网站压力测试工具webbench图文详解
网站压力测试工具webbench图文详解
12 0

热门文章

最新文章