我不认为这是特定于一种语言或框架的,但我使用的是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-23 01:41:54
我认为这个问题有三个不同的方面需要测试。
第一个问题:我的算法是正确的吗?也就是说,给定一个功能正常的随机数生成器,它是否会生成在范围内随机分布的日期?
第二个问题:算法是否正确处理边缘情况?也就是说,当随机数生成器产生最高或最低允许值时,是否有任何东西中断?
第三个问题:我的算法实现起作用了吗?也就是说,给定一个已知的伪随机输入列表,它是否会生成预期的伪随机日期列表?
前两件事不是我会构建到单元测试套件中的东西。它们是我在设计系统时要证明的东西。我可能会像daniel.rikowski建议的那样,通过编写一个生成无数日期并执行卡方测试的测试工具来做到这一点。我还会确保这个测试工具不会终止,直到它处理了这两种边缘情况(假设我的随机数范围足够小,我可以逃脱惩罚)。我会将这一点记录下来,这样任何试图改进算法的人都会知道这是一个突破性的变化。
最后一个是我要做单元测试的东西。我需要知道代码中没有任何东西破坏了它对这个算法的实现。当这种情况发生时,我得到的第一个迹象是测试将失败。然后,我将返回到代码,并发现其他人认为他们正在修复某些东西,但却破坏了它。如果有人修改了算法,也会由他们来修改这个测试。
https://stackoverflow.com/questions/311807
复制相似问题