2012-02-21 3 views
3

私はEncyptDecryptという文字列を持つ静的クラスCryptographicを持っています。私はこれに次の仕様を書いています:これはクリーンなBDD/MSpecテストですか?

[Subject(typeof(Cryptographic))] 
class When_encrypting_and_decrypting_a_string 
{ 
    Establish context =() => { input = "teststring"; }; 

    Because of =() => 
    { 
     output = Cryptographic.Decrypt(Cryptographic.Encrypt(input)); 
    }; 

    It should_decrypt_what_was_encrypted =() => input.ShouldEqual(output); 

    static string input; 
    static string output; 
} 

[Subject(typeof(Cryptographic))] 
class When_encrypting_and_decrypting_an_empty_string 
{ 
    Establish context =() => { input = string.Empty; }; 

    Because of =() => 
    { 
     output = Cryptographic.Decrypt(Cryptographic.Encrypt(input)); 
    }; 

    It should_decrypt_what_was_encrypted =() => input.ShouldEqual(output); 

    static string input; 
    static string output; 
} 

[Subject(typeof(Cryptographic))] 
class When_encrypting_and_decrypting_a_null_string 
{ 
    Establish context =() => { input = null; }; 

    Because of =() => 
    { 
     output = Cryptographic.Decrypt(Cryptographic.Encrypt(input)); 
    }; 

    It should_decrypt_what_was_encrypted =() => input.ShouldEqual(output); 

    static string input; 
    static string output; 
} 

これはクリーンBDDユニットテストですか?改善できるものはありますか? 私の側から懸念のカップル:

  1. 私は実際に 1をテストする必要がどこ私は、ここに二つのことをテストしている可能性があります。私はEncryptDecryptの両方をBecauseに持っています。
  2. テストには多くのコピーと貼り付けが必要ですが、すべてのテストは入力引数だけが異なります。これを改善することができますか、それとも、何らかの行テストを使用して 、あるいは共通の基本クラスまたは Behaves句を代わりに使用することで改善できますか?私は可読性が現在かなり最適であることを意味しますが、保守性はありません。メンテナンス性(DRY)を最適化すれば、私は が読みやすい状態で取引されている可能性があります。

このテスト/スペックはどのように記述しますか?

答えて

1

このユニットテストは良い出発点のようです。 EncryptDecryptを実装して、それぞれinputを返すようにすれば、それが壊れるかどうかは疑問です。現在のところ、テストコードまたはプロダクションコードが最初に書かれたかどうかわからないものを暗号化する必要はありません。

一般的なルールとして、入力と出力のペアをテストする必要がある場合は、NUnitのTestCaseなどを参照することをお勧めします。 al。ツールとしてのBDDは特に意味がありますが、システムの動作を指定することに限定されません。ここで紹介したのは、システムの他の部分とやりとりしない単一のクラスです。 BDDとコンテキスト/仕様のフレーバーが、ユニットの動作を表現するのに役立つかもしれないことを理解していますが、時には古典的なユニットテストフレームワークが理にかなっています。これは、入力と出力のタプルをテストする必要がある場合に特に当てはまります。

+0

私は、BDDの単体テストを使用しないときは、非常に必要な記事を作成すると思います。 BDDは一般にTDD vNext(「BDDはTDDが正しく行われました」)として認識されていますが、TDDツールを選択する方が良いシナリオが明確に定義されていると確信しています。この例は、システムの他の部分と相互作用しない理由であるパブリックAPIの一部です。何か私は、パブリックAPIの指定/テストがそのシナリオの1つだと思うようになります。 – bitbonk

関連する問題