注释排除不适用于sbt测试/仅测试

注释排除不适用于sbt测试/仅测试,sbt,scalatest,Sbt,Scalatest,考虑以下org.scalatest.TagAnnotation子类: public class TestSizeTags { /** Tests with crazy long runtimes **/ @org.scalatest.TagAnnotation @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE})

考虑以下
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 {}

}
让我们用它来注释一个类:

@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)
所以测试确实运行了。。与本意相反


那么,通过
sbt
scalatest
类应用
标记过滤器(/Exclusion)
的正确语法/方法是什么呢?

您没有将
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问题很有帮助-

但它不适用于静态标记注释,

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
Tag
来包括或排除,例如
对象HugeTestClassTag扩展org.scalatest.Tag(“DatabaseTest”)
然后将
HugeTestClassTag
添加到我的测试方法中。顺便问一下,
HugetTestClass
对你来说应该是静态类吗?@prayagupd是的,它是静态的:更新了OP以显示它是一个内部类尝试将你的testOnly部分放在双引号中,同时给标记完整的包以忽略。@prayagupd Same behavior.Dammit。我贴了一个工作示例作为回答。那里也一样吗?这对我有用。执行时缺少两件事:1)
和2)HugetTestClass的完整包。感谢您提供的信息:将作为顶级而非内部类尝试标记。好朋友,scala在某些情况下不喜欢静态,但我对此没有很好的解释。为什么
--
sbt中“仅测试*--l标记。ExcludeMePleaseTag”
?如果我没有在sbt命令中指定
--
,标记的测试不会被排除。@TarangBhalodia
--
告诉仅测试命令没有更多的测试类参数,允许将
-l标记。ExcludeMePleaseTag
作为选项传递。