由于测试加载的ApplicationContext和Web容器加载的ApplicationContext存在差异,非端到端测试可能会漏掉一些问题。比如在非端到端测试中一次性加载了booking-servlet.xml和root.xml,使他们成为了一个整体的上下文,而实际上在Web容器中并不完全是这样,root.xml中的bean并不能访问和控制booking-servlet.xml中的bean。一个常见问题就是如果在booking-servlet.xml中需要使用占位符,而恰巧我们已经在root.xml中有一个现成的<context:placeholder/>,看起来水到渠成,而且在测试中也没有问题,但实际部署到web容器时,就会加载失败。
非端到端的验收测试不能作为任务完成的最终标准。因为还有UI部分还没有完成。当这类验收测试通过时,我把这个任务称作“可以进入UI调试的”。
因此,如果团队有足够的技能和资源时还是应该直接使用端到端的验收测试,尤其当应用程序提供API(比如WebService)或是采用更易于解析的数据格式与客户端交互时。比如如果应用程序提供了基于JSON的API,完全可以使用http-client来驱动测试。
实现非端到端的验收测试
来看看第一个验收测试,这个案例来自于著名的dddsample,为了让验收测试能够看上去高端大气上档次,我们将使用Cucumber来组织验收测试。验收场景描述的是业务员如何登记航运货件并解释了登记完成后货件的各项状态。
图表 3 第一个用户故事及其验收场景
Cucumber提供了一系列的Annotation来帮助我们验收场景文本与测试代码粘连在一起。
图表 4实现验收测试-1
图表 5 实现验收测试-2
接下来,当运行测试时,你就可以得到一份漂亮的html报告
图表 6 测试运行入口