0

我正在尝试使用 ant 作为构建系统的 ScalaTest。我正在尝试使用示例代码

package se.uu.molmed.SandBoxScalaTest

import org.scalatest.FlatSpec
import org.scalatest.Tag

object SlowTest extends Tag("com.mycompany.tags.SlowTest")
object DbTest extends Tag("com.mycompany.tags.DbTest")

class TestingTags extends FlatSpec {

  "The Scala language" must "add correctly" taggedAs(SlowTest) in {
      val sum = 1 + 1
      assert(sum === 2)
    }

  it must "subtract correctly" taggedAs(SlowTest, DbTest) in {
    val diff = 4 - 1
    assert(diff === 3)
  }
}

我正在尝试使用以下 ant 目标运行它:

<!-- Run the integration tests -->
<target name="slow.tests" depends="build">
    <taskdef name="scalatest" classname="org.scalatest.tools.ScalaTestAntTask">
        <classpath refid="build.classpath" />
    </taskdef>

    <scalatest parallel="true">
        <tagstoinclude>
            SlowTests   
        </tagstoinclude>
        <tagstoexclude>
            DbTest
        </tagstoexclude>

        <reporter type="stdout" />
        <reporter type="file" filename="${build.dir}/test.out" />

        <suite classname="se.uu.molmed.SandBoxScalaTest.TestingTags" />
    </scalatest>
</target>

它编译得很好,并运行套件,但不包括测试。我希望它在上面的代码中运行两个测试中的第一个。输出如下所示:

slow.tests:
[scalatest] Run starting. Expected test count is: 0
[scalatest] TestingTags:
[scalatest] The Scala language
[scalatest] Run completed in 153 milliseconds.
[scalatest] Total number of tests run: 0
[scalatest] Suites: completed 1, aborted 0
[scalatest] Tests: succeeded 0, failed 0, ignored 0, pending 0, canceled 0
[scalatest] All tests passed.

为什么会这样?任何帮助将非常感激。

4

1 回答 1

1

问题是标签的名称是传递给标签构造函数的字符串。在您的示例中,名称是“com.mycompany.tags.SlowTest”和“com.mycompany.tags.DbTest”。解决方法是在 ant 任务的 tagsToInclude 和 tagsToExclude 元素中使用这些字符串,如下所示:

<scalatest parallel="true">
    <tagstoinclude>
        com.mycompany.tags.SlowTest   
    </tagstoinclude>
    <tagstoexclude>
        com.mycompany.tags.DbTest
    </tagstoexclude>

    <reporter type="stdout" />
    <reporter type="file" filename="${build.dir}/test.out" />

    <suite classname="se.uu.molmed.SandBoxScalaTest.TestingTags" />
</scalatest>

不幸的是,这种有点容易出错的设计是被迫的,因为我们希望在某些情况下允许注释用于标记,无论是在将测试编写为方法时,还是当您想一次标记一个类中的所有测试时。例如,您可以(在 ScalaTest 2.0 中)使用类上的 @Ignore 注释将类中的每个测试标记为已忽略,如下所示:

导入 org.scalatest._

@Ignore class MySpec extends FlatSpec { // 这里的所有测试都将被忽略 }

但是您可以使用任何标签来做到这一点,而不仅仅是 org.scalatest.Ignore。因此,您传递给 Tag 类的字符串旨在成为该标记的姊妹注释的完全限定名称。有关此设计的更多详细信息在这里:

http://www.artima.com/docs-scalatest-2.0.M3/#org.scalatest.Tag

于 2012-08-16T21:11:38.497 回答