【发布时间】:2021-09-03 07:05:36
【问题描述】:
对于每个失败的测试用例,我们都有一个通用的屏幕截图捕获功能,使用 AbstractRunListner 实现,如下所示:
public class FailureListener extends AbstarctRunLister {
....
@Overrides
public void error(ErrorInfo errorInfo){
...
//Logic to capture screenshots
}
}
当测试用例没有清理块或清理方法时,这非常有效。
但是我们使用了清理块,它会在失败的情况下刷新或关闭任何屏幕,以使测试中的应用程序为下一次测试执行做好准备。因此,清理块屏幕截图未捕获测试用例失败的正确屏幕,而是在执行清理后捕获屏幕,这将关闭发生故障的屏幕。
def 'do some operation on screen'(){
given:
//Go to that screen
when:
//perform some operation
then:
//assert the action
cleanup:
//close any unwanted screen to make the application ready for the next test execution
}
那么我们可以做些什么来解决这个问题?因为我尝试了 AbstractRunListener 的多种方法,但它们都没有帮助,因为这些方法要么在测试用例之前执行,要么在清理之后执行,但这里我们需要一种方法或方式,它可以在清理之前但在块执行之后执行逻辑。
【问题讨论】:
-
为什么在
cleanup块中关闭屏幕以准备下一次测试?这不是setup的工作吗?不知道为什么你需要关闭屏幕... ???? -
您能否解释一下为什么 (a) 您在失败时手动截屏而不是扩展
GebReportingSpec,它会自动执行以及为什么 (b) 您将cleanup:块分散到所有功能方法中除了GebReportingSpec已经为您做的事情之外,只需在基类中定义一个cleanup()方法来做任何事情? -
感谢您的重播。我知道 cleanup() 方法,但我们有测试特定配置,一旦测试执行完成,我们想要重置,所以我添加了一个清理块。
-
GebReportingSpec 也在清理块/方法执行之后执行,我们想在清理块/方法执行之前截取实际失败屏幕的屏幕截图。
-
无法挂钩在
cleanup块之前执行的某些内容,因此您必须在cleanup块中手动截取屏幕截图。