每个案例作为 ScalaTest 中的单独测试 - JUnit ParameterizedTest 风格

问题描述

这是 JUnit 中的参数化测试:

@ParameterizedTest
    @ValueSource(strings = {"Username","User123","Another username","Another_username" })
    @displayName("should evaluate acceptable usernames as correct")
    public void shouldEvaluateAcceptableusernamesAsCorrect(String username) {
        assertthat(UsernameValidator.validate(username)).isTrue();
    }

之后,在 IntelliJ 的测试结果部分,可以看到哪些参数测试失败 - 这非常方便。

parametrized test result in JUnit

在 ScalaTest 中也可以编写参数化测试:

class UsernameValidatorTests extends AnyFunSuite with Matchers {
  val correctUsernames = Table("Username","Another_username")

  test("should evaluate acceptable usernames as correct") {
    forAll (correctUsernames) { (name: String) =>
      UsernameValidator.validate(name) shouldBe true
    }
  }
}

在这解决方案中,它只是针对所有情况的一个单一测试。

parametrized test result in ScalaTest

能否在ScalaTest中实现JUnit的效果

解决方法

尝试翻转 testforall 顺序:

forAll (correctUsernames) { (name: String) =>
  test(s"should evaluate acceptable usernames as correct $name") {
    UsernameValidator.validate(name) shouldBe true
  }
}

然后您将运行 3 个测试。

您编写的测试声明了一项测试,该测试执行其中的所有检查。当您翻转订单时,为每个条目创建一个新测试。