【发布时间】: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
}
}
}
这里请注意,我需要始终执行清理部分,而不仅仅是在测试正文部分成功时。
它按我的预期工作,但我发现两个问题:
- IntelliJ Idea 告诉我
cleanUp.get是无用的表达。如何以更正确的方式编写该部分?我可以将其重写为if(cleanUp.isFailure) throw cleanUp.failed.get,然后IDE 不会抱怨,但实际上这是编写相同语句的更长方法。 - 此测试代码的最后一部分实际上比较了测试主体部分和清理部分的结果并决定返回什么看起来有点臃肿。或许您可以建议我如何使其更简洁明了?
【问题讨论】:
-
对于#2,这是否适合
BeforeAndAfter?将您的清理代码放在after方法中。这也可能会减轻您在 #1 上的负担,因为清理代码将不再出现在此方法中。不过,我不是最专业的专家,所以我可能会离开这里。 -
@IanMcLaird 我不能把它放在
after()中,因为after在每次测试后都在执行,而我需要清理的东西在每次测试中都不同。我已经使用BeforeAndAfter和BeforeAndAfterAll进行常见的设置/清理。这里的问题其实和ScalaTest有点关系。这是一种通用模式,当您必须执行两个代码块时,它们都可能失败。如果第一个失败,无论第二个的结果如何,你都想报告它的失败,但是如果第一个没问题,那么如果它失败了,你仍然需要报告秒块的失败。