代码之家  ›  专栏  ›  技术社区  ›  spcial

如何在Serenity、JBehave和Selenium中设置一个配置好的嵌入器以使用元过滤器(-sip)

  •  1
  • spcial  · 技术社区  · 9 年前

    在创建新场景时,我只想测试当前正在使用的场景。为此,我想使用 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 回复  |  直到 5 年前
        1
  •  1
  •   spcial    9 年前

    我无法使用 configuredEmbedder() 但通过添加 -Dmetafilter="+working -finished" 作为mvn运行配置中的目标,并使用标记 @working 对于我正在处理的和我想运行的场景 @finsihed 对于我不想执行的场景。如果我想更改元标记,我仍然必须更改运行配置,这样做不是很舒服,但我仍然得到了我想要的。

        2
  •  1
  •   John Smart    5 年前

    只要你做好记录( https://github.com/serenity-bdd/the-serenity-book 我认为作为一个JBehave/Seriity用户,你有足够的条件来决定哪一个选项最有意义。

        3
  •  1
  •   Dmitriy Popov takra    5 年前

    调查

    我调试了 serenity-jbehave 类,试图了解设置的原因

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

    不是在所有可能的地方工作,我把它放在我的课堂上 SerenityStories ,我找到了战略代码的地方 metaFilters 在里面 ExtendedEmbedder#embedder 被我们在类中定义的内容覆盖到 宁静的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;
    }
    

    这一行改变了集合 图元过滤器 :

        configuredEmbedder.useMetaFilters(getMetaFilters());
    

    它覆盖当前 图元过滤器 价值

    进一步深入调用链,我们将了解定义它从何处开始的逻辑 图元过滤器 ,即我们可以实际设置它的位置。

    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("")));
    }
    

    正如我们在这里看到的 图元过滤器 可以在三个位置定义,并且它们彼此覆盖。按照优先级降低顺序,它们是:

    • 的值 metafilter (完全小写!)VM属性。
    • 上的值 net.serenitybdd.jbehave.annotations.Metafilter 我们的注释 宁静故事
    • 上的值 net.thucydides.jbehave.annotations.Metafilter 我们的注释 宁静故事 班此批注已弃用,但为了向后兼容,保留在原地。

    使用电流的解决方案 宁静的jbehave 版本

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

    1.使用环境 过滤器 所有物

    将此添加到我的JVM运行参数中:

    -Dmetafilter=skip
    

    2.使用现代 @Metafilter 注释

    import net.serenitybdd.jbehave.SerenityStories;
    import net.serenitybdd.jbehave.annotations.Metafilter;
    
    @Metafilter("-skip")
    public class Acceptance extends SerenityStories {
    

    3.使用已弃用的 @金属过滤器 注释

    import net.serenitybdd.jbehave.SerenityStories;
    import net.thucydides.jbehave.annotations.Metafilter;
    
    @Metafilter("-skip") // warned as deprecated
    public class Acceptance extends SerenityStories {
    

    我当前项目的解决方案是使用当前 @Metafilter("-skip") 我的测试类上的注释,不依赖于/必须更改特定Jenkins/localdev执行的VM属性。

    可能的拉取请求

    https://github.com/serenity-bdd/serenity-core/issues/95 在这里,Serenity的人建议我用这个补丁做公关,因为他们现在不专注于Serenity+JBehave。

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

    来自的MetaFilter configuredEmbedder 覆盖任何ENV/annotation MetaFilters。

    任何ENV/annotation MetaFilters覆盖来自 已配置的嵌入器

    来自的MetaFilter 已配置的嵌入器 与ENV/annotation MetaFilters合并。此选项需要合并优先级。

    有什么建议吗?

    在任何类型的修复中,我都希望添加有关重写现在如何工作的显式日志 SerenityReportingRunner#getMetafilter设置 ,因为目前的行为确实不明显,需要花费大量时间进行调查。