gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:51:24 26 4
gpt4 key购买 nike

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

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

1) 测试 Controller 与 WithApplication 与 WithServer

  • 选项 1 是将 Controller 作为普通单元测试进行测试
  • 方案二是使用WithApplication和FakeRequest测试路由(知道路由调用了controller函数,这种方式感觉比方案一更完整)
  • 选项3是使用WithServer和WS来发出请求并等待响应(这感觉和选项2非常相似,除了它使用的是真实的服务器)

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

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

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

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

3)使用浏览器( Selenium )

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

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

最佳答案

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

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

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

关于unit-testing - Play Framework 2 中测试工具之间差异的解释(WithApplication、With Server、With Browser、In Memory 等...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34032351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com