TDDで新しいプロジェクトを開始する


10

私はTDDを勉強していますが、アプリのデザインを定義するのにも役立ちます。

それで、私はそれをよりよく理解するのを助けるために新しいプロジェクトを作り始めることにしました。

名前、メールアドレス、国(リストから1つ選択します)、電話番号を尋ねる簡単なユーザー登録システムを作成したいと考えています。

だから問題は...

私はVS 2010で新しいソリューションを作成し、新しいテストプロジェクトを追加しましたが、作成するテストがわかりません!

デザインを定義するのに役立つので、ここでどんなテストを書けますか?

助けてくれてありがとう!

c#  .net  tdd 

1
これは、最初に使用するパターン、作成するクラスなどについて考える必要がある場合に役立ちます。- まずクラスを定義して、メソッドのテストケースを作成し、次にメソッドの実装を開始します。彼らのテストケースによると..
ハーフダン'19

回答:


6

単体テストを作成するときは、アプリケーションの動作をテストしているので、重要な質問はアプリケーションをするかです。これが始まりです:

[TestFixture]
public class RegistrationTests
{
    [Test]
    public void Should_save_new_user_info()
    {
    }

    [Test]
    public void Should_throw_validation_exception_when_email_already_exists()
    {
    }

    [Test]
    public void Should_format_phone_number_when_country_code_is_us()
    {
    }
}

さて、これらすべてのテストは既に合格していますが、次に何をしますか?:)
スコットウィットロック

2

テストプロジェクトを作成し、いくつかのテストメソッドを作成することはTDDの一種ですが、既知のAPIがあり、メソッド呼び出しがユーザーが期待するものに直接対応しているライブラリで作業している場合を除いて、これはあまり役に立ちません。テストの適切なリストを作成する必要があります。重要なアプリケーションの場合、それを実行するのは非常に難しい場合があります。

私はSpecFlowを試すことをお勧めします。テストを実装から適切に分離し続け、機能ファイルの構造により、実際にテストしているものについて考えることを強いられます。

機能を定義するときは、次のように書くだけです。

When a user is saved
Then the user should exist

この時点ではコードファイルを使用していないので、ユーザーを作成するために呼び出されるメソッドや、それが実装されているクラスなどの実装の詳細について考える気になりません。タグを使用して、さまざまな実装を選択できます。したがって、このレベルでは、「ユーザーが保存されている」がCreateUserの呼び出しを意味するか、ブラウザを開いてフォームを送信するかは関係ありません。

機能を定義すると、すべてのテストが生成され、テストされるステップ定義と実際のアプリケーションコードを実装するときに合格します。

単純なアプリの場合は、機能ファイルを作成するだけですが、より複雑な場合は、事前に完全な仕様をまとめておくと便利です。私はiPadのマインドマッピングアプリを使用していますが、最も使いやすいツールであれば何でも使用できます。

「ユーザー登録」のような高レベルの機能のリストから始めます。これらは幅が広すぎて直接テストを作成できない傾向があるため、明確に定義できるサブ機能に分割し、一般に「ユーザーの保存」や「既存のユーザーの表示」などの特定のユーザーアクションにマッピングします。

これらの各サブ機能には、「有効なユーザーを保存できる」や「ユーザー名が重複しているユーザーを保存できない」など、機能が動作しているかどうかを完全に定義するシナリオのリストが必要です。

このリストを作成すると、通常、構造を調整する必要がある場所が明らかになります-機能のシナリオテストを思い付かない場合、または1つの機能に多すぎる場合、その機能はおそらく次の場所で定義されます。間違ったレベルであり、分割または変更する必要があります。


2

私は最初の実験をTDDにバックアップし、コードをカットするだけでなく、いくつかの読み取りを行っておくと良いと思いました。この主題に関するウィキペディアの記事は非常に優れており、他のさまざまなリソースを紹介します。特にケントベックによるものを探してください。TDDの父のようなものです。

あなたがそれのスイングに入るのを助けるかもしれないもう一つのことは、いくつかのカタを実行することです-単純でほとんど気にしないトレーニング演習。Roy Osheroveには良いものがあります。

それを超えて、TDDの重要なアイデアを覚えておいてください。一度に1つのテストを記述し、それとそれまでのすべてのテストに合格するまで続行しないでください。現在のテストを満たすのに十分なコードのみを記述してください。それ以上記述しようとする誘惑を避けてください。あなたが行くとき、時々停止して、コードかテストのどちらかを片付けることができるかどうか考えてください。常に赤(テストに失敗)、緑(テストに合格)、リファクタリングサイクルで開発します。

そして、あなたを始めるために、おそらくあなたの名前の要件から始めます。何が必要ですか?

おそらくクラスが必要になります。そのためのテストを作成し(一部の人々はこれをスキップしますが、演習のためにそれを開始するときに)、クラスを作成します。

次に、クラスに名前を保存する必要があります。クラスが実際にできることを証明するテストを書きます。次に、テストをパスするためのコードを再度記述します。

次に、おそらくいくつかのビジネスルールがあります。たぶん、あなたはあなたの名前を最小文字数にしたいと思うでしょう。テストを書いて、失敗するのを見て、コードを書いてください。

等々...


1

TDDのアイデアを簡単に説明することはできないと思います。あなたはそれを感じているために、それを実践している身体を「見る」必要があります。そのトピックについて私が見つけた中で最高のリソースはhttp://pragprog.com/titles/achbd/the-rspec-bookです。私に言う前に、Rubyはあなたの言語ではありません。ボブおじさんによる序文を読んでください!;-)


1
rspecブックは大丈夫です。OPがTDDに関する本を読む場合、これは次のようになります。amazon.com
Beck

0

電子メールフィールドに複数の異なる値を追加しようとするテストを設定することもできます。有効なものとそうでないものがあります。すべてのテストで期待値が得られるまで、開発を止めないでください。そのようなもの。


0

システムについて説明したように、アプリケーションレベルでのテストは1つだけです。

[テスト] public void Save_and_retrieve_user(String name、String email、...){// Save // Retrieve // Verify}

要件を調整したら、さらにテストを追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.