31

進行中のプロジェクトと開発プロセスの改善のために、TDDを開発哲学として採用することを検討しました。ベスト プラクティスと、新しいアプローチを同僚や開発者に「売り込む」方法を調査しているときに、BDD に出会い、BDDが必要なものにさらに適切であり、どういうわけか TDD の次の反復であることがわかりました。問題は、これまでのところ、 Dan Northによって開発されたJBehave というツールしか試していませんでしたが、驚いたとは言えません。

セットアップは私には面倒で、適切なドキュメントが見つかりませんでした。一方で、グルーヴィーなツールもスポックしてみましたが、今のところ気に入っています。

Q: BDD に使用できる適切なツールはありますか?
Q:代わりにスポックを使用して、別の言語を導入するオーバーヘッドに対処しますか?

4

6 に答える 6

16

JGivenの作成者として、Java には DSL を作成するための十分な柔軟性がないという意見には反対しなければなりません。JGiven では、BDD テストは次のようになります。

@Test
public void users_can_login {
    given()
       .a_registered_user()
       .and().the_login_page_is_shown();

    when()
       .the_user_enters_correct_credentials()
       .and().the_login_button_is_pressed();

    then()
       .the_welcome_page_is_shown();
}

JGiven は JUnit または TestNg と一緒に使用され、プレーンな Java でテストを記述します。

于 2014-08-09T17:48:36.580 に答える
14

製品所有者/qa/顧客がテストを読むことができる必要がない限り、Spockを使用してください。非常にシンプルなツールですが、テストの可読性を向上させます。その強力な機能のおかげで、Mockito、Hamcrest、AssertJ は必要ありません。また、優れたパラメータ化されたテストがあります。実際、それは「まさに」より優れた JUnit であり、単体テスト、統合テスト、受け入れテストなど、単純なタスクを自動実行するための一般的なツールです。

Groovyを恐れていますか?なんで?Java と非常によく似ています。学習すればするほど、表現力が増し、コードが短くなります。テストが短くなり、読みやすくなります。Groovy は、JVM の優れた側面へのゲートウェイ ドラッグです。

動的言語が嫌いですか? それはtestsであり、 commit のたびに CI サーバーによってテストが実行されますよね?コードが壊れた場合は、数分後にわかります。CI サーバーがないか、定期的にテストを実行していませんか? 次に、テスト フレームワークの選択に煩わされることなく、プロセスを修正します。壊れたテストは役に立たず、定期的にテストを実行しないと、すぐに壊れてしまいます。

必要に応じて JBehave/Cucumber を使用してください。それ以外の場合は、Spock を使用します。

于 2014-01-28T21:34:55.293 に答える
1

ナイスディスカッション!私はJGivenを知りませんでしたが、調べてみます。

さらに、私はCOLA Testsの作成者です。これは、完全な gherkin 構文 (Cucumber とまったく同じ) をサポートする新しいフレームワークです。特に JBehave と比較すると、セットアップが非常に簡単で、JUnit ランナーを必要としません。

基本的には、使い慣れたライブラリを使用するだけです!

以下は、Spring Controller テストの例です (ストーリーはファイルからロードできます)。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { WebAppContext.class })
public class HelloWorldControllerTest extends BaseColaTest {

    private final String stories =
        "Feature: Introduce REST endpoint\n"
            + "Scenario: Should say hello\n"
            + "Given a web endpoint\n"
            + "When hit by a get request\n"
            + "Then the HTTP status will be OK\n"
            + "And the body will say hello world";

    @Resource
    private WebApplicationContext webApplicationContext;
    private MockMvc mockMvc;
    private ResultActions result;

    @Given("a web endpoint")
    public void given() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @When("hit by a get request")
    public void when() throws Exception {
        result = mockMvc.perform(get("/helloWorld"));
    }

    @Then("the HTTP status will be OK")
    public void thenOk() throws Exception {
        result.andExpect(status().isOk());
    }

    @Then("the body will say hello world")
    public void thenHello() throws Exception {
        result.andExpect(content().string("Hello World!"));
    }
}
于 2015-01-17T07:00:15.567 に答える