首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用返回随机结果的函数进行单元测试

使用返回随机结果的函数进行单元测试
EN

Stack Overflow用户
提问于 2008-11-22 21:40:17
回答 9查看 29.6K关注 0票数 72

我不认为这是特定于一种语言或框架的,但我使用的是xUnit.net和C#。

我有一个函数,它返回某个范围内的随机日期。我传入一个日期,返回日期始终在给定日期之前1到40年的范围内。

现在我想知道是否有一个好的方法来对它进行单元测试。最好的方法似乎是创建一个循环,让函数运行100次,并断言这100个结果中的每一个都在期望的范围内,这是我目前的方法。

我还意识到,除非我能够控制我的随机生成器,否则将不会有一个完美的解决方案(毕竟,结果是随机的),但我想知道,当您必须测试返回某个范围内随机结果的功能时,您采取了什么方法?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2008-11-22 21:48:02

除了测试函数是否返回所需范围内的日期外,还需要确保结果是均匀分布的。您所描述的测试将通过一个函数,该函数仅返回您发送的日期!

因此,除了多次调用函数并测试结果是否保持在所需的范围之外,我还会尝试评估分布,可能是将结果放入存储桶中,并在完成后检查存储桶是否具有大致相等的结果数量。您可能需要超过100次调用才能获得稳定的结果,但这听起来不像是一个昂贵的(运行时)函数,因此您可以轻松地运行它几次K次迭代。

我以前遇到过非均匀“随机”函数的问题..他们可能是一个真正的痛苦,这是值得测试的早期。

票数 35
EN

Stack Overflow用户

发布于 2008-11-22 21:54:58

模拟或伪造随机数生成器

做这样的事..。我没有编译它,所以可能有一些语法错误。

代码语言:javascript
复制
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以返回罐装的内容。

票数 58
EN

Stack Overflow用户

发布于 2008-11-22 21:45:21

您不需要控制系统来使结果具有确定性。您的方法是正确的:确定函数输出的重要部分,并对其进行测试。在这种情况下,重要的是结果在40天的范围内,并且您正在测试这一点。同样重要的是,它并不总是返回相同的结果,所以也要对此进行测试。如果你想更有趣,你可以测试结果是否通过了某种随机性测试。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/311807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档