如何让sbt获取用groovy编写的测试?

时间:2015-08-21 02:46:25

标签: sbt

我找到了sbt-groovy plugin,它恰当地编译了测试和主要来源。但是,definedTests键始终为空; SBT从未发现任何常规测试。我已使用一个非常简单的单src/test/groovy/Test.groovy验证了此问题,其中一个方法已注明@Test,应该由junit-interface选取。

我认为问题的根源在于sbt-groovy插件需要在own plugin source code中定义任务“definedTests”。此任务提供Seq[TestDefinition]

查看SBT本身如何填充序列显示它使用了scala编译器的其他输出(这也适用于编译java文件,因此它可以直接用于java)在Analysis类中填充来自IncrementalCompiler

的输出

fiddled around with the taskdef,但我不确定我是否走在正确的道路上。关于这些内容的文档相当稀疏,或与IncrementalCompiler密切相关。

在sbt-groovy中我需要使用什么代码来生成满足SBT的Seq[TestDefinition]以便我可以运行用Groovy编写的测试(由junit-interface选取)?

1 个答案:

答案 0 :(得分:2)

测试检测代码位于Tests.discover,您可能会感兴趣。 看起来你需要的只是带有注释和子类列表的方法列表。 如果你有办法找到它们,你可能会模仿代码中发生的事情。

正如您所提到的,发现代码依赖于Analysis数据类型,它是内部的肠道内容。 增量编译器。你或许可以利用它的事实 负责增量编译的sbt(不是Scala或Java编译器)。 对于Java编译,AnalyzingJavaCompiler.compile调用编译器然后进行分析。

理论上,您可以定义使用相同机制的AnalyzingGroovyCompiler 作为用于Java编译的那个。从那以后,这不完全是在公园散步 一些部分隐藏在private[sbt]后面。 简而言之,我总结了一个hacky概念验证,它将增量编译器与Groovy代码生成Analysis进行了争论,并且能够检测到测试。

我只测试了一个简单的用例

import org.junit.Test
import org.junit.Assert

class Foo {
  @Test
  public void foo() {
    Assert.assertEquals(1, 2)
  }
}

从sbt运行test会产生以下输出:

> test
[info] Start Compiling Test Groovy sources : /Users/xxx/sbt-2167-groovy/src/test/groovy 
[error] Test Foo.foo failed: expected:<1> but was:<2>, took 0.062 sec
[error] Failed: Total 1, Failed 1, Errors 0, Passed 0
[error] Failed tests:
[error]         Foo
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 1 s, completed Aug 23, 2015 5:05:01 AM

它可能不适用于sbt的未来版本。注意事项。