web-dev-qa-db-ja.com

JBehaveセットアップチュートリアルの非常に簡単な手順

JBehaveの使用方法に関する多くの記事を読みましたが、機能させることはできません。これまでに行った手順は次のとおりです。

  1. 新しいJavaプロジェクトを作成しました
  2. JBehave JARファイルバージョン3.6.8をダウンロードし、ビルドパスライブラリに追加しました
  3. ワークスペースのテストソースフォルダーの下にcom.wmi.tutorials.bdd.stack.specsというパッケージを作成しました
  4. JBehave JARファイルをビルドパスライブラリ構成に追加しました
  5. 上記のパッケージ(StackBehaviourStories.story)にJBehaveストーリーを作成しました
  6. 上記のパッケージ(StackBehaviourStory.Java)にJavaクラスを作成しました)
  7. 上記のパッケージ(StackBehaviourSteps.Java)にJavaクラスを作成しました
  8. My JavaクラスのGiven、Named、Then、Whenアノテーションをインポートしました
  9. JBehaveストーリーファイルに2つの異なるシナリオを作成

それでも、私はそれを動作/実行させることができません! =(

ストーリーファイル:

Narrative:
In order to learn to with JBehave using Eclipse
As a junior Java developer though senior in .Net and in BDD
I want to define the behaviour of a custom stack

Scenario: I Push an item onto the stack
Given I have an empty stack
When  I Push an item 'orange'
Then  I should count 1

Scenario: I pop from the stack
Given I have an empty stack
When  I Push an item 'Apple'
And   I pop the stack
Then  I should count 0

ストーリークラス

package com.wmi.tutorials.bdd.stack.specs

import org.jbehave.core.configuration.MostUsefulConfiguration;
import org.jbehave.core.junit.JUnitStory;

public class StackBehaviourStory extends JUnitStory {
    @Override 
    public Configuration configuration() { return new MostUsefulConfiguration(); }

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

ステップクラス

package com.wmi.tutorials.bdd.stack.specs

import org.jbehave.core.annotations.Given;
import org.jbehave.core.annotations.Named;
import org.jbehave.core.annotations.Then;
import org.jbehave.core.annotations.When;
import org.jbehave.core.junit.Assert;

public class StackBehaviourSteps {
    @Given("I have an empty stack")
    public void givenIHaveAnEmptyStack() { stack = new CustomStack(); }

    @When("I Push an item $item")
    public void whenIPushAnItem(@Named("item") String item) { stack.Push(item); }

    @Then("I should count $expected")
    public void thenIShouldCount(@Named("expected") int expected) {
        int actual = stack.count();
        if (actual != expected) 
            throw new RuntimeException("expected:"+expected+";actual:"+actual);
    }
}

現在、JUnit、Google App Engineを使用するために必要なすべてのものでEclipse Kepler(4.3)JEEを使用しています。もちろん、JBehaveはEclipse JBehaveインストールチュートリアルに従って正しくインストールされます。

私はそれを動作させることができません。それでは、Eclipse、JBehave、JUnitを使用してどのように正しく動作させることができますか?

15

jbehave Getting Started チュートリアル、ストーリーの実行セクションは次のように述べています:[...] ICanToggleACell.Javaクラスはそれ自体がJUnitテストとして実行されます。

これは、ビルドパスにJUnitライブラリが必要であることを意味します。

Eclipseの使用:

  1. 現在のプロジェクトを選択して右クリックし、ビルドパスビルドパスの構成...
  2. [現在のプロジェクト]Java Build PathLibrariesのプロパティ、クリック[ライブラリを追加...]
  3. ライブラリを追加、JUnitを選択し、[次へ]をクリック
  4. JUnitライブラリ、JUnitライブラリバージョン、使用したいバージョンを選択して、[完了]をクリック
  5. Javaビルドパス、クリック[OK]
  6. プロジェクトエクスプローラーで、ICanToggleACell.Javaクラスを右クリックして[実行]をクリックし、[JUnitテスト]をクリックします

したがって、これは上記のコードの場合と同じです。 StackBehaviourStory.Javaクラスは、適切なライブラリをJavaビルドパスに追加した後、JUnitテストとして実行する必要があります。

4

私はここでパーティーに遅れていることを知っていますが、これは私が多くの苦痛を救うので、これが私が1週間前に持っていたと思う情報であるので、私は投稿しています。私はBDDのアイデアに非常に興味がありますが、残念ながらJBehaveのドキュメントは、特にMavenの統合に関しては少し悪夢であると感じています。さらに、彼らのウェブサイトと他の場所の両方で私が見つけたコードの多くは機能しませんでした。試行錯誤と多くのチュートリアルを通じて、次のことをまとめることができました。 MavenとEclipseの両方で実行され、ストーリーをステップファイルにマップする単一のバインディングクラスを持ち、src/test/resourcesにあるストーリーファイルを見つけることができます。

作業中のpomファイルは次のとおりです。

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.projectvalis.st1</groupId>
  <artifactId>st1</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>st1</name>
  <url>http://maven.Apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <build>
    <pluginManagement>
      <plugins>

        <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        <compilerArgument></compilerArgument>
          </configuration>
        </plugin>

       <plugin>  
         <groupId>org.Apache.maven.plugins</groupId>  
         <artifactId>maven-failsafe-plugin</artifactId>  
         <version>${failsafe.and.surefire.version}</version>  
         <executions>  
           <execution>  
             <id>integration-test</id>  
             <goals>  
               <goal>integration-test</goal>  
               <goal>verify</goal>  
             </goals>  
           </execution>  
         </executions>  
         <configuration>  
           <includes>  
             <include>**/*Test.Java</include>  
           </includes>  
         </configuration>  
       </plugin>

       <plugin>
        <groupId>org.jbehave</groupId>
        <artifactId>jbehave-maven-plugin</artifactId>
        <version>4.0.2</version>
            <executions>  
                <execution>  
                    <id>run-stories-as-embeddables</id>  
                    <phase>integration-test</phase>  
                    <configuration>  

                    <includes>  
                        <include>**/*Test.Java</include>  
                    </includes>  
                    <ignoreFailureInStories>false</ignoreFailureInStories>  
                    <ignoreFailureInView>false</ignoreFailureInView>  

                        <systemProperties>
                            <property>
                                <name>Java.awt.headless</name>
                                <value>true</value>
                            </property>
                        </systemProperties>


                    </configuration>  
                    <goals>  
                    <goal>run-stories-as-embeddables</goal>  
                    </goals>  
            </execution>  
             </executions>
       </plugin>

      </plugins>
    </pluginManagement>
  </build>


  <dependencies>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.7</version>
    </dependency>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.0.1</version>
    </dependency>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.0.1</version>
    </dependency>

    <dependency>
        <groupId>org.Apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>

    <dependency>
        <groupId>org.jbehave</groupId>
        <artifactId>jbehave-core</artifactId>
        <version>4.0.2</version>
    </dependency>

  </dependencies>
</project>

サンプルストーリーファイルはこちら

Narrative:
In order to work with files to compress
As a guy who wants to win a bet with cameron
I want to ensure files are ingested and processed in the manner in which the
methods in the ingest class purport to process them. 

Scenario:  Simple test to give JBehave a test drive
Given a file, a.log
When the caller loads the file as a byte array
Then the byte array that is returned contains the correct number of bytes.

ここにサンプルのステップファイルがあります

package com.projectvalis.compUtils.tests.ingest;

import Java.io.File;

import org.jbehave.core.annotations.Given;
import org.jbehave.core.annotations.Named;
import org.jbehave.core.annotations.Then;
import org.jbehave.core.annotations.When;
import org.jbehave.core.steps.Steps;
import org.junit.Assert;

import com.projectvalis.compUtils.util.fileIO.Ingest;


    /**
     * BDD tests for the ingest class
     * @author funktapuss
     *
     */
    public class LoadByteSteps extends Steps {

        private String fNameS;
        private byte[] byteARR;

        @Given("a file, $filename")
        public void setFileName(@Named("filename") String filename) {
            File file = new File(getClass().getResource("/" + filename).getFile());
            fNameS = file.getPath();
        }

        @When("the caller loads the file as a byte array")
        public void loadFile() {
            byteARR = Ingest.loadFile(fNameS);
        }

        @Then("the byte array that is returned contains the "
                + "correct number of bytes.") 
        public void checkArrSize() {
            File file = new File(fNameS);
            Assert.assertTrue(
                    "loading error - "
                    + "the file and the resultant byte array are different sizes!", 
                    (long)byteARR.length == file.length());
        }


    }

そして、これが一般的なランナーです

package com.projectvalis.compUtils.tests.runner;


import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;

import org.jbehave.core.configuration.Configuration;
import org.jbehave.core.configuration.MostUsefulConfiguration;
import org.jbehave.core.io.CodeLocations;
import org.jbehave.core.io.LoadFromClasspath;
import org.jbehave.core.io.StoryFinder;
import org.jbehave.core.junit.JUnitStories;
import org.jbehave.core.reporters.Format;
import org.jbehave.core.reporters.StoryReporterBuilder;
import org.jbehave.core.steps.InjectableStepsFactory;
import org.jbehave.core.steps.InstanceStepsFactory;
import org.jbehave.core.steps.Steps;

import com.projectvalis.compUtils.tests.ingest.LoadByteSteps;



/**
 * generic binder for all JBehave tests. Binds all the story files to the 
 * step files. works for both Eclipse and Maven command line build.  
 * @author funktapuss
 *
 */
public class JBehaveRunner_Test extends JUnitStories {

    @Override 
    public Configuration configuration() { 
        return new MostUsefulConfiguration()            
                .useStoryLoader(
                        new LoadFromClasspath(this.getClass().getClassLoader()))
                .useStoryReporterBuilder(
                        new StoryReporterBuilder()
                            .withDefaultFormats()
                            .withFormats(Format.HTML, Format.CONSOLE)
                            .withRelativeDirectory("jbehave-report")
                );
    }

    @Override
    public InjectableStepsFactory stepsFactory() {
        ArrayList<Steps> stepFileList = new ArrayList<Steps>();
        stepFileList.add(new LoadByteSteps());

        return new InstanceStepsFactory(configuration(), stepFileList);       
    }

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

    }

}

ランナーはsrc/test/Java // tests.runnerに住んでいます。取り込みテストはsrc/test/Java // tests.ingestにあります。ストーリーファイルはsrc/test/resources/storiesにあります。

私が知る限り、JBehaveには多くのオプションがあるため、これが唯一の方法ではありません。これを、すぐに実行できるテンプレートのように扱ってください。

完全なソースは github にあります。

10
David Holiday

私の場合、StepsからStepsクラスを拡張しました(jbehaveコアから)

0
user3108681

私はJunitStoryをJunitStoriesに更新しましたが、それはうまくいきました

パブリッククラスStackBehaviourStoryはJUnitStoryを拡張します---> JunitStories