1

新しいシナリオを作成している間、現在作業しているシナリオのみをテストしたいと考えています。Meta: @skipこの目的のために、シナリオの前にタグを使用したいと考えています。を使用して、使用されているメタ タグを構成する必要があることがわかったembedderので、次のことを試しました。

configuredEmbedder().useMetaFilters(Arrays.asList("-skip"));

しかし実際には、これはまだ私のテスト シナリオには影響しません。SerenityStoriesテスト スイート定義のコンストラクターで使用しました。このクラスの完全なコードは次のとおりです。

public class AcceptanceTestSuite extends SerenityStories {
    @Managed
    WebDriver driver;

    public AcceptanceTestSuite() {
    System.setProperty("webdriver.chrome.driver", "D:/files/chromedriver/chromedriver.exe");
    System.setProperty("chrome.switches", "--lang=en");
    System.setProperty("restart.browser.each.scenario", "true");
    configuredEmbedder().useMetaFilters(Arrays.asList("-skip"));

    runSerenity().withDriver("chrome"); 
    }

    @Override
    public Configuration configuration() {
    Configuration configuration = super.configuration();

    Keywords keywords = new LocalizedKeywords(DEFAULTSTORYLANGUAGE);
    Properties properties = configuration.storyReporterBuilder().viewResources();
    properties.setProperty("encoding", "UTF-8");

    configuration.useKeywords(keywords)
            .useStoryParser(new RegexStoryParser(keywords, new ExamplesTableFactory(new LoadFromClasspath(this.getClass()))))
            .useStoryLoader(new UTF8StoryLoader()).useStepCollector(new MarkUnmatchedStepsAsPending(keywords))
            .useDefaultStoryReporter(new ConsoleOutput(keywords)).storyReporterBuilder().withKeywords(keywords).withViewResources(properties);


    return configuration;
    }
}

これは間違った場所ですか、それとも何か見逃していますか? それでもすべてのシナリオが実行されます。

編集:

次のクラスを変更しましたが、「機能する」と思います

public AcceptanceTestSuite() {
    System.setProperty("webdriver.chrome.driver", "D:/files/chromedriver/chromedriver.exe");
    System.setProperty("chrome.switches", "--lang=de");
    System.setProperty("restart.browser.each.scenario", "true");
    this.useEmbedder(configuredEmbedder());

    runSerenity().withDriver("chrome"); 
}

@Override
public Embedder configuredEmbedder() {
    final Embedder embedder = new Embedder();
    embedder.embedderControls()
        .useThreads(1)
        .doGenerateViewAfterStories(true)
        .doIgnoreFailureInStories(false)
        .doIgnoreFailureInView(false)
        .doVerboseFailures(true);

    final Configuration configuration = configuration();

    embedder.useConfiguration(configuration);
    embedder.useStepsFactory(stepsFactory());
    embedder.useMetaFilters(Arrays.asList("-skip"));

    return embedder;
}

しかし、メッセージは表示 されます[pool-1-thread-1] INFO net.serenitybdd.core.Serenity - TEST IGNOREDが、シナリオはまだ実行されています。結果ページでのみ、このシナリオが無視される (ただし実行される) という情報が表示されます。シナリオが実行されないようにスキップする方法はありますか?

4

3 に答える 3

1

使用して実行することはできませんでしたが、mvn 実行構成に目標としてconfiguredEmbedder()追加し、作業中のシナリオと実行したいシナリオ、および実行したくないシナリオのタグを使用しました。それでも、メタタグを変更したい場合は実行構成を変更する必要があるため、あまり快適ではありませんが、探していたものを取得できます.-Dmetafilter="+working -finished"@working@finsihed

于 2015-07-22T08:30:12.707 に答える
1

調査

serenity-jbehaveなぜ設定するのかを理解しようとして、クラスをデバッグしました

configuredEmbedder().useMetaFilters(Collections.singletonList("-skip"))

を拡張してクラス内に配置したすべての可能な場所で機能していませんSerenityStories。戦略的なコードの場所が見つかりました。ここmetaFiltersExtendedEmbedder#embedder、クラスで定義したもので上書きされ、から設定されますserenity-jbehave

このメソッドはSerenityReportingRunner#createPerformableTree次のとおりです。

