specs2- 对测试失败采取行动

specs2- Take action on test failure

如果我的测试失败,有没有办法采取某种行动? 我有一个使用 selenium/fluentlinium 来填充 texts/click 按钮并断言结果的测试。我希望能够在测试条件失败时采取行动。类似下面的内容

class TestSpecial extends Specification{
  "Website should" {
    "do the right thing" in new WithBrowser( webDriver = WebDriverFactory( FIREFOX ) ){
      browser.$( ".xyz1" ).text( "a" )
      browser.$( ".xyz2" ).click() 
      browser.$( ".xyz3" ).getText must equalTo( "foo" )

      browser.$( ".xyz1" ).text( "b" )
      browser.$( ".xyz2" ).click() 
      browser.$( ".xyz3" ).getText must equalTo( "bar" )
    }
    onFailure
    {
      //context remains same, so I can use browser
      MySnapshotFunction.takeSnapshot( browser )
    }
  }
}

有没有办法让测试在失败时抛出,以便我可以在 catch 块中拍摄快照?

我认为一种方法是使用中给出的建议:

How to do setup/teardown in specs2 when using "in new WithApplication"

创建我自己的 'WithBrowser' 自定义实现,在开始之前将每个测试标记为失败,并要求该实现的用户在测试块结束时将测试标记为通过。拆解代码中的自定义实现拍摄快照。我已经着眼于使用这种方法,但欢迎对此提出任何 better/simpler 解决方案。

您应该能够使用 Around 特性:

import org.specs2.mutable._
import org.specs2.execute._

trait TakeSnapshot extends org.specs2.mutable.Around {
  def browser: Browser

  abstract override def around[R : AsResult](r: =>R) = super.around {
    val result = AsResult(r)
    if (!result.isSuccess) {
      takeSnapshot(browser)
    }
    result
  }

  def takeSnapshot(browser: Browser) =
    println("take snapshot")
  }
}

// then 
"do the right thing" in 
   new WithBrowser(webDriver=WebDriverFactory(FIREFOX)) with TakeSnapshot {
  browser.$( ".xyz1" ).text( "a" )
  browser.$( ".xyz2" ).click() 
  browser.$( ".xyz3" ).getText must equalTo( "foo" )

  browser.$( ".xyz1" ).text( "b" )
  browser.$( ".xyz2" ).click() 
  browser.$( ".xyz3" ).getText must equalTo( "bar" )  
}

当我在一个失败的例子上执行它时,我得到了类似

的跟踪
execute t      // comes from a println in WithBrowser
take snapshot
quit browser   // comes from a println in Browser