我正在使用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
}
}
}
请注意,我需要清理部分始终执行,而不仅仅是当测试体部分成功时。
它按预期工作但我看到两个问题:
cleanUp.get
是无用的表达。如何以更正确的方式编写该部分?我可以将其重写为if(cleanUp.isFailure) throw cleanUp.failed.get
,然后IDE不会抱怨,但实际上这是编写相同语句的更长方法。答案 0 :(得分:1)
如果我理解您要正确执行的操作,那么答案为flatMap
和map
,如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
是一个无用的表达。