private PerformableTree createPerformableTree(List<CandidateSteps> candidateSteps, List<String> storyPaths) {
    ExtendedEmbedder configuredEmbedder = this.getConfiguredEmbedder();
    configuredEmbedder.useMetaFilters(getMetaFilters());
    BatchFailures failures = new BatchFailures(configuredEmbedder.embedderControls().verboseFailures());
    PerformableTree performableTree = configuredEmbedder.performableTree();
    RunContext context = performableTree.newRunContext(getConfiguration(), candidateSteps,
            configuredEmbedder.embedderMonitor(), configuredEmbedder.metaFilter(), failures);
    performableTree.addStories(context, configuredEmbedder.storyManager().storiesOfPaths(storyPaths));
    return performableTree;
}

この行はセットを変更しますmetaFilters:

    configuredEmbedder.useMetaFilters(getMetaFilters());

現在のmetaFilters値を上書きします。

呼び出しチェーンをさらに進めると、どこから取得するかmetaFilters、つまり実際に設定できる場所を定義するロジックに到達します。

SerenityReportingRunner#createPerformableTree

↓</p>

SerenityReportingRunner#getMetaFilters

↓</p>

SerenityReportingRunner#getMetafilterSetting

これが私たちが必要とする方法です!

private String getMetafilterSetting() {
    Optional<String> environmentMetafilters = getEnvironmentMetafilters();
    Optional<String> annotatedMetafilters = getAnnotatedMetafilters(testClass);
    Optional<String> thucAnnotatedMetafilters = getThucAnnotatedMetafilters(testClass);
    return environmentMetafilters.orElse(annotatedMetafilters.orElse(thucAnnotatedMetafilters.orElse("")));
}

ここでわかるmetaFiltersように、 は 3 つの場所で定義でき、それらは互いにオーバーライドします。優先順位を下げると、次のようになります。

  • metafilter(正確にすべて小文字です!) VM プロパティの値。
  • クラスの onnet.serenitybdd.jbehave.annotations.Metafilterアノテーションの値。SerenityStories
  • クラスの onnet.thucydides.jbehave.annotations.Metafilterアノテーションの値。SerenityStoriesこの注釈は非推奨ですが、下位互換性のために残されています。

serenity-jbehave現在のバージョンで動作しているソリューション

これら 3 つのオプションをすべて試したりデバッグしたりしましたが、上記のように機能し、互いにオーバーライドします。

1.環境metafilterプロパティを使用する

これを私のJVM実行引数に追加しました:

-Dmetafilter=skip

2. 最新の@Metafilter注釈を使用する

import net.serenitybdd.jbehave.SerenityStories;
import net.serenitybdd.jbehave.annotations.Metafilter;

@Metafilter("-skip")
public class Acceptance extends SerenityStories {

3. 非推奨の@Metafilterアノテーションを使用する

import net.serenitybdd.jbehave.SerenityStories;
import net.thucydides.jbehave.annotations.Metafilter;

@Metafilter("-skip") // warned as deprecated
public class Acceptance extends SerenityStories {

私の現在のプロジェクトの解決策は@Metafilter("-skip")、テストクラスで現在の注釈を使用して、特定の Jenkins/local dev 実行の VM プロパティに依存しない/変更する必要がないことです。

可能なプルリクエスト

https://github.com/serenity-bdd/serenity-core/issues/95 — ここで Serenity の人たちは、現在 Serenity + JBehave に集中していないため、この修正で PR を行うように提案してくれました。

どこで変更を行うべきか (上記のコード チェーン内) は理解していますが、どのようなオーバーライド ロジックが必要なのかわかりません。

configuredEmbedderENV/注釈 MetaFilters のオーバーライドからの MetaFilters。

また

— すべての ENV/注釈 MetaFilters は、からの Metafilters をオーバーライドしますconfiguredEmbedder

また

— MetaFiltersconfiguredEmbedderは ENV/annotation MetaFilters とマージされます。このオプションにはマージの優先度が必要でした。

助言がありますか?

どのタイプの修正でも、オーバーライドがどのように動作しているかについての明示的なログを に追加することをお勧めしますSerenityReportingRunner#getMetafilterSetting。現在の動作は実際には自明ではなく、調査に多くの時間を要したためです。

于 2019-07-04T15:27:15.763 に答える