我总是试图坚持每次测试一个断言,但有时候我会遇到麻烦。
例如。
说我写了一个加密和解密字符串的加密类。
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 = "anonymous@provider.com";
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 = "anonymous@provider.com";
string cipheredString = _cryptoDummy.Encrypt(PLAINTEXT_VALUE);
string plaintextString = _cryptoDummy.Decrypt(cipheredString);
Assert.IsTrue(plaintextString == PLAINTEXT_VALUE);
}
}
提前谢谢。
答案 0 :(得分:3)
你不应该依赖另一个测试。执行此操作的最佳方法是在某处输出加密文本并保存。然后在解密文本测试中,您可以从加密文本开始,并测试您是否正确解密。如果使用相同的加密密钥(适用于测试),加密的字符串将始终相同。所以将你的第二次单元测试更改为:
[TestMethod]
public void Decrypt_should_return_plaintext_when_passing_a_ciphered_value()
{
const string PLAINTEXT_VALUE = "anonymous@provider.com";
string cipheredString = "sjkalsdfjasdljs"; // ciphered value captured
string plaintextString = _cryptoDummy.Decrypt(cipheredString);
Assert.IsTrue(plaintextString == PLAINTEXT_VALUE);
}
答案 1 :(得分:1)
这听起来很奇怪。我对单元测试的看法是,单元测试将测试一个特殊情况,并提供一组明确的数据。如果一个测试取决于另一个测试的结果,则结果不是确定性的。第二件事是,您无法确定测试执行的顺序!
答案 2 :(得分:1)
我不是那么虔诚地说你每次测试只能有一个断言。如果您的测试结果例如包含某种树结构,那么您必须断言树中的每个阶段都是正确的,导致多个断言,导致它(在我看来)没有意义为每一步写入一次测试。
同样在您给出的示例中,我看不出您的上一次测试取决于任何其他测试。它只是简单地调用被测单元两次,实际上你对它如何加密和解密数据并不感兴趣。你感兴趣的是,它是有效的。所以对于那种测试你的测试绝对没问题。
如果您需要测试用于解密和加密的算法,则必须进行两次测试,并将结果与一些预定义的常量进行比较,以确保没有人会更改所使用的算法。