Как настроить встроенный модуль для использования метафильтров (-skip) с Serenity, JBehave и Selenium

При создании новых сценариев я хочу протестировать только тот сценарий, с которым сейчас работаю. Для этого я хочу использовать тег 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, но сценарий все еще выполняется. Только на странице результатов я получаю информацию о том, что этот сценарий игнорируется (но все же выполняется). Есть ли способ ПРОПУСТИТЬ сценарий, чтобы он не запускался?


person spcial    schedule 21.07.2015    source источник
comment
Где вы пишете Meta: @skip в вашем файле .story? После строки Scenario: ...?   -  person Kristof    schedule 22.07.2015
comment
Да: Scenario: Here is my scenario description Meta: @skip Given something When something Then something   -  person spcial    schedule 22.07.2015
comment
У меня такая же проблема, и я действительно думаю, что так написано SerenityStories — он будет искать все истории в папке, не глядя на metaFilters эмбеддера.   -  person Dmitriy Popov    schedule 24.06.2019


Ответы (3)


Я не мог заставить его работать с использованием configuredEmbedder(), но добавив -Dmetafilter="+working -finished" в качестве целей в мои конфигурации запуска mvn и используя теги @working для сценариев, с которыми я работаю и которые я хочу запустить, и @finsihed для сценариев, которые я не хочу выполнять. Тем не менее, мне нужно изменить конфигурацию запуска, если я хочу изменить метатеги, так что это не очень удобно, но все же я получаю то, что искал.

person spcial    schedule 22.07.2015

Если вы хорошо задокументируете это (некоторые документы в https://github.com/serenity-bdd/the-serenity-book было бы блестяще), я думаю, как пользователь JBehave/Serenity, вы достаточно хорошо подготовлены, чтобы решить, какой вариант имеет наибольший смысл.

person John Smart    schedule 04.07.2019

Расследование

Я отлаживал классы serenity-jbehave, пытаясь понять, почему настройка

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

не работает во всех возможных местах. Я поместил его в свой класс, расширив SerenityStories, я нашел место стратегического кода, где metaFilters в ExtendedEmbedder#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/local dev.

Возможный запрос на включение

https://github.com/serenity-bdd/serenity-core/issues/95 — тут ребята из Serenity предложили мне сделать пиар с этим фиксом, так как они сейчас не сосредоточены на Serenity + JBehave.

Я понимаю, где вносить изменения (в цепочку кода, описанную выше), но я не знаю, какая должна быть переопределяющая логика:

— Метафильтры из configuredEmbedder переопределяют любые метафильтры ENV/аннотаций.

OR

— Любые метафильтры ENV/аннотаций переопределяют метафильтры из configuredEmbedder

OR

— Метафильтры из configuredEmbedder объединены с метафильтрами ENV/аннотаций. Эта опция требовала приоритета слияния.

Какие-либо предложения?

В любом типе исправления я бы предпочел добавить явные журналы о том, как теперь работает переопределение, в SerenityReportingRunner#getMetafilterSetting, поскольку текущее поведение действительно неочевидно и требует много времени для изучения.

person Dmitriy Popov    schedule 04.07.2019