《2021最新Java面试题全集-2021年第二版》不断更新完善!

    

第二十七章 CI/CD Jenkins

1:谈一谈测试驱动开发(TDD)的好处以及你的理解。

TDD是指在编写真正的功能实现代码之前先写测试代码,然后根据需要重构实现代码。在JUnit的作者Kent Beck的大作《测试驱动开发:实战与模式解析》(Test-Driven Development: by Example)一书中有这么一段内容:“消除恐惧和不确定性是编写测试驱动代码的重要原因”。

因为编写代码时的恐惧会让你小心试探,让你回避沟通,让你羞于得到反馈,让你变得焦躁不安,而TDD是消除恐惧、让Java开发者更加自信更加乐于沟通的重要手段。TDD会带来的好处可能不会马上呈现,但是你在某个时候一定会发现,这些好处包括:

- 更清晰的代码 — 只写需要的代码

- 更好的设计

- 更出色的灵活性 — 鼓励程序员面向接口编程

- 更快速的反馈 — 不会到系统上线时才知道bug的存在

 

敏捷软件开发的概念已经有很多年了,而且也部分的改变了软件开发这个行业,TDD也是敏捷开发所倡导的。

TDD可以在多个层级上应用,包括单元测试(测试一个类中的代码)、集成测试(测试类之间的交互)、系统测试(测试运行的系统)和系统集成测试(测试运行的系统包括使用的第三方组件)。

TDD的实施步骤是:红(失败测试)- 绿(通过测试) - 重构。

在使用TDD开发时,经常会遇到需要被测对象需要依赖其他子系统的情况,但是你希望将测试代码跟依赖项隔离,以保证测试代码仅仅针对当前被测对象或方法展开,这时候你需要的是测试替身。测试替身可以分为四类:

- 虚设替身:只传递但是不会使用到的对象,一般用于填充方法的参数列表

- 存根替身:总是返回相同的预设响应,其中可能包括一些虚设状态

- 伪装替身:可以取代真实版本的可用版本(比真实版本还是会差很多)

- 模拟替身:可以表示一系列期望值的对象,并且可以提供预设响应

Java世界中实现模拟替身的第三方工具非常多,包括EasyMockMockitojMock等。