11

Java コードの量を最小限に抑えるために、非常に単純な方法でBDDを使用しようとしています。ちょうど 2 つのファイルを作成したいのですが、1 つは私のストーリーです。

Given user is named "John Doe" 
And user is authenticated
When user changes his password to "a1b2c3"
Then user password equals to "a1b2c3"

次に、Java クラスを作成します。

public class UserManipulator {
  @Given("$user is named $name")
  public User shouldExistOrBeCreated(String name) {
    User user = //...
    return user;
  }
  @Given("$user is authenticated")
  public void shouldBeLoggedIn() {
    // ...
  }
  @When("$user changes his password to $pwd")
  public void shouldChangePassword(User user, String pwd) {
    // ...
  }
  @Then("$user password equals to $pwd")
  public void shouldHaveThisPassword(User user, String pwd) {
    assertEquals(user.getPassword(), pwd);
  }
}

以上です。これ以上ファイルや単体テストは必要ありません。ストーリー ファイルを見つけて、すべての Java ファイルを解析し、それらを 1 つずつ実行する BDD フレームワークが必要です。達成することは可能ですか?

ps。ここで重要なのは、他の記事で Java メソッドを再利用できる可能性があることです。たとえば、これはストーリー No.2 です。

Given user is named "Michael Doe"   <-- reuse
When user adds $100.00 to his account
Then user account balance is $100.00
4

9 に答える 9

5

Ruby フレームワークであるCucumberを使用しますが、JRuby をプロジェクトにバンドルすることで、Java オブジェクトに簡単にアクセスできます。これはステップ定義を Ruby で作成することを意味しますが、作成する Java の量も最小限に抑えます :)

Cucumber のストーリー形式は、例で説明したとおりであり、ストーリー ラインの再利用は簡単です。

于 2010-10-10T08:25:37.610 に答える
5

ロボットフレームワークは興味深いかもしれません。詳細については、こちらのユーザー ガイドを参照してください: http://robotframework.googlecode.com/svn/tags/robotframework-2.5.4/doc/userguide/RobotFrameworkUserGuide.html#behavior-driven-style

Robotframework は python で書かれており、新しいキーワードは python または jython で実装できます。

ATDD のための RF の使用に関する論文もここにあります: http://www.niksula.cs.hut.fi/~jprantan/thesis/thesis_juha_rantanen.pdf

于 2010-10-10T19:27:11.373 に答える
5

あなたは見てみたい:

また、Java と Groovy の BDD に関するこのプレゼンテーションも興味深いものになるでしょう。

于 2010-10-08T12:28:50.697 に答える
4

JBehave の新しいバージョンでは、JUnitStories クラスを使用できます。これにより、1 つの Java クラスが複数のプレーン テキスト ストーリーのランナーとして機能します。これはあなたが必要とすることをしますか?

于 2010-12-22T18:03:32.993 に答える
3

あなたが探しているものではありませんが、Spockを見たいと思うかもしれません。

于 2010-10-10T06:44:11.910 に答える
2

jBehave または Cucumber を使用できます。両方とも良いです。

jbehave については、http://jbehave.org/ にアクセスしてください

私は今jBehaveを使用しています。私はキュウリについてほとんど知りません。「Cucumber-JVM」について少し勉強しました。

推し、二人ともいい​​な

于 2012-12-18T10:39:04.837 に答える
2

あなたが探している再利用のレベルを提供するとは思いませんが、Fitnesse に似ているがはるかに使いやすい BDD フレームワークであるConcordionも見てください (仕様は HTML ページの形式でプレーンテキストで記述されています)。 . また、JUnit と直接統合されるため、 Mavenとも統合されます。

こちらもご覧ください

于 2010-10-10T07:55:38.507 に答える
2

Cucumber JVMはまさにあなたが探しているものです。再利用でき、JUnit と透過的に動作し、Spring (およびその他の多く) とうまく統合できる単純なステップ。追加する必要がある唯一の追加ファイルは、 @RunWith(Cucumber.class) で注釈が付けられたクラスです。テストとステップの数に関係なく、1 つのクラスです。

于 2012-09-29T09:19:11.757 に答える
1

JGivenを見ることができます。シナリオのテキスト ファイルの代わりに、次のような JUnit テストを記述します。

public class UserManipulatorTest 
       extends ScenarioTest<GivenUser, WhenPasswordChange, ThenUser> {

   @Test
   public void user_can_change_his_password() {
       given().user_is_named( "John Doe" )
          .and().user_is_authenticated(); 
       when().user_changes_his_password_to( "a1b2c3" );
       then().user_password_equals_to( "a1b2c3" );
   }
}

次に、いわゆるステージ クラスにステップ定義を記述します。通常、再利用しやすいように、ステージごとに 1 つのクラスを用意します。したがって、あなたの場合、3 つのステージ クラスを定義します。

public class GivenUser extends Stage<GivenUser> {
    @ProvidedScenarioState
    User user;

    public GivenUser user_is_named(String name) {
        user = //...
        return self();
    }

    public GivenUser user_is_authenticated() {
        // ...
        return self();
    }
}

public class WhenPasswordChange extends Stage<WhenPasswordChange> {
    @ExpectedScenarioState
    User user;

    public WhenPasswordChange user_changes_his_password_to(String pwd) {
        // ...
        return self();
    } 
}

public class ThenUser extends Stage<ThenUser> {
    @ExpectedScenarioState
    User user;

    public ThenUser user_password_equals_to(String pwd) {
        assertEquals(user.getPassword(), pwd);
        return self();
    }
}

これらのステージ クラスを他のシナリオで再利用できるようになりました。この例では、GivenUser ステージ クラスを再利用でき、新しいステージ クラス WhenBalanceChange および ThenBalance を定義します。

public class BalanceTest 
    extends ScenarioTest<GivenUser, WhenBalanceChange, ThenBalance> {

    @Test
    public void user_can_add_balance_to_his_account() {
        given().user_is_named("Michael Doe");
        when().user_adds_$_to_his_account("$100.00");
        then().user_account_balance_is("$100.00");
    }
}

JGiven では、メソッド名の $ 文字はメソッド引数のプレースホルダーであり、生成されたレポートで置き換えられることに注意してください。

免責事項: 私は JGiven の作成者です。

于 2014-04-18T23:16:44.810 に答える