【问题标题】:Need advice on how to optimize my Scala tests需要关于如何优化我的 Scala 测试的建议
【发布时间】:2017-04-28 13:08:08
【问题描述】:

我正在使用 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. 此测试代码的最后一部分实际上比较了测试主体部分和清理部分的结果并决定返回什么看起来有点臃肿。或许您可以建议我如何使其更简洁明了?

【问题讨论】:

  • 对于#2,这是否适合BeforeAndAfter?将您的清理代码放在after 方法中。这也可能会减轻您在 #1 上的负担,因为清理代码将不再出现在此方法中。不过,我不是最专业的专家,所以我可能会离开这里。
  • @IanMcLaird 我不能把它放在after() 中,因为after 在每次测试后都在执行,而我需要清理的东西在每次测试中都不同。我已经使用BeforeAndAfterBeforeAndAfterAll 进行常见的设置/清理。这里的问题其实和ScalaTest有点关系。这是一种通用模式,当您必须执行两个代码块时,它们都可能失败。如果第一个失败,无论第二个的结果如何,你都想报告它的失败,但是如果第一个没问题,那么如果它失败了,你仍然需要报告秒块的失败。

标签: scala scalatest


【解决方案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 抛出异常,您将抛出 that 异常。

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

【讨论】:

  • 非常感谢,伊恩。我知道mapflatMap,但在这种情况下,我的大脑显然还没有充分地结合它们。您的代码行正是我们所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2013-01-02
  • 1970-01-01
  • 2019-11-30
相关资源
最近更新 更多