我不认为这是特定于一种语言或框架的,但我使用的是xUnit.net和C#。
我有一个函数,它返回某个范围内的随机日期。我传入一个日期,返回日期始终在给定日期之前1到40年的范围内。
现在我想知道是否有一个好的方法来对它进行单元测试。最好的方法似乎是创建一个循环,让函数运行100次,并断言这100个结果中的每一个都在期望的范围内,这是我目前的方法。
我还意识到,除非我能够控制我的随机生成器,否则将不会有一个完美的解决方案(毕竟,结果是随机的),但我想知道,当您必须测试返回某个范围内随机结果的功能时,您采取了什么方法?
发布于 2008-11-22 21:48:02
除了测试函数是否返回所需范围内的日期外,还需要确保结果是均匀分布的。您所描述的测试将通过一个函数,该函数仅返回您发送的日期!
因此,除了多次调用函数并测试结果是否保持在所需的范围之外,我还会尝试评估分布,可能是将结果放入存储桶中,并在完成后检查存储桶是否具有大致相等的结果数量。您可能需要超过100次调用才能获得稳定的结果,但这听起来不像是一个昂贵的(运行时)函数,因此您可以轻松地运行它几次K次迭代。
我以前遇到过非均匀“随机”函数的问题..他们可能是一个真正的痛苦,这是值得测试的早期。
发布于 2008-11-22 21:54:58
模拟或伪造随机数生成器
做这样的事..。我没有编译它,所以可能有一些语法错误。
public interface IRandomGenerator
{
double Generate(double max);
}
public class SomethingThatUsesRandom
{
private readonly IRandomGenerator _generator;
private class DefaultRandom : IRandomGenerator
{
public double Generate(double max)
{
return (new Random()).Next(max);
}
}
public SomethingThatUsesRandom(IRandomGenerator generator)
{
_generator = generator;
}
public SomethingThatUsesRandom() : this(new DefaultRandom())
{}
public double MethodThatUsesRandom()
{
return _generator.Generate(40.0);
}
}
在您的测试中,只需伪造或模拟IRandomGenerator以返回罐装的内容。
发布于 2008-11-22 21:45:21
您不需要控制系统来使结果具有确定性。您的方法是正确的:确定函数输出的重要部分,并对其进行测试。在这种情况下,重要的是结果在40天的范围内,并且您正在测试这一点。同样重要的是,它并不总是返回相同的结果,所以也要对此进行测试。如果你想更有趣,你可以测试结果是否通过了某种随机性测试。
https://stackoverflow.com/questions/311807
复制相似问题