1

jbehave ストーリーを順番に実行しようとしています。

統合テストのパッケージ構造を以下に示します

src/it/some/package/name/packageA/a.story
src/it/some/package/name/packageB/b.story
src/it/some/package/name/c.story

a.story、b.story、c.storyの順番でストーリーを進めていきたい

jBehaveで GivenStoriesを使用してみましたが、機能していないようです (正しく指定していない可能性があります)。誰かが GivenStories テキストの作成を指摘し、統合テストを実行するときに jbehave がどのように順序付けを作成するかについての洞察を示すことができれば、非常に感謝しています。実行順序が異なります。

これに関するヘルプは大歓迎です。ありがとう!

4

3 に答える 3

2

この応答は少し遅いかもしれませんが、とにかく. 私たちは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

これにより、BBB ストーリーの前に AAA ストーリーが実行されます。

于 2013-02-05T12:23:38.187 に答える
1

私は実際に、この問題の回避策を見つけました。これは、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>

SampleTesterSequence は、以下に示すような構造になります。

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
    }
}

ご覧のとおり、スイートはストーリーa、b、cをスイートで言及した順序で実行します。surefireがテストTesterSequenceを実行すると、で終わるパターンが検索され、最初にそのクラスが実行され、そのクラスから実行されます指定された順序で実行したいストーリー。

于 2013-02-05T14:29:36.893 に答える
1

これが発生する理由は、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));
}

この場合、実行したい順序付きテストのリストを含む ant build.xml ファイルを解析して、orderedTestListArray を取得しています。

private String[] retrtieveTestNamesFromBuildXml() {
    String[] orderedTestListArray = null;
    InputStream iStream = null;
    try {
        File file = new File("build.xml");

        if(file.exists()) {
           iStream = new FileInputStream(file);
           DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
           DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
           Document doc = docBuilder.parse(iStream);       
           NodeList propertyNodes = doc.getElementsByTagName("property");

           String orderedTestListString = null;

           for (int i = 0; i < propertyNodes.getLength(); i++) {
               Element elementNode = (Element) propertyNodes.item(i);
               if(elementNode.getAttribute("name").equals("xed.tests.to.run")) {
                   orderedTestListString = elementNode.getAttribute("value");
                   break;
               }      
           }

           orderedTestListArray = orderedTestListString.split(",");
           for(int i = 0; i <= orderedTestListArray.length-1; i++) {
               orderedTestListArray[i] = orderedTestListArray[i].trim();
               orderedTestListArray[i] = orderedTestListArray[i].substring(3, orderedTestListArray[i].length());
           }
        }  
     }
     catch (Exception e) {
         System.out.println("Error parsing XML info from build.xml");
         e.printStackTrace();
         System.exit(1);
     }
    finally {
        try
        {
            if(iStream != null)
                iStream.close();
        }
        catch (IOException e)
        { 
            System.out.println("Error closing InputStream for build.xml");
            e.printStackTrace();
        }
    }
    return orderedTestListArray;
}

最後に、次のように、ant または maven から実行しているときに、この新しい StoryFinder クラスを必ず指定してください。

storyFinderClass=fullyQualifiedNameOfNewStoryFinderClass
于 2014-08-05T22:34:00.240 に答える