【问题标题】:Exclusion by annotation not working for sbt test/testOnly注释排除不适用于 sbt test/testOnly
【发布时间】:2017-11-17 04:12:55
【问题描述】:

考虑以下org.scalatest.TagAnnotation 子类:

public class TestSizeTags {

    /** Tests with crazy long runtimes **/
    @org.scalatest.TagAnnotation
    @Inherited
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD, ElementType.TYPE})
    public static @interface HugeTestClass {}

}

让我们annotate/tag上课吧:

@HugeTestClass
class ItemsJobTest extends FunSuite with BeforeAndAfterEach with DataFrameSuiteBase {

现在我们想要在代码库上快速“冒烟测试套件”;因此,让我们(尝试排除HugeTestClass注释的测试用例:

命令行:

sbt test * -- -l HugeTestClass

或者也许:

sbt 'testOnly * -- -l HugeTestClass' 

让我们也尝试在 sbt 本身中:

sbt> testOnly * -- -l HugeTestClass

在上述所有种情况下,我们(不幸地)仍然看到:

[info] ItemsJobTest:
^C[info] - Run Items Pipeline *** FAILED *** (2 seconds, 796 milliseconds)

所以测试实际上确实运行了..与意图相反。

那么通过sbtTag Filter(/Exclusion) 应用于scalatest 类的正确语法/方法是什么?

【问题讨论】:

  • 我使用了 scala Tag 来包含或排除,例如。 object HugeTestClassTag extends org.scalatest.Tag("DatabaseTest") 然后将HugeTestClassTag 添加到我的测试方法中。顺便说一句,HugeTestClass 应该是你的静态类吗?
  • @prayagupd 是的,它是静态的:更新了 OP 以显示它是一个内部类
  • 尝试将 testOnly 部分放在双引号中,同时将完整的包提供给 Tag 以忽略。
  • @prayagupd 相同的行为。
  • 该死的。我在回答中发布了一个工作示例。那里也一样?它为我工作。缺少的两件事是 1) "" 和 2) 在执行时将完整的包打包到 HugeTestClass

标签: sbt scalatest


【解决方案1】:

您错过了将testOnly 部分放在双引号中,并且还忽略了标记注释的完整包,

sbt "test-only * -- -l full.package.to.HugeTestClass"

例子,

标签注释

package tags;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@org.scalatest.TagAnnotation
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface ExcludeMePleaseTag {}

测试排除

@tags.ExcludeMePleaseTag
class ExcludeMeSpecs extends FlatSpec with Matchers {

  "I" should " not run" in {

    888 shouldBe 1
  }

}

排除测试

sbt "test-only * -- -l tags.ExcludeMePleaseTag"

这个 github 问题很有帮助 - https://github.com/harrah/xsbt/issues/357#issuecomment-44867814

但它不适用于静态Tag注解,

public class WrapperClass {

    @org.scalatest.TagAnnotation
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD, ElementType.TYPE})
    public static @interface ExcludeMePleaseTag {
    }

}

sbt "test-only * -- -l tags.WrapperClass.ExcludeMePleaseTag"

【讨论】:

  • 感谢您的信息:将尝试将标签作为顶级而不是内部类。
  • 好朋友,scala 在某些情况下不喜欢静态,不过我对此没有很好的解释。
  • 为什么在-- 中加入sbt "test-only * -- -l tags.ExcludeMePleaseTag"?如果我没有在 sbt 命令中指定--,则不会排除标记测试。
  • @TarangBhalodia -- 告诉 test-only 命令没有更多的测试类参数,允许 -l tags.ExcludeMePleaseTag 作为选项传递。
猜你喜欢
  • 1970-01-01
  • 2020-03-19
  • 2018-11-15
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2021-11-06
  • 2021-06-03
相关资源
最近更新 更多