用于检索测试状态的Geb Reporter / Extension

时间:2013-03-12 21:04:01

标签: groovy junit webdriver spock geb

我正在尝试使用geb替换一些自定义java selenium扩展。当我尝试在云中使用网格时(SauceLabs),我碰到了一些砖墙。当我的测试完成后,发送更新以指示测试是否失败或成功是很好的。为了利用它,我需要RemoteWebDriver实例中的sessionId。这可以在自定义Reporter中获得,但我无法确定此界面是否成功。由于我正在扩展GebReportingSpec,我尝试创建自己的自定义版本,该版本具有自定义Junit规则来跟踪成功或失败:

public class TestSuccess extends TestWatcher {
  boolean success;
  String message;

  @Override
  protected void starting(Description d) {
    message = d.getMethodName();
  }

  @Override
  protected void succeeded(final Description description) {
    System.out.println("Test Success [succeeded] " + description);
    this.success = true;
  }

  @Override
  protected void failed(final Throwable e, final Description description) {
    System.out.println("Test Success [failed] " + description);
    this.success = false;
  }

  public boolean isSuccess() {
    return success;
  }

  @Override
  public String toString() {
    return message + " success: <" + success + ">.";
  }
}

然后我将它添加到我的CustomReportingSpec:

class CustomReportingSpec extends GebReportingSpec {
  /* I also tried creating this as a RuleChain with:
   * @Rule TestRule chain = RuleChain.outerRule(
             super._gebReportingSpecTestName).around(new TestSuccess());
   * however, this results in a NPE.  Placing the super rule in the around 
   * still results in a NPE.
   */
  @Rule public TestSuccess _gebTestSuccesswatcher = new TestSuccess();

  // I never see this called
  void report() {
    System.out.println("Custom Reporting Spec: " + _gebTestSuccesswatcher + "\t")
    super.report()
  }
}

我还尝试在自定义记者中进行设置:

public CustomReporter extends ScreenshotAndPageSourceReporter implements Reporter {
  @Rule
  public TestSuccess _gebTestSuccesswatcher = new TestSuccess();

  @Override
  public void writeReport(Browser browser, String label, File outputDir) {
    System.out.println("Custom Reporter: " + _gebTestSuccesswatcher);
    super.writeReport(browser, label, outputDir)
  }
}

然而,无论我的测试是否失败,似乎都会调用观察者的成功方法。这是我的样本测试:

class OneOff extends CustomReportingSpec {
  def "Check One off"() {
    when:
      go "http://www.google.com"
    then:
      1 == 2
  }
}

输出:

Custom Reporter: null success: <false>.
Test Success [succeeded] Check One off(OneOff)

正如您所看到的,在完成此失败测试时会调用success方法。如果我修改测试以通过(即1 == 1),这是我的输出:

Custom Reporter: null success: <false>.
Test Success [succeeded] Check One off(OneOff)

有没有办法让我的规则在Custom Reporter中正常运行?或者有没有办法在扩展中获取浏览器实例?我跟着this guide创建了一个自定义注释和监听器,但我无法访问Browser对象。我曾尝试在浏览器的声明中添加@Shared,但它没有在Geb配置中提取它。

1 个答案:

答案 0 :(得分:2)

由于Spock TestSuccess支持的已知限制,您的TestRule课程无效。由于Spock和JUnit的测试执行模型之间的细微差别,从base.evaluate()调用TestRule不会在Spock中引发异常,即使测试失败也是如此。在许多情况下,这不会产生任何影响,但对于TestWatcher它会有所不同。

这是Spock规则支持中唯一已知的限制,希望我们能找到一种方法来克服它。使用MethodRule时没有这种语义不匹配。

如果你想在JUnit规则的帮助下实现你的需求(我认为没问题),MethodRule可能是更好的选择。与TestRule相反,MethodRule提供对测试实例的访问权限,这样您就可以使用browser.driver.sessionId获取会话ID。