需要关于如何优化我的 Scala 测试的建议
Need advice on how to optimize my Scala tests
我正在使用 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
}
}
}
这里请注意,我需要清理部分始终执行,而不仅仅是在测试主体部分成功时才执行。
它按我的预期工作,但我看到两个问题:
- IntelliJ Idea 告诉我
cleanUp.get
是无用的表达式。如何以更正确的方式编写该部分?我可以将其重写为 if(cleanUp.isFailure) throw cleanUp.failed.get
,然后 IDE 不会抱怨,但实际上这是编写相同语句的更长方法。
- 该测试代码的最后一部分实际上比较了测试主体部分和清理部分的结果并决定要 return 的内容看起来有点臃肿。也许你可以建议我如何使它更简洁明了?
如果我理解您要正确执行的操作,答案是 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
}
这将是 return attempt
的结果,除非失败,在这种情况下它会抛出 attempt
的异常。它会忽略 cleanup
的成功结果(正如您的代码所做的那样),但是如果 cleanup
抛出异常,您将抛出 that 异常。
N.B。我实际上并没有在 IDE 中尝试这个,所以我不能说这是否会解决你关于 IntelliJ 的问题 #1,说 get
是一个无用的表达式。
我正在使用 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
}
}
}
这里请注意,我需要清理部分始终执行,而不仅仅是在测试主体部分成功时才执行。
它按我的预期工作,但我看到两个问题:
- IntelliJ Idea 告诉我
cleanUp.get
是无用的表达式。如何以更正确的方式编写该部分?我可以将其重写为if(cleanUp.isFailure) throw cleanUp.failed.get
,然后 IDE 不会抱怨,但实际上这是编写相同语句的更长方法。 - 该测试代码的最后一部分实际上比较了测试主体部分和清理部分的结果并决定要 return 的内容看起来有点臃肿。也许你可以建议我如何使它更简洁明了?
如果我理解您要正确执行的操作,答案是 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
}
这将是 return attempt
的结果,除非失败,在这种情况下它会抛出 attempt
的异常。它会忽略 cleanup
的成功结果(正如您的代码所做的那样),但是如果 cleanup
抛出异常,您将抛出 that 异常。
N.B。我实际上并没有在 IDE 中尝试这个,所以我不能说这是否会解决你关于 IntelliJ 的问题 #1,说 get
是一个无用的表达式。