Jbehave получить имя истории внутри @BeforeStory

Я хотел бы получить имя истории в методе с аннотацией @BeforeStory.

Мне это нужно для целей отладки, потому что я запускаю кучу историй с runStoriesAsPaths и с несколькими потоками, и я пытаюсь зарегистрировать, какой поток запускает какую историю.

Есть ли способ сделать это?


person rafaferry    schedule 22.05.2013    source источник


Ответы (2)


сначала вам нужно создать новый StoryReporter (расширить этот класс). В этом классе вы можете добавить действия, которые будут выполняться до/после истории/сценария/этапа, и у вас будет название истории. пример:

public class NewStoryReporter implements StoryReporter {

private StoryReporter delegate;

public NewStoryReporter(StoryReporter delegate) {
    this.delegate = delegate;
}

@Override
public void beforeStory(Story story, boolean givenStory) {
    delegate.beforeStory(story, givenStory);
}

@Override
public void beforeScenario(String scenarioTitle) {
    delegate.beforeScenario(scenarioTitle);
}

@Override
public void beforeStep(String step) {
    if(step.equals("When after each step")){
        return;
    }
    delegate.beforeStep(step);
}

затем вам нужно расширить StoryReporterBuilder, это создаст ваш NewStoryReporter. пример:

public class NewStoryReporterBuilder extends StoryReporterBuilder {

@Override
public StoryReporter build(String storyPath) {
    StoryReporter delegate = super.build(storyPath);
    return new NewStoryReporter(delegate);
}

}

затем в своей конфигурации создайте экземпляр NewStoryReporterBuilder и используйте его в

Configuration configuration = new YourConfiguration().useStoryReporterBuilder(newStoryReporterBuilder....)
person Tidhar Klein Orbach    schedule 15.10.2013
comment
Возможно, это потому, что я запускаю свои тесты с потоками. В итоге мне пришлось обернуть ConcurrentStoryReporter и создать собственный метод сборки в NewStoryReportBuilder вместо вызова super.build(). - person bbarke; 16.06.2017

Теперь в Jbehave это настроено по-другому.

Итак, для достижения этой цели вам необходимо:

  1. Создайте новый класс, который расширяет org.jbehave.core.reporters.ConsoleOutput. Здесь вы можете изменить различные методы. В вашем случае вам нужно переопределить метод:

    public void beforeScenario(String title)
    

    Посмотрите пример, прикрепленный в конце этого поста, чтобы увидеть, как это можно сделать.

  2. Создайте новый экземпляр абстрактного класса org.jbehave.core.reporters.Filter:

    public static final Format YOUR_CUSTOM_CONSOLE = new Format("YOUR_CUSTOM_CONSOLE")
    {
        @Override
        public StoryReporter createStoryReporter(FilePrintStreamFactory factory,
                StoryReporterBuilder storyReporterBuilder) {
            return new TeamCityConsoleOutput(storyReporterBuilder.keywords()).doReportFailureTrace(
                    storyReporterBuilder.reportFailureTrace()).doCompressFailureTrace(
                    storyReporterBuilder.compressFailureTrace());
        }
    };
    
  3. Затем вам нужно добавить этот формат в свой конструктор историй, который вы используете в своей конфигурации, что означает:

    new MostUsefulConfiguration()
                .useStoryReporterBuilder(
                        new StoryReporterBuilder()
                                ....//here are another modifications of sorey report builder
                                .withFormats(YOUR_CUSTOM_CONSOLE , .../* another formats */ HTML, Format.XML, Format.TXT))
                ....//here are another modifications of configuration
                .useStepMonitor(new CrossReference().getStepMonitor());
    

Вот пример такой модификации, которую можно использовать для интеграции с TeamCity: /jbehave/core/reporters/TeamCityConsoleOutput.java" rel="nofollow noreferrer">https://github.com/jbehave/jbehave-core/blob/d15774bf763875662869cdc89ce924b1086af6f8/jbehave-core/src/main/java/org/jbehave/ ядро/репортеры/TeamCityConsoleOutput.java

person wojtek_pi    schedule 22.11.2017