2

gebを利用して、いくつかのカスタムJavaSelenium拡張機能を置き換えようとしています。クラウド(つまり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)

ご覧のとおり、この失敗したテストが完了すると、成功メソッドが呼び出されます。テストに合格するように変更した場合(つまり、1 == 1)、出力は次のようになります。

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

このルールをカスタムレポーターで正しく機能させる方法はありますか?または、拡張機能でブラウザインスタンスを取得する方法はありますか?このガイドに従ってカスタムアノテーションとリスナーを作成しましたが、ブラウザオブジェクトにアクセスできません。ブラウザーの宣言に@Sharedを追加しようとしましたが、Geb構成の宣言をプルしていません。

4

1 に答える 1

2

SpockのサポートTestSuccessに既知の制限があるため、クラスが正しく機能しません。TestRuleSpockとJUnitのテスト実行モデルには微妙な違いがあるため、テストが失敗した場合でも、base.evaluate()から呼び出しTestRuleてもSpockで例外がスローされることはありません。多くの場合、これは違いはありませんが、違いはTestWatcherあります。

これは、Spockのルールサポートにおける唯一の既知の制限であり、うまくいけば、ある時点でそれを克服する方法が見つかるでしょう。を使用する場合、そのようなセマンティックの不一致はありませんMethodRule

JUnitルール(これは問題ないと思います)を使用して要件を実装する場合は、MethodRuleとにかくおそらくより良い選択です。とは対照的にTestRuleMethodRuleはテストインスタンスへのアクセスを提供します。これにより、でセッションIDを取得できますbrowser.driver.sessionId

于 2013-03-13T14:00:18.933 に答える