单元测试方法的输出是另一个的输入
本文关键字:另一个 输入 输出 测试方法 单元 | 更新日期: 2023-09-27 18:11:50
我总是尝试在每个测试中坚持一个断言,但有时我在这样做时会遇到麻烦。
例如。
假设我写了一个加密和解密字符串的加密类。
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);
}
}
提前感谢。
您不应该让一个测试依赖于另一个测试。最好的方法是将加密文本输出到某个地方并保存。然后在解密文本测试中,你可以从一个加密的文本开始,并测试你正确地解密它。如果您使用相同的加密密钥(这对于测试是很好的),加密的字符串将始终是相同的。所以把你的第二个单元测试改成这样:
[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);
}
这听起来很奇怪。我对单元测试的看法是,单元测试将使用提供的一组确定的数据测试一种特殊情况。如果一个测试依赖于另一个测试的结果,则结果不是确定的。第二件事是,您不能保证测试执行的顺序!
我并不是说每个测试只能有一个断言。例如,如果要测试的结果包含某种树结构,则必须断言树中的每个阶段都是正确的,从而导致多个断言,因为(在我看来)为每个步骤编写单个测试是没有意义的。
同样在你给出的例子中,我看不出你的最后一个测试取决于任何其他测试。它只是调用被测单元两次,实际上您对它如何加密和解密数据并不感兴趣。所有你感兴趣的,是它是否有效。所以对于这种测试,你的测试是完全可以的。
如果你需要测试用于解密和加密的算法,你必须进行两次测试,并将结果与一些预定义的常量进行比较,以确保没有人会改变所使用的算法。