在ScalaTest中,如何通过系统属性指定测试标记

时间:2014-01-15 00:15:06

标签: scala integration-testing scalatest

我正在将新的scala代码与现有系统集成。我们的数据库测试目前是通过设置系统属性“集成”来触发的(通过Maven和现有的IDE配置)。这让我们可以这样做,例如:

mvn test -Dintegration

包含数据库测试。如果我们离开房产,则跳过测试。基本上,我们现有的JUnit测试都有(它有点干净,但你会明白这一点):

assumeTrue(System.getProperty("integration") != null)

因为我正在添加新的scala代码(注意:使用JUnitRunner,所以这一切都正常工作),我需要能够做同等的....我不想重建我的整个基础设施(持续集成等)...我宁愿做的是写一个基本特征或其他东西,以便我可以将系统属性转换为允许我跳过(或包含)测试的东西。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我阅读了源代码,看起来JUnitRunner甚至不支持以当前形式提供标签;但是,代码很简单,因此最好的方法是从现有的运行器中复制代码,并对其进行修改以满足我的需求。

以下是由于包权限等原因而产生的要求

  1. 您不能将JUnitRunner子类化,因为您需要的位是私有的
  2. 您必须将您的课程放在同一个包中(org.scalatest.junit)
  3. 除此之外,您只需复制现有的JUnitRunner并将run()方法修改为:

     def run(notifier: RunNotifier) {
        val ignoreTags = Set("org.scalatest.Ignore") // the built in ignore support
        val integrationTags = Set(DbTest.name)
        val (tagsToRun, tagsToSkip) =
          (if (System.getProperty("integration") == null)
            (None, integrationTags ++ ignoreTags)
          else
            (Some(integrationTags), ignoreTags)
              )
        try {
          suiteToRun.run(None, Args(new RunNotifierReporter(notifier),
            Stopper.default, Filter(tagsToRun, tagsToSkip), Map(), None,
            new Tracker, Set.empty))
        }
        catch {
          case e: Exception =>
            notifier.fireTestFailure(new Failure(getDescription, e))
        }
      }