0

我是 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!

4

4 回答 4

1

一个使用NUnit. 在这里,我正在测试当我0作为参数传递时,什么都不会生成(也许你应该抛出一个Exception?)

[TextFixture]
public class Tests {

    [Test]
    public void Test_Length0_ReturnsNothing() {
        string result = Generate(0);

        Assert.IsTrue(string.IsNullOrEmpty(result));
    }
}

然后您可以编写类似的测试(例如,确保它包含您想要的字符等)。

于 2013-02-21T08:29:15.597 回答
1

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

Visual Studio 有一个项目模板。还有其他工具,如 NUnit oderXUnit 用于 C# 中的测试

有一个很棒的复数课程

和 Bob 叔叔的网络广播,他在其中演示了测试驱动开发http://cleancoders.com/codecast/clean-code-episode-6-part-1/show

另请参阅msdn 上的“使用单元测试验证代码”

于 2013-02-21T08:30:59.250 回答
1

单元测试有很多细微差别。我建议您阅读有关单元测试的书“单元测试的艺术:.Net 中的示例”。

在单元测试中描述了很多技术和方法。您还可以在此处找到许多示例。

于 2013-02-21T08:42:42.663 回答
0
var amountOfCharacters = Int32.MaxValue;
var generator = new PasswordGenerator();
var target = generator.Generate(amountOfCharacters);

您正在指定密码应包含的字符数为 2,147,483,647 个字符...

chars.Length

您的数组中只有 74 个可能的值。

毫无疑问,它会超时,因为循环需要更长的时间来迭代 22 亿次试图找到数组中的最后几个值。

for (int i = 0; i < length; i++)

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

于 2013-02-21T09:28:45.287 回答