2011-10-21 74 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