需要有关如何优化Scala测试的建议

时间:2017-04-28 13:08:09

标签: scala scalatest

我正在使用ScalaTest进行自动化。 典型的测试逻辑结构是测试正在对应用程序逻辑进行一些检查,然后进行清理。因此,我们将其称为测试主体部分和测试清理部分。如果测试体失效,我希望在测试报告中看到它。如果测试体没有失败但是清理部分失败了,我还想在测试报告中看到测试结果是错误的。 所以我提出了以下结构(例子是我能提供的最简单的结果):

"Admin" should "be able to create a new team" in{
    val tempTeam = Team("Temp QA Team")
    val attempt=Try{
      When("Admin opens the Teams view")
      TeamsPage.open
      And("creates a new team")
      TeamsPage.createNewTeam(tempTeam)
      Then("this team is shown in the list")
      TeamsPage.isParticularTeamShownInTeamList(tempTeam.name) shouldBe true
    }
    val cleanUp = Try(TeamsPage.cleanUpTeam(tempTeam))
    attempt match{
      case Failure(e) => throw e
      case Success(r) =>{
        if(cleanUp.isFailure) cleanUp.get
        r
      }
    }
  }

请注意,我需要清理部分始终执行,而不仅仅是当测试体部分成功时。

它按预期工作但我看到两个问题:

  1. IntelliJ Idea告诉我cleanUp.get是无用的表达。如何以更正确的方式编写该部分?我可以将其重写为if(cleanUp.isFailure) throw cleanUp.failed.get,然后IDE不会抱怨,但实际上这是编写相同语句的更长方法。
  2. 此测试代码的最后一部分实际上比较了测试体部分和清理部分的结果,并决定返回的内容看起来有点臃肿。可能你可以建议我如何使它更简洁明了?

1 个答案:

答案 0 :(得分:1)

如果我理解您要正确执行的操作,那么答案为flatMapmap,如scala.util.Try

的文档中所述

在您的情况下(按原样执行代码),您需要

"Admin" should "be able to create a new team" in{
  val tempTeam = Team("Temp QA Team")
  val attempt=Try{
    When("Admin opens the Teams view")
    TeamsPage.open
    And("creates a new team")
    TeamsPage.createNewTeam(tempTeam)
    Then("this team is shown in the list")
    TeamsPage.isParticularTeamShownInTeamList(tempTeam.name) shouldBe true
  }
  val cleanUp = Try(TeamsPage.cleanUpTeam(tempTeam))
  attempt.flatMap(r => cleanup.map(c => r)).get
}

这将返回attempt的结果,除非它失败,在这种情况下它会抛出attempt的异常。它将忽略cleanup的成功结果(正如您的代码所做的那样),但如果cleanup抛出异常,您将抛出 异常。

N.B。我实际上并没有在IDE中尝试这个,所以我不能说这是否会解决你关于IntelliJ的问题#1,说get是一个无用的表达。