Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试生成不同字符串的类_C#_Unit Testing - Fatal编程技术网

C# 单元测试生成不同字符串的类

C# 单元测试生成不同字符串的类,c#,unit-testing,C#,Unit Testing,我正在尝试为生成不同字符串的类编写单元测试。我最初的反应是: public void GeneratedStringsShouldBeDistinct() { UniqueStringCreator stringCreator = new UniqueStringCreator(); HashSet<string> generatedStrings = new HashSet<string>(); string str; for (int

我正在尝试为生成不同字符串的类编写单元测试。我最初的反应是:

public void GeneratedStringsShouldBeDistinct()
{
    UniqueStringCreator stringCreator = new UniqueStringCreator();
    HashSet<string> generatedStrings = new HashSet<string>();
    string str;

    for (int i = 0; i < 10000; i++)
    {
        str = stringCreator.GetNext();
        if (!generatedStrings.Add(str))
        {
            Assert.Fail("Generated {0} twice", str);
        }
    }
}
public void generatedStringsShouldbedintinct()
{
UniqueStringCreator stringCreator=新的UniqueStringCreator();
HashSet generatedStrings=新HashSet();
字符串str;
对于(int i=0;i<10000;i++)
{
str=stringCreator.GetNext();
如果(!generatedStrings.Add(str))
{
Assert.Fail(“生成{0}两次”,str);
}
}
}
我喜欢这种方法,因为我知道底层算法没有使用任何随机性,所以我不会陷入这样的境地:它可能会失败一次,但下一次会成功——但这可能会被未来的某个人替换掉。OTOH,任何随机算法的测试都会导致这种类型的测试不一致,那么为什么不这样做呢

我是否应该拿出两个元素并检查其差异性(使用0/1/Many原理)


还有其他意见或建议吗?

我会继续使用你的方法;这可能是最可靠的选择

顺便说一下,您不需要
if
语句:

Assert.IsTrue(generatedStrings.Add(str), "Generated {0} twice", str);

如果我想测试依赖于随机输入的代码,我会尝试剔除随机生成(比如ITestableRandomGenerator),这样就可以模拟它进行测试。然后,您可以注入不同的“随机”序列,适当地触发测试代码的不同执行路径,并保证必要的代码覆盖率


您所展示的特定测试基本上是一个黑盒测试,因为您只是生成输出并验证它是否至少在N个周期内工作。由于代码没有任何输入,这是一个合理的测试,尽管如果您知道哪些不同的条件可能会影响您的算法,以便您可以测试这些特定的输入,这可能会更好。这可能意味着以某种方式使用不同的“种子”值运行算法,选择种子以便以不同的方式执行代码。

如果将算法传递到UniqueStringCreator的构造函数中,则可以在单元测试中使用存根对象来生成伪随机(可预测)数据。另请参见策略模式。

如果类中有某种检查,则始终可以将检查字符串与生成字符串的部分区分开来

然后模拟检查器,并在两个上下文中分别测试其行为;检查程序认为已创建字符串的一个,以及未创建字符串的一个

无论底层实现逻辑如何,您都可以找到类似的方法来划分职责

否则,我同意SLaks——坚持你所拥有的。进行测试的主要原因是代码易于更改,因此只要人们能够阅读并思考,“哦,这就是它所做的!”您可能就很好了