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

我无法通过 using 运行它,configuredEmbedder()而是通过-Dmetafilter="+working -finished"在我的 mvn 运行配置中添加目标并将标签@working用于我正在使用的场景以及我想要运行@finsihed的场景以及我不想执行的场景。如果我想更改元标记,我仍然必须更改运行配置,所以它不是很舒服,但我仍然得到了我想要的东西。

于 2015-07-22T08:30:12.707 回答
1

调查

我调试了serenity-jbehave类,试图理解为什么设置

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

并没有在所有可能的地方工作我把它放在我的类中扩展了SerenityStories,我发现战略代码位置被我们在类中定义的内容覆盖到设置metaFilters中。ExtendedEmbedder#embedderserenity-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可以在三个地方定义,并且它们相互覆盖。在优先级降低的顺序中,它们是:

  • metafilter(完全小写!)VM 属性的值。
  • 在我们的类上net.serenitybdd.jbehave.annotations.Metafilter注释的值。SerenityStories
  • 在我们的类上net.thucydides.jbehave.annotations.Metafilter注释的值。SerenityStories此注释已被弃用,但为了向后兼容而保留。

使用当前serenity-jbehave版本的解决方案

我已经尝试/调试了所有这三个选项,它们如上所述工作并相互覆盖。

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/本地开发执行的 VM 属性。

可能的拉取请求

https://github.com/serenity-bdd/serenity-core/issues/95——Serenity的人建议我对这个修复进行 PR,因为他们现在不专注于 Serenity + JBehave。

我知道在哪里进行更改(在上面描述的代码链中),但我不知道应该是什么覆盖逻辑:

— 来自configuredEmbedder覆盖任何 ENV/注释 MetaFilters 的 MetaFilters。

或者

— 任何 ENV/注释 MetaFilters 都会覆盖 MetafiltersconfiguredEmbedder

或者

— 来自configuredEmbedder的 MetaFilters 与 ENV/注释 MetaFilters 合并。此选项需要合并优先级。

有什么建议么?

在任何类型的修复中,我更愿意添加关于覆盖现在如何工作的显式日志SerenityReportingRunner#getMetafilterSetting,因为当前的行为确实不明显并且需要大量时间来调查。

于 2019-07-04T15:27:15.763 回答
1

只要你把它记录好(https://github.com/serenity-bdd/the-serenity-book中的一些文档会很棒),我认为作为 JBehave/Serenity 用户,你有足够的位置来决定哪个选项最有意义。

于 2019-07-04T15:38:24.897 回答