Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 解释PlayFramework 2中测试工具之间的差异(带应用程序、带服务器、带浏览器、内存等)_Unit Testing_Testing_Playframework_Playframework 2.0_Integration Testing - Fatal编程技术网

Unit testing 解释PlayFramework 2中测试工具之间的差异(带应用程序、带服务器、带浏览器、内存等)

Unit testing 解释PlayFramework 2中测试工具之间的差异(带应用程序、带服务器、带浏览器、内存等),unit-testing,testing,playframework,playframework-2.0,integration-testing,Unit Testing,Testing,Playframework,Playframework 2.0,Integration Testing,我不熟悉web应用程序开发,尤其是Play框架。我的目标是确保我的应用程序经过良好测试,遵循测试驱动的开发原则 Play在其文档中提供了几种测试Play应用程序的方法,通常我很难决定应该做哪些测试,哪些测试可以不用 1) 测试控制器与应用程序与服务器 选项1是将控制器作为普通单元测试进行测试 选项2是使用WithApplication和FakerRequest测试路由(知道路由调用控制器功能,这种方法比选项1更完整) 选项3是使用带有WS的服务器发出请求并等待响应(这感觉与选项2非常相似,只是

我不熟悉web应用程序开发,尤其是Play框架。我的目标是确保我的应用程序经过良好测试,遵循测试驱动的开发原则

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

1) 测试控制器与应用程序与服务器

  • 选项1是将控制器作为普通单元测试进行测试
  • 选项2是使用WithApplication和FakerRequest测试路由(知道路由调用控制器功能,这种方法比选项1更完整)
  • 选项3是使用带有WS的服务器发出请求并等待响应(这感觉与选项2非常相似,只是它使用的是真正的服务器)
使用选项3进行测试是否只是使用选项2进行测试的冗余?一个能被抛弃,另一个能被取代吗

2) 内存中数据库与实际数据库

  • 内存中的DB(H2)似乎不支持Postgres的某些功能
  • 针对内存中数据库的测试并不反映与真实数据库的连接
基于上述原因,我觉得使用内存中的DB进行测试可能会导致未捕获的错误。现在,我了解到使用真正的数据库不再称为单元测试,因为存在外部依赖关系。但是在这种情况下,单元测试真的是我们想要的吗

3) WithBrowser(Selenium)

这种方法的优点是显而易见的,而且可能是不可替代的(对吗?)


在测试web应用程序时,我似乎遗漏了一些东西,对此我将不胜感激。

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

WithServer
有许多有趣的用例。首先,它比
with application
更全面的集成测试,如果你用一个假请求调用一个控制器,那么会走很多捷径,而用一个真正的请求通过线路调用控制器不会走任何捷径。另一个有趣的用例是测试HTTP客户机代码-您可能希望确保您的HTTP客户机实际发出有意义的HTTP请求,因此您可以使用模拟路由器设置一些模拟控制器,并使用服务器运行它们。最后,如果您想将实际的客户机测试到您已经编写的RESTAPI,并与实际的服务对话,那么,
WithServer
可能很有用

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