正文
关于术语
和许多TDD爱好者聊过以后,我了解了他们对“集成测试”这个词有一些不同的理解。他们认为集成测试是测试代码边界,即代码对外的接口部分。
比如他们代码中有Ajax,localStorage或者IndexedDB操作,那其代码就不能做单元测试,这时他们会把这些代码打包成接口,然后在做单元测试的时候mock这些接口。当真正测试这些接口的时候才称作“集成测试”。从这个角度来说,“集成测试”就是在纯的单元测试以外,测试与外部“真实世界”相关的代码。
而我和其他一些人则倾向于认为“集成测试”是将两个或多个单元测试综合起来进行测试的一种方法。通过接口把与外部相关的代码打包到一起,再mock,只是其中的一种实现方式。
我的观点里,决定是否使用真实场景的Ajax或者其他I/O操作进行集成测试(即不使用mock),取决于是否能够保证测试速度足够快,并且能够稳定测试(不发生flaky的情况)。如果可以确定这样的话,那尽管用真实场景进行集成测试就好了。不过如果很慢或者发生不稳定测试的情况,那还是用mock会好一些。
在我们的例子中,计算器应用唯一的真实I/O就是操作DOM了,没有Ajax调用,所以不存在上面的问题。