注释排除不适用于 sbt test/testOnly

Exclusion by annotation not working for sbt test/testOnly

考虑以下 org.scalatest.TagAnnotation subclass:

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一个class一起吧:

@HugeTestClass
class ItemsJobTest extends FunSuite with BeforeAndAfterEach with DataFrameSuiteBase {

现在我们想要快速 "smoke test suite" 代码库;因此,让我们(尝试排除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 classes 的正确语法/方法是什么?

您错过了将 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

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

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"