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

时间:2015-12-01 23:39:17

标签: unit-testing testing playframework playframework-2.0 integration-testing

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

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

1)测试控制器与WithApplication vs WithServer

  • 选项1是将控制器测试为普通单元测试
  • 选项2是使用WithApplication和FakeRequest测试路线(知道路线调用控制器功能,这种方法感觉比选项1更完整)
  • 选项3是使用带有WS的WithServer发出请求并等待响应(这与选项2非常相似,除非它使用的是真实服务器)

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

2)在内存DB与真实数据库中

  • 内存中的DB(H2)似乎不支持某些Postgres功能
  • 针对内存数据库的测试未反映与真实数据库的连接

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

3)WithBrowser(Selenium)

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

在测试Web应用程序方面似乎缺少一些东西,并且非常感谢澄清。

1 个答案:

答案 0 :(得分:8)

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

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

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