spec2- принять меры в случае сбоя теста

Есть ли способ предпринять определенные действия, если мой тест не пройден? У меня есть тест, который использует селен/флюэнтиум для заполнения текстов/нажатий кнопок и утверждения результатов. Я хотел бы иметь возможность предпринимать действия всякий раз, когда условие теста не выполняется. Что-то вроде следующего

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?

Я думаю, что один из способов - использовать предложение, данное в:

Как выполнить настройку/разборку в spec2 при использовании в новом WithApplication

Создайте мою собственную пользовательскую реализацию «WithBrowser», которая помечает каждый тест как неудачный перед запуском и требует, чтобы пользователь этой реализации помечал тест как пройденный в конце тестового блока. Пользовательская реализация в коде разрыва делает снимок. Я решил использовать этот подход, но приветствовал бы любые лучшие/более простые решения для этого.


person 0fnt    schedule 28.05.2015    source источник


Ответы (1)


Вы должны иметь возможность использовать трейт 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
person Eric    schedule 29.05.2015