Play Framework 2 中测试工具之间差异的解释(WithApplication、With Server、With Browser、In Memory 等...)

Explanation of the differences between testing tools in PlayFramework 2 (WithApplication, WithServer, WithBrowser, InMemory etc...)

我是 Web 应用程序开发的新手,对 Play Framework 更是如此。我的目标是确保我的应用程序经过良好测试,遵循测试驱动开发原则。

Play 在其文档中提供了几种测试 Play 应用程序的方法,但我常常难以决定应该进行哪些测试,哪些可以不进行。

1) 测试控制器与 WithApplication 与 WithServer

选项 3 的测试是否只是选项 2 测试的冗余?可以舍弃其中之一吗?

2) 内存数据库与真实数据库

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

3) WithBrowser (硒)

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

似乎我在测试 Web 应用程序时遗漏了一些东西,非常感谢澄清。

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

WithServer 有许多有趣的用例。其一,它比 WithApplication 更彻底的集成测试,如果您使用虚假请求调用控制器,会走很多捷径,而通过线路调用带有真实请求的控制器则不会走任何捷径.另一个有趣的用例是测试 HTTP 客户端代码——您可能想确保您的 HTTP 客户端实际上发出有意义的 HTTP 请求,因此您设置了一些带有模拟路由器的模拟控制器,并 运行 它们带有 WithServer.最后,WithServer 如果您想将实际客户端测试到您编写的与实际服务对话的 REST API,那么 WithServer 可能会有用。

使用内存数据库还是真实数据库进行测试是一个争论不休的问题,而 Play 在这里并不固执己见,它为您提供了两者所需的工具。有些人喜欢使用数据库抽象工具,并使他们的数据库访问与数据库无关。这样做的动机多种多样,当然其中一个动机是可以在内存数据库中完成单元测试。使用内存数据库进行测试有很多优势,您可以为每个测试实例化一个新数据库,确保测试隔离 - 这是我在 运行ning 测试真实数据库时遇到的最大问题。您还可以 运行 并行测试,它们通常更快,并且它们可以 运行 在任何平台上运行而无需任何基础设施设置。当然,针对与生产环境不同的数据库进行测试确实存在漏洞漏过的可能性——但是,如果不测试每个可能的输入和输出的每个排列,就会存在漏洞漏过的可能性,因此所有测试都不完美最好,并且必须在测试覆盖率和编写的便利性和测试的可维护性之间取得平衡。因此,对于某些人来说,针对内存数据库进行测试的优势大于劣势。当然,有些人喜欢利用数据库的特定功能,对于这些人来说,内存数据库测试是不可能的。在Play中针对真实数据库编写测试代码并不难,我已经做了很多。