Play 中的单元测试!不需要测试 Play Server 的框架应用程序

Posted

技术标签:

【中文标题】Play 中的单元测试!不需要测试 Play Server 的框架应用程序【英文标题】:Unit Test in Play! Framework Application that does not require a test Play Server 【发布时间】:2011-06-16 05:55:40 【问题描述】:

在我的 Play 中运行测试的一个选项!应用程序是通过执行命令play auto-test

Play 似乎识别要运行的测试的一种方法是查找所有具有超类 play.test.UnitTest(或其他 Play 等效项)的测试类。有一个测试类扩展 UnitTest 似乎会带来一些开销,正如控制台中吐出的一些东西所示:

INFO   info, Starting C:\projects\testapp\.
WARN   warn, Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.secure)
INFO   info, Module secure is available (C:\play-1.2.1\modules\secure)
INFO   info, Module spring is available (C:\projects\testapp\.\modules\spring-1.0.1)
WARN   warn, Actually play.tmp is set to null. Set it to play.tmp=none
WARN   warn, You're running Play! in DEV mode
INFO   info, Connected to jdbc:h2:mem:play;MODE=mysql;LOCK_MODE=0
INFO   info, Application 'Test App' is now started !

显然,为需要这种设置的测试提供 Play 环境很有用,但是,如果我有一个测试类来测试执行不需要 Play 环境的逻辑的生产代码,我不想扩展 @ 987654326@ 这样我就可以避免启动 Play 环境的开销。

如果我有一个不扩展 UnitTest 的测试类,那么它不会被命令 play auto-test 执行。有没有办法让play auto-test 命令执行所有测试,无论我是否扩展Play 的UnitTest

编辑:实际上有人为这个问题提出了ticket

【问题讨论】:

【参考方案1】:

简短的回答:不。一个更长的答案:除非您更改框架中的代码,否则不会。自动测试是设置服务器并触发测试的 Ant 任务,但它不使用 ant 任务,因此它不会检测(默认情况下)您的“正常”单元测试。

您有两个选择:要么在 Play 的 Ant 文件中添加一个额外的任务以通过该任务运行单元测试(您还需要包含相关的 jar),或者您编辑用于启动 Play 测试环境的代码.

两者都意味着将框架更改到某个级别。尽管假设您正在使用 Play,但我想知道为什么您不应该让所有测试都遵循 Play 模式...

【讨论】:

好吧,我有一些测试可以测试不需要任何“播放”功能的类。假设我有一个 Math 类,它有一个名为“int add(int left, int right)”的方法。添加两个数字的概念不应该要求我有一个游戏测试环境。 @digiarnie 我理解,但测试背后的想法是一次运行所有这些以确保一切正常,所以在这种情况下它是有道理的:) 我不知道你想在那里说什么。我的问题是除非我扩展 UnitTest,否则自动测试“不会”运行所有测试。正如您所说,测试背后的想法是一次运行所有这些。 “播放自动测试”忽略不扩展 UnitTest(或其他播放超类)的测试... 好吧,我的意思是你有一些你在 Play 中使用的代码。您想一次运行该项目的所有测试。播放自动测试仅识别“播放测试”。但是,如果您的代码在那里使用,在 Play 项目中,将您的测试变成“Play Tests”是有意义的,因为您想在项目的其他测试中运行它们。它比其他方式更简单(或应该)。通过在 Play 内部使用的代码中不使用 Play 测试格式,您正在打破框架的“约定优于配置”,我不明白为什么在这种情况下这是一个要求 :) 一个原因:如果必须开始运行,在 Eclipse 中运行单个测试需要很长时间。如果play test 找到其他测试并可选地包含它们,那就太好了。【参考方案2】:

如果这些测试不需要任何 Play!功能,你为什么不把它们放在图书馆里?使用您的示例(数学添加):创建一个calculator.jar 包,并在运行测试后使用 Ant 或 Maven 构建它。 像这样,您可以在多个 Play 中使用您的库!项目(或 Spring、Struts 等,如果你愿意的话。

【讨论】:

【参考方案3】:

我真的不明白为什么这个问题本身甚至值得商榷。进行简单而小型的单元测试(即使在项目的 Web 部分中)是最正常的做法。 如果您有很多测试,框架初始化的额外开销会显着减慢您的往返速度。从票证中可以看出,当前的解决方法是让您的单元测试扩展 org.junit.Assert 而不是 play.test.UnitTest

【讨论】:

以上是关于Play 中的单元测试!不需要测试 Play Server 的框架应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Play 中为 OneAppPerTest 中的每个测试重新创建数据库并进化

Play 2.2:使用 Play Caching (Scala) 对代码进行单元测试时出现问题

避免在 Play 中打开未使用的数据库连接

使用 mock 对 Play 控制器进行单元测试

play framework + DI中完整的单元测试示例

在 Play 框架中使用 @Before 进行 Selenium 测试