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!

C#中的单元测试如何

单元测试的想法是把一些东西放在你的一个小方法中,并检查结果是否正确。

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++)

您的逻辑也会发生变化,因为您没有指定密码的长度,而是指定要执行的迭代次数。