【问题标题】:How beforeScenario and afterScenario works in JBehavebeforeScenario 和 afterScenario 如何在 JBehave 中工作
【发布时间】:2018-06-05 13:00:34
【问题描述】:

有人可以举例说明 beforeScenario 和 afterScenario 在 JBehave 中的工作原理吗?

我创建了一个类,其中包含两个方法 gearUp 和 @BeforeScenario 和 tearDown 和 @AfterScenario 注释。

但这些方法在 JBehave 中从未被调用。

需要什么额外的配置。任何代码示例都会对我们有所帮助。

而 Cucumber 中的这种简单整洁。

以下是我的单步故事文件(src/test/resources/storeis):

Scenario:  SampleTest

Given I am test

以下是我的步骤文件

public class jbehavetc {

    @Given("I am test")
    public void startOnUrl(String url) {
       System.out.println("I am actual test");
    }
}

以下是我的 Hooks 文件,其中包含 BeforeScenario 和 AfterScenario 方法

public class Hooks {

    @BeforeScenario
    public void startSystem() throws Exception {
       System.out.println("I am before scenario");
    }

    @AfterScenario
    public void stopSystem() throws Exception {
       System.out.println("I am after scenario");
    }

}

为了运行上面的故事,我创建了一个运行器文件并希望作为 JUnit 测试运行(纠正我这不是正确的方法

public class JBehaveRunner extends JUnitStory{


    @Override
    public Configuration configuration() {
        return new MostUsefulConfiguration()
            .useStoryLoader(
                new LoadFromClasspath(getClass().getClassLoader()))
            .useStoryReporterBuilder(   
                new StoryReporterBuilder()
                    .withDefaultFormats()
                    .withFormats(Format.HTML));
    }

    @Override
    public InjectableStepsFactory stepsFactory() {
        return new InstanceStepsFactory(configuration(), new jbehavetc(), 
            new Hooks());
    }

    public List<String> storyPaths() {
        return new StoryFinder().findPaths(
            CodeLocations.codeLocationFromClass(this.getClass()),
            Arrays.asList("**/*.story"),
            Arrays.asList(""));
    }

    @Test
    public void run() throws Throwable {
        super.run();
    }
}

当我作为 JUnit 测试在 runner 上运行时,什么都没有执行。我怎样才能超越故事?我希望在运行此运行程序或故事文件时需要调用场景方法之前和之后。

【问题讨论】:

  • 在提供的示例方法中,storyPaths 将被忽略,因为 JUnitStory 已扩展。扩展 JUnitStories 或通过 Configuration#useStoryPathResolver 配置故事路径解析器

标签: jbehave


【解决方案1】:

您应该将带有@BeforeScenario/@AfterScenario 的类视为具有步骤实现的类:您应该在您的步骤工厂中注册它们。

BeforeAndAfterSteps.java

public class BeforeAndAfterSteps {

    @BeforeScenario
    public void beforeScenario() throws Exception {
        // setup
    }

    @AfterScenario
    public void afterScenario() throws Exception {
        // teardown
    }
}

步骤工厂配置示例

new InstanceStepsFactory(configuration, new BeforeAndAfterSteps())

官方 JBehave 示例:

【讨论】:

  • 嗨,Val,你能解释一下,如何合并像 Hooks 这样的功能。我怎样才能运行我的简单故事?我们在 JBehave 中是否有 Runners 的概念。如何配置这个?我已经更新了我正在尝试的帖子。你能帮帮我吗?
  • @Uday,您可以在此处找到有关启用 JUnit 的嵌入的更多信息:jbehave.org/reference/stable/developing-stories.html。很快:您可以运行单个故事,如果扩展 JUnitStory,或者可以运行多个故事,如果扩展 JUnitStories
【解决方案2】:

以下跑步者文件开始为我工作:

public class JBehaveRunner extends JUnitStories {

    @Override
    public Configuration configuration() {
        return new MostUsefulConfiguration()
            .useStoryLoader(
                new LoadFromClasspath(getClass().getClassLoader()))
            .useStoryReporterBuilder(
                new StoryReporterBuilder()
                    .withDefaultFormats()
                    .withFormats(Format.HTML));
    }

    @Override
    public InjectableStepsFactory stepsFactory() {
        return new InstanceStepsFactory(configuration(), new HomePageSteps(), 
            new BaseEngine());
    }

    @Test
    public void run() throws Throwable {
        super.run();
    }

    @Override
    public List<String> storyPaths() {
        return new StoryFinder().findPaths(
            CodeLocations.codeLocationFromClass(this.getClass()),
            Arrays.asList("**/*.story"),
            Arrays.asList(""));    
    }
}

【讨论】:

  • 从提供的示例中不清楚 HomePageStepsBaseEngine 类包含什么
  • 考虑 HomePageSteps 包含实际的 stepDefinitions 和 BaseEngine 有一些实用方法,也可能有 BeforeScenario 和 AfterScenario 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
相关资源
最近更新 更多