当前位置:  开发笔记 > 编程语言 > 正文

解释PlayFramework 2中的测试工具之间的差异(WithApplication,WithServer,WithBrowser,InMemory等...)

如何解决《解释PlayFramework2中的测试工具之间的差异(WithApplication,WithServer,WithBrowser,InMemory等)》经验,为你挑选了1个好方法。

我是Web应用程序开发的新手,使用Play Framework更是如此.我的目标是按照测试驱动开发原则确保我的应用程序经过充分测试.

Play在其文档中提供了几种测试Play应用程序的方法,而且我经常难以决定我应该做哪些类型的测试,以及哪些测试可以不用.

1)测试控制器与WithApplication vs WithServer

选项1是将控制器测试为普通单元测试

选项2是使用WithApplication和FakeRequest测试路由(知道路由调用控制器功能,这种方法感觉比选项1更完整)

选项3是使用带有WS的WithServer发出请求并等待响应(这与选项2非常相似,除非它使用真实服务器)

使用选项3进行测试只是使用选项2进行测试时的冗余吗?可以丢弃一个而不是另一个吗?

2)在内存DB与真实DB中

内存中的DB(H2)似乎不支持某些Postgres功能

针对内存数据库的测试并不反映与真实数据库的连接

基于上述原因,我觉得使用内存数据库进行测试可能会导致未捕获的错误.现在,我明白使用真正的数据库不再称为单元测试,因为存在外部依赖性.但在这种情况下,单元测试真的是我们想要的吗?

3)WithBrowser(Selenium)

这种方法的优点很明显,而且可能是不可替代的(对吧?)

在测试Web应用程序时,我似乎错过了一些东西,并且非常感谢澄清.



1> James Roper..:

WithApplication用于测试Play应用程序.它不是严格需要测试路由/调用控制器等,它们都可以在没有正在运行的应用程序的情况下进行测试(除非它们不能 - 有些东西依赖于全局状态,但这是我们在Play中逐渐修复的东西). WithApplication我认为当您想要测试所有组件一起工作时,这非常有用.通过使用WithApplication,您可以让Play实例化并将所有内容连接在一起,这可能比在测试中手动设置更容易.

WithServer有许多有趣的用例.首先,它是一个更全面的集成测试WithApplication,如果你调用带有虚假请求的控制器,会采取大量的快捷方式,而通过线路调用带有实际请求的控制器不会采取任何快捷方式.另一个有趣的用例是测试HTTP客户端代码 - 您可能希望确保您的HTTP客户端实际上发出有意义的HTTP请求,因此您使用模拟路由器设置一些模拟控制器,然后运行它们WithServer.最后,WithServer如果您想要将实际客户端测试到您编写的REST API,并与实际服务进行通信,则可能很有用.

无论您是使用内存数据库还是真实数据库进行测试都是一个热门争论的问题,而Play在这里没有见解,它为您提供了必要的工具.有些人喜欢使用数据库抽象工具,并保持他们的数据库访问数据库不可知.对此的动机可以是广泛而多样的,当然可以使用的是单元测试可以在内存数据库中完成.使用内存数据库进行测试提供了很多优势,您可以为每个测试实例化一个新数据库,确保测试隔离 - 这是我在针对真实数据库运行测试时遇到的最大问题.您还可以并行运行测试,它们通常更快,并且可以在任何平台上运行,无需任何基础架构设置.当然,针对不同的数据库进行生产测试确实打开了漏洞的可能性 - 但是,如果没有测试每个可能的输入和输出的每个排列都会导致漏洞漏掉的可能性,因此所有测试都不完善最好,并且必须在测试覆盖率和编写的便利性以及测试的可维护性之间实现平衡.因此,对于某些人来说,针对内存数据库进行测试的优势超过了缺点.然后当然,有人喜欢利用数据库特定功能,对于这些,在内存数据库测试中是不可能的.在Play中对真实数据库编写测试代码并不难,我已经做了很多.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有