2011-10-21 1 views
0

私はいつもテストごとに1つのアサーションに固執しようとしますが、時々私はそうすることに苦労しています。出力が別のものの入力であるという単位テスト方法

たとえば、

私は文字列を暗号化および復号化する暗号化クラスを作成しました。

public class CryptoDummy 
{ 
    public string Decrypt(string value) 
    { 
    } 

    public string Encrypt(string value) 
    { 
    } 
} 

復号化が暗号化の出力に依存する場合、どのようにユニットテストを作成しますか?

これまでのすべてのテストでは、ほとんどの場合、テストごとに1つのメソッド呼び出しとテストごとに1つのアサーションがあります。

したがって、テストごとに複数の呼び出しを行い、最後に呼び出したメソッドで行われた最終結果をアサートするのは問題ないのですか?

public class CryptoDummyTest 
{ 
    private static CryptoDummy _cryptoDummy; 

    // Use ClassInitialize to run code before running the first test in the class 
    [ClassInitialize] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     _cryptoDummy = new CryptoDummy(); 
    } 

    [TestMethod] 
    public void Encrypt_should_return_ciphered_64string_when_passing_a_plaintext_value() 
    { 
     const string PLAINTEXT_VALUE = "[email protected]"; 

     string cipheredString = _cryptoDummy.Encrypt(PLAINTEXT_VALUE); 

     Assert.IsTrue(cipheredString != PLAINTEXT_VALUE); 
    } 

    [TestMethod] 
    public void Decrypt_should_return_plaintext_when_passing_a_ciphered_value() 
    { 
     const string PLAINTEXT_VALUE = "[email protected]"; 

     string cipheredString = _cryptoDummy.Encrypt(PLAINTEXT_VALUE); 

     string plaintextString = _cryptoDummy.Decrypt(cipheredString); 

     Assert.IsTrue(plaintextString == PLAINTEXT_VALUE); 
    } 
} 

ありがとうございます。

+0

ユニットテストパターン[Here](http://www.codeproject.com/KB/architecture/autp5.aspx)のMarc Clifton(私のお気に入りの1つ)の記事 –

+0

ありがとう、私はすでに読んでいますそれはずっと前に単体テストの芸術の本を購入しました。 ;) – LavaSeven

答えて

3

別のテストに応じて1つのテストを行うべきではありません。これを行う最善の方法は、暗号化されたテキストをどこかに出力して保存することです。その後、復号化テキストテストでは、暗号化されたテキストから始め、正しく復号化することができます。同じ暗号化キー(テスト用にはうまくいきます)を使用すると、暗号化された文字列は常に同じになります。したがって、次のような単位に2番目のユニットテストを変更してください。

[TestMethod] 
public void Decrypt_should_return_plaintext_when_passing_a_ciphered_value() 
{ 

    const string PLAINTEXT_VALUE = "[email protected]"; 

    string cipheredString = "sjkalsdfjasdljs"; // ciphered value captured 

    string plaintextString = _cryptoDummy.Decrypt(cipheredString); 

    Assert.IsTrue(plaintextString == PLAINTEXT_VALUE); 
} 
+0

この問題は、cipheredStringが無効であるため、常に失敗することがあります。 – LavaSeven

+0

同じ入力に対して毎回アルゴリズムの結果が異なるため、定数を持つことさえできません。 – LavaSeven

+0

毎回別の暗号化キーを使用しない限り、これはどのように可能ですか?テストで毎回同じキーを使用することをお勧めするたびに別のキーを使用する場合は、定数を使用して暗号化されたデータを保存することができます –

1

これは私にとっては奇妙なことです。ユニットテストの私の意見は、ユニットテストは、提供されたデータの明確なセットで一つの特別な状況をテストするということです。 1つのテストが別のテストの結果に依存する場合、結果は確定的ではありません。 2番目のことは、テストが実行される順序を確かめることができないということです!

+0

それは私が求めていることではありません。 – LavaSeven

+0

私のテストは完全に分離されています。同じテストメソッドで複数のメソッドを呼び出すべきではないという前提があります。 – LavaSeven

1

私はあなたが1つのテストにつき1つのアサーションしか持つことができないと言うほど宗教的ではありません。たとえば、テストする結果に何らかの種類のツリー構造が含まれている場合は、ツリー内のすべてのステージが正しく、複数のアサートにつながるthousがすべてのステップで書き込む意味がないと主張する必要があります単一のテスト。

また、あなたの最後のテストが他のテストに依存していることがわかりません。単にテスト対象のユニットを2回呼び出すだけで、データを暗号化して解読する方法に本当に関心がありません。あなたが興味を持っているのは、それが機能するということだけです。そのような種類のテストでは、あなたのテストは絶対に大丈夫です。

復号化と暗号化に使用するアルゴリズムをテストする必要がある場合は、2つのテストを行い、その結果をあらかじめ定義された定数と比較して、誰もアルゴリズムを変更しないようにする必要があります。

+0

ありがとう、それは私が経験しているものに本当に近いです。 – LavaSeven

+0

これまでのところ、1つのテストガイドラインが実際に私のために働いています。私が問題を抱えている唯一の点は、あなたがすでに明らかにした同じテストの複数のコールです。 – LavaSeven

関連する問題