获得配置的嵌入器,用于使用selenium和jbehave

时间:2015-07-21 06:45:22

标签: java selenium bdd jbehave

在创建新场景时,我只想测试我目前正在使用的场景。为此,我想在我的场景之前使用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,但该方案仍在执行中。只有在结果页面中,我才能获得忽略此场景(但仍然执行)的信息。有没有办法跳过场景,所以它不会运行?

3 个答案:

答案 0 :(得分: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

SerenityReportingRunner#getMetaFilters

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的MetaFilter会覆盖任何ENV /注释MetaFilters。

OR

-任何ENV /注释元过滤器都会覆盖configuredEmbedder中的元过滤器

OR

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

有什么建议吗?

在任何类型的修复程序中,我都希望添加有关覆盖现在如何在SerenityReportingRunner#getMetafilterSetting中起作用的显式日志,因为当前的行为实际上并不明显,并且需要花费大量时间进行调查。

答案 1 :(得分:1)

只要您对它进行了很好的记录(https://github.com/serenity-bdd/the-serenity-book中的某些文档将是很棒的),我认为作为JBehave / Serenity用户,您将有足够的资格来决定哪个选项最有意义。

答案 2 :(得分:0)

我无法使用configuredEmbedder()运行,而是在我的mvn运行配置中添加-Dmetafilter="+working -finished"作为目标,并使用标签@working用于我正在使用的方案对于我不想执行的方案,我想要运行@finsihed。如果我想更改元标记,我仍然需要更改运行配置,因此它不是很舒服,但仍然可以得到我想要的内容。