web-dev-qa-db-ja.com

BDD、キュウリのベストプラクティス

BDDCucumberに関するベストプラクティスをいくつか理解しようとしています。私は最近それを使い始めたばかりで、テストを書いた最初の機能は検索機能のテストです。具体的には、RepositoryレイヤーがJPA EntityManagerとどのように統合されているか@PersistenceContextアノテーションを使用して挿入されます。これは、GlassFish組み込みmaven依存関係を使用してEJBContainerを作成し、永続性レイヤーをこのように初期化することによって行われます。それはうまくいくので、私はそれにかなり満足しています。

現在、私はSeleniumとCucumberを使用してJSFページの検索機能をテストする段階にあります。検索が送信された後、HTMLテーブルの内容を確認できると思います。

Seleniumテストを行う別のステップクラスで同じ機能ファイルを使用することは可能ですか?これは良い習慣ですか?現時点では、このCucumberのものは単体テストのようには感じられず、すべて統合テストのように感じられます!

私が考えているのは次のような組織です

test
    |
    Java
    |   |
    |   feature
    |       |
    |       web
    |       |  |
    |       |  user
    |       |      UserSearchWebSteps
    |       |      UserAddWebSteps
    |       |      UserDeleteWebSteps
    |       |      UserWebTest
    |       db
    |          |
    |          user
    |              UserSearchDBSteps
    |              UserAddDBSteps
    |              UserDeleteDBSteps
    |              UserDBTest
    resources
        |
        feature
            |
            user
                search_users.feature
                add_user.feature
                delete_user.feature

したがって、ステップはwebまたはdbのレベルで編成され、この例では、各ユーザーステップはその下にあります。これらのすべてのステップを実行する対応するランナーテストクラス

そして、webレベルとdbレベルの両方が同じ結果を期待しているので、機能ファイルを共有しました。

次に、UserXXXTestは、キュウリのオプションで機能ファイルを見つける場所を指定します。これは、webとdbのステップがパッケージレベルで分離されているため、同じ正規表現のステップメソッドが問題にならないためです。

@RunWith(Cucumber.class)
@CucumberOptions(features =
{
    "src/test/resources/feature/user"
})
public class UserDBTest
{

}
4
PDStat

従来、BDDでは外側から始めて移動していたため、Webページが作成され、シナリオがWebページで機能するまで、そこから実際のDB接続に移動しました。

ただし、同じ機能ファイルを異なるレベルの異なるステップで使用できるかどうかについてのあなたの質問は適切であり、適切です。

現時点では、きゅうりが実際にこれを行うとは思いません。 PHPがそうです。KonstantinKudryashovの投稿 同じエンドツーエンドのシナリオを使用してドメインをモデル化する方法 この種のことをうまく行う方法について(短いバージョン:シナリオを宣言的にすることを忘れないでください!)

Cucumberで実行したい場合は、シンボリックリンクを使用して、両方の場所で実行したい機能ファイルをミラー化することが可能だと思いますか?それを動作させるには、いくつかのジグザリーポケリーが必要です。しかし...理論は非常に健全であり、BDDコミュニティのメンバーとして尊敬されているコンスタンティンは、しばらくの間このスペースを探索してきました。

ただし、より低いレベルでも、単体テストではなく、統合テストになります。

ユニットレベルでBDDを使用することは可能です( 結局のところ、そこから始まります )。ただし、システムレベルの重いフレームワークではなく、RSpecのようなものを使用したいと思うでしょう。

4
Lunivore

基本的な概念を誤解していると思います。 Behavior-Driven Developmentは単体テストではありません。機能ファイルを作成する前にコードを記述した後まで待機している場合、それは間違っています。 BDDが提供する利点は、コードが要件を満たしているかどうかをビジネスパートナーがどのように評価するかをビジネスパートナーに伝えることですbeforeコーディングを開始します。そして、これは機能ファイルのシナリオとして表現されます。非技術的なビジネスパートナーは、シナリオを読み、テスト対象を正確に理解できる必要があります。 (実際、あなたが本当にそれを正しく実行している場合、3つのamigosミーティングの結果として、ビジネスは機能ファイルを書き込んでいます。)コーディングしながら、ユニットテストを行う必要があります。 BDD =ビジネスが期待する方法でアプリケーションを実行しますか。ユニットテスト=コードは、開発者が期待する方法で動作しますか。これらの2つの間には微妙ですが非常に重要な違いがあります。

2
user186326