Java 顺序运行jbehave故事

Java 顺序运行jbehave故事,java,integration-testing,jbehave,Java,Integration Testing,Jbehave,我正在尝试按顺序运行jbehave故事 我的集成测试包结构如下所示 src/it/some/package/name/packageA/a.story src/it/some/package/name/packageB/b.story src/it/some/package/name/c.story import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.runner.RunWith; import

我正在尝试按顺序运行jbehave故事

我的集成测试包结构如下所示

src/it/some/package/name/packageA/a.story
src/it/some/package/name/packageB/b.story
src/it/some/package/name/c.story
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;



@RunWith(Suite.class)
@Suite.SuiteClasses({ A.class,B.class, 
        C.class })
public class SampleTesterSequence {
    @BeforeClass
    public static void beforeStories() throws Exception {
       //TODO Implement before story steps
    }

    @AfterClass
    public static void afterStories() throws Exception {
      //TODO Implement after story steps
    }
}
我想让这个故事按照这个顺序进行

我尝试在jBehave中使用,但它们似乎不起作用,可能是我没有正确地指定它们。如果有人能指出GivenStories文本的创建,并在jbehave运行集成测试时展示如何创建顺序,我将非常感激,因为我看到在我的机器和jenkins上运行故事似乎会产生不同的执行顺序


在此方面的任何帮助都将不胜感激。谢谢

我猜这个反应可能有点晚了,但无论如何。我们也在尝试JB,但似乎仍然有很多问题需要解决,尤其是在现实世界中

我们已经给出了在一个模块中工作的故事,但是如果您尝试跨模块调用,例如您有一个包含您想要调用的公共故事的依赖jar,那么这似乎根本不起作用

但在同一模块中,请确保将GS条目放置在故事中的正确位置,如下所示:

Story: Running BBB

GivenStories: com/xxx/test/stories/test_aaa_user.story

Given a BBB string
When I set BBB to activate
Then the BBB string is set to activate
storyFinderClass=fullyQualifiedNameOfNewStoryFinderClass

这是在BBB故事之前的AAA故事。

我猜这个反应可能有点晚,但无论如何。我们也在尝试JB,但似乎仍然有很多问题需要解决,尤其是在现实世界中

我们已经给出了在一个模块中工作的故事,但是如果您尝试跨模块调用,例如您有一个包含您想要调用的公共故事的依赖jar,那么这似乎根本不起作用

但在同一模块中,请确保将GS条目放置在故事中的正确位置,如下所示:

Story: Running BBB

GivenStories: com/xxx/test/stories/test_aaa_user.story

Given a BBB string
When I set BBB to activate
Then the BBB string is set to activate
storyFinderClass=fullyQualifiedNameOfNewStoryFinderClass

这是在BBB之前的AAA故事。

我实际上找到了一个解决这个问题的方法,我认为这比GivenStories方便得多

首先,我添加了一个maven surefire配置,如下所示

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>${surefire.version}</version>
  <configuration>
    <includes>
       <include>**/*TesterSequence.java</include>
    </includes>
  </configuration>
</plugin>

正如你所看到的,这个组曲将按照我在组曲中提到的顺序运行故事a,b,c,当surefire运行测试时,它会查找以TesterSequence结尾的模式,并将首先运行该类,然后从该类中执行我们希望按指定顺序运行的故事。

我实际上找到了解决此问题的方法,我认为这比给定的故事方便得多

首先,我添加了一个maven surefire配置,如下所示

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>${surefire.version}</version>
  <configuration>
    <includes>
       <include>**/*TesterSequence.java</include>
    </includes>
  </configuration>
</plugin>

正如你所看到的,这个组曲将按照我在组曲中提到的顺序运行故事a,b,c,当surefire运行测试时,它会查找以TesterSequence结尾的模式,并将首先运行该类,然后从该类中执行我们希望按指定顺序运行的故事。

发生这种情况的原因是JBehave按照在文件系统中找到测试的顺序运行测试。为了避免这种情况,您可以扩展JBehave的StoryFinder类并覆盖findClassNames,以使用存储在属性文件build.xml等位置的有序列表:

@Override
public List<String> findClassNames(String searchIn, List<String> includes, List<String> excludes) {

    String[] orderedTestListArray = retrtieveTestNamesFromBuildXml();

    List<String> scannedTestList = scan(searchIn, includes, excludes);
    System.out.println("Scanned Test List: " + scannedTestList);

    List<String> finalTestList = new ArrayList<String>();
    for(String x: orderedTestListArray) {
        for(String y: scannedTestList) {
            if(y.contains(x))
                finalTestList.add(y);
        }
    }

    System.out.println("Final Ordered Test List: " + finalTestList);
    return classNames(normalise(finalTestList));
}

发生这种情况的原因是JBehave按照在文件系统中找到测试的顺序运行测试。为了避免这种情况,您可以扩展JBehave的StoryFinder类并覆盖findClassNames,以使用存储在属性文件build.xml等位置的有序列表:

@Override
public List<String> findClassNames(String searchIn, List<String> includes, List<String> excludes) {

    String[] orderedTestListArray = retrtieveTestNamesFromBuildXml();

    List<String> scannedTestList = scan(searchIn, includes, excludes);
    System.out.println("Scanned Test List: " + scannedTestList);

    List<String> finalTestList = new ArrayList<String>();
    for(String x: orderedTestListArray) {
        for(String y: scannedTestList) {
            if(y.contains(x))
                finalTestList.add(y);
        }
    }

    System.out.println("Final Ordered Test List: " + finalTestList);
    return classNames(normalise(finalTestList));
}