如何使用 scala 在 akka 的 TestKit 中标记测试?

How to tag tests in akka's TestKit using scala?

我想标记某些测试以便(不)运行它们在某些情况下。 (例如 slow 在构建期间应该只 运行,而不是在开发期间。)

在 Scala 中使用 ScalaTest 的 FlatSpec 我知道我可以使用 taggedAs 和 scalatest 的 Tag.

但我不知道如何在演员测试中实现同样的目标。我有扩展 TestKit 的 TestCase,但似乎没有 FlatSpec 提供的 taggedAs 功能。

我希望能够通过

过滤in/out测试
sbt "testOnly -- -l myTag" # runs all except the tagged tests
sbt "testOnly -- -n myTag" # only runs the tagged tests

如何使用 akka 的测试框架实现这一目标?

您可以像这样在 java 文件中添加新注释:

package org.acme;

import org.scalatest.TagAnnotation;

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

@TagAnnotation
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface IntegrationTest { }

然后您可以这样标记您的套房:

@IntegrationTest
class AcmeTest extends ... {
}

最后你可以通过 -l org.acme.IntegrationTest 传递它来排除它(注意 FQCN)

Akka 的 TestKit 假定使用测试框架。来自 documentation:

Akka’s own test suite is written using ScalaTest, which also shines through in documentation examples. However, the TestKit and its facilities do not depend on that framework, you can essentially use whichever suits your development style best.

换句话说,将 TestKit 与 ScalaTest 等框架结合使用。将 TestKit 和任何你想使用的 ScalaTest 特征(例如 FlatSpec)混合到你的测试中,你可以使用 taggedAs.

例如,考虑 Akka 的内部测试之一 SupervisorHierarchySpec,它使用 TestKit 和 ScalaTest 标记:

class SupervisorHierarchySpec extends AkkaSpec(SupervisorHierarchySpec.config) with DefaultTimeout with ImplicitSender {
  ...
  "A Supervisor Hierarchy" must {

    "restart manager and workers in AllForOne" taggedAs LongRunningTest in {
       ...
    }
    ...
  }
}

此测试扩展了 AkkaSpec,它是一个抽象 class,混合了 TestKit 和 ScalaTest 特征:

abstract class AkkaSpec(_system: ActorSystem)
  extends TestKit(_system) with WordSpecLike with Matchers with BeforeAndAfterAll with WatchedByCoroner
  with ConversionCheckedTripleEquals with ScalaFutures {
  ...
}

LongRunningTest是一个ScalaTest标签。