2011-10-21 106 views
0

我總是試圖堅持每個測試的一個斷言,但有時候我會遇到麻煩。輸出是另一個輸入的單元測試方法

例如。

假設我編寫了一個加密和解密字符串的加密類。

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

    public string Encrypt(string value) 
    { 
    } 
} 

我將如何創建我的單元測試,如果解密後的加密輸出依賴?

我的大部分測試(如果不是全部到目前爲止)都是由每個測試的一個方法調用和每個測試的一個斷言組成的。

因此,對於每次測試多次調用並聲明最後一次調用的方法所產生的最終結果是否正確?

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

有一篇由Marc Clifton撰寫的文章(我最喜歡的一篇)關於單元測試模式[Here](http://www.codeproject.com/KB/architecture/autp5.aspx) –

+0

謝謝,我已閱讀並且很久以前購買了這本書的單元測試藝術。 ;) – LavaSeven

回答

3

你不應該有一個測試取決於另一個。做到這一點的最佳方式是在某處輸出加密文本並保存。然後在解密文本測試中,您可以從加密文本開始並測試您是否正確解密。如果使用相同的加密密鑰(這對測試來說很好),加密的字符串將始終相同。所以改變你的第二個單元測試是這樣的:

[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

這聽起來很奇怪。我對單元測試的看法是,單元測試將用一組確定的數據來測試一個特定的情況。如果一次測試取決於另一次測試的結果,則結果不是確定性的。第二件事,就是你不能執行測試的命令!

+0

這不是我要問的。 – LavaSeven

+0

我的測試是完全孤立的,我的假設是你不應該在同一測試方法中調用多個方法。 – LavaSeven

1

我不是那麼虔誠地說你每次測試只能有一個斷言。如果你的測試結果包含某種樹結構,那麼你必須斷言樹中的每個階段都是正確的,這會導致多重斷言,導致它在我的眼中沒有意義爲每一步寫單一測試。

同樣在你給出的例子中,我看不到你最後的測試依賴於任何其他測試。它只是簡單地調用被測試單元兩次,事實上你並不真正關心它如何加密和解密數據。你感興趣的是它的工作原理。所以對於那種測試你的測試絕對沒問題。

如果您需要測試用於解密和加密的算法,則必須進行兩次測試,並將結果與​​一些預定義的常量進行比較,以確保沒有人會更改所用的算法。

+0

謝謝,這真的很接近我所經歷的。 – LavaSeven

+0

到目前爲止,每個測試指南中的一個斷言對我來說確實很有用,我唯一遇到的問題是您在已經闡明的同一個測試中的多個調用,現在它更有意義。 – LavaSeven