C#中的单元测试如何
本文关键字:单元测试 | 更新日期: 2023-09-27 18:00:19
我是C#单元测试领域的新手。
我的Main.cs
中有一段代码
public static string Generate(int length)
{
char[] chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray();
string password = string.Empty;
Random random = new Random();
for (int i = 0; i < length; i++)
{
int x = random.Next(1, chars.Length);
if (!password.Contains(chars.GetValue(x).ToString()))
password += chars.GetValue(x);
else
i--;
}
return password;
}
现在我不知道如何用单元测试来测试这些代码,有人能给我举个例子吗?
编辑:
我做了一个测试代码
[TestMethod]
[Timeout(1000)]
public void RenderingPasswordShouldHaveMaximumSize()
{
var amountOfCharacters = Int32.MaxValue;
var generator = new PasswordGenerator();
var target = generator.Generate(amountOfCharacters);
// TODO
Assert.Fail("This method should throw an exception if you try to create a password with too many characters");
}
但它给了我以下错误:消息:测试"RenderingPasswordShouldHaveMaximumSize"超过了执行超时期。有人能帮我解决这个问题吗?需要最大大小为74!
单元测试的想法是把一些东西放在你的一个小方法中,并检查结果是否正确。
Visual Studio有一个项目模板。还有其他工具,如NUnit oderXUnit,用于C#中的测试
有一个伟大的多元化课程:
以及Bob叔叔的网络广播,他在其中演示了测试驱动的开发http://cleancoders.com/codecast/clean-code-episode-6-part-1/show
另请参阅msdn 上的"使用单元测试验证代码"
使用NUnit
的一个简单示例。在这里,我测试的是,当我将0
作为参数传递时,不会生成任何内容(也许你应该抛出Exception
?)
[TextFixture]
public class Tests {
[Test]
public void Test_Length0_ReturnsNothing() {
string result = Generate(0);
Assert.IsTrue(string.IsNullOrEmpty(result));
}
}
然后你可以编写类似的测试(例如,确保它包含你想要的字符等)。
单元测试中有很多细微差别。我建议你们读一本关于单元测试的书"单元测试的艺术:用.Net中的例子"
单元测试中描述了许多技术和方法。你也可以在这里找到很多例子。
var amountOfCharacters = Int32.MaxValue;
var generator = new PasswordGenerator();
var target = generator.Generate(amountOfCharacters);
您正在将密码应包含的字符数指定为2147483647个字符。。。
chars.Length
您的数组中只有74个可能的值。
毫无疑问,它会超时,因为循环需要更长的时间来迭代22亿次,试图找到数组中的最后几个值。
for (int i = 0; i < length; i++)
您的逻辑也会发生变化,因为您没有指定密码的长度,而是指定要执行的迭代次数。