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 中的每个测试重新创建数据库并进化