【问题标题】:Very simple step by step JBehave setup tutorial?非常简单的一步一步 JBehave 设置教程?
【发布时间】:2014-01-11 02:11:33
【问题描述】:

虽然我已经阅读了很多关于如何使用 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. 在我的 Java 类中导入 Given、Named、Then、When 注释
  9. 在我的 JBehave 故事文件中编写了两个不同的场景

而且,我仍然无法让它工作/运行! =(

故事文件:

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

我目前正在使用 Eclipse Kepler (4.3) JEE 以及使用 JUnit、Google App Engine 所需的一切,是的,JBehave 已按照 Eclipse JBehave 安装教程正确安装。

我无法让它工作。那么如何使用 Eclipse、JBehave 和 JUnit 使其正常工作呢?

【问题讨论】:

  • 你遇到什么样的错误?
  • 如果我能得到一个错误,我就能知道会发生什么!我根本无法像任何人一样奔跑!唯一可用的选项是“在服务器上运行”。打开的透视图是Java。另外,故事文件一直告诉我,没有为Whens 和Thens 定义任何步骤,奇怪的是,它们是带参数的两个!... =\ 我不知道该往哪里看了。

标签: java eclipse junit bdd jbehave


【解决方案1】:

按照jbehave Getting Started 教程的步骤,运行故事 部分说:[...] ICanToggleACell.java 类将允许自己作为 JUnit 测试运行。

这意味着您的构建路径中需要 JUnit 库。

使用 Eclipse:

  1. 选择您当前的项目并右键单击它,构建路径配置构建路径...
  2. [当前项目]Java 构建路径 的属性,单击[添加库...]时间>
  3. 添加库,选择JUnit,点击[下一步]
  4. JUnit Library,JUnit库版本,选择你要使用的版本,点击[Finish]
  5. Java 构建路径,点击[确定]
  6. Project Explorer,选择您的ICanToggleACell.java 类,右键单击它,然后运行为,然后单击JUnit Test

所以这与上面的示例代码相同。在将适当的库添加到 Java 构建路径后,StackBehaviourStory.java 类应该让自己作为 JUnit 测试运行。

【讨论】:

    【解决方案2】:

    就我而言,我从 Steps 扩展了我的 Steps 类(来自 jbehave 核心)

    【讨论】:

    • 展示一些示例代码以说明您的说法可能会很有趣。 =)
    【解决方案3】:

    我知道我在这里聚会迟到了,但我发帖是因为这是我一周前希望得到的信息,因为它可以为我节省很多痛苦。我非常喜欢 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

    【讨论】:

    • 欢迎您的贡献。我不妨试试你的方法,因为我还不熟悉 Java 及其 IDE。 =)
    • 让我知道结果如何 - 如果可以的话,我很乐意提供帮助
    【解决方案4】:

    我已将 JunitStory 更新为 JunitStories 并且它有效

    公共类 StackBehaviourStory 扩展了 JUnitStory ---> JunitStories

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      相关资源
      最近更新 更多