Очень просто шаг за шагом настроить JBehave?
Хотя я читал много, но много статей о том, как использовать JBehave, я не могу заставить его работать. Вот шаги, которые я прошел до сих пор:
- Создан новый проект Java
- Загрузили JB файл JAR версии 3.6.8 и добавили его в мои библиотеки путей сборки
- Создал пакет под названием
com.wmi.tutorials.bdd.stack.specs
в папке с исходным кодом тестового источника в моей рабочей области
- Добавлен JB файл JAR в конфигурацию библиотеки путей сборки
- Создал историю JBehave в вышеупомянутом пакете (StackBehaviourStories.story)
- Создан класс Java в вышеупомянутом пакете (StackBehaviourStory.java)
- Создал класс Java в вышеупомянутом пакете (StackBehaviourSteps.java)
- Импортировано заданное, именованное, затем, когда аннотации в моем классе Java
- Написал два разных сценария в файле истории 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?
Ответы
Ответ 1
Следуя поэтапно, jbehave Getting Started
, в разделе Выполнить говорится: [...] класс ICanToggleACell.java позволит себе запускать как тест JUnit.
Это означает, что библиотека JUnit требуется в вашем пути сборки.
Использование Eclipse:
- Выберите текущий проект и щелкните его правой кнопкой мыши, создайте путь, настройте путь сборки...
- Свойства для [текущего проекта], пути сборки Java, библиотеки, щелкните [Добавить библиотеку...]
- Добавить библиотеку, выберите JUnit, щелкните [Next]
- Библиотека JUnit, версия библиотеки JUnit, выберите версию, которую вы хотите использовать, нажмите [Готово]
- Путь сборки Java, нажмите [OK]
- Проводник проекта, выберите свой
ICanToggleACell.java
класс, щелкните его правой кнопкой мыши, затем запустите как, и нажмите "Тест JUnit"
Итак, это то же самое, что и для кода вышеприведенного кода. Класс StackBehaviourStory.java
должен позволить себе запускаться как тест JUnit после добавления правильной библиотеки в путь сборки Java.
Ответ 2
Я знаю, что опаздываю на вечеринку здесь, но я отправляю сообщение, потому что это информация, которую я хотел бы иметь неделю назад, поскольку это спасло бы меня от боли. Я очень вникаю в идею BDD, но, к сожалению, я обнаружил, что JBehave docs - это кошмар, особенно когда речь идет о интеграции 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.
тест ingest проходит в src/test/java//tests.ingest.
файлы истории живут в src/test/resources/stories.
Насколько я могу судить, JBehave имеет множество опций, поэтому это, конечно, не единственный способ делать что-то. Рассматривайте это как шаблон, который поможет вам быстро и быстро.
полный источник находится на github.
Ответ 3
В моем случае я расширил класс Steps с шагов (из ядра jbehave)