C# 使用随机生成的测试输入进行测试

C# 使用随机生成的测试输入进行测试,c#,testing,C#,Testing,我创建了一个生成随机数的函数。我计划使用这些随机数作为程序的输入,以测试不同的输入 我怎样才能做到这一点 这是我想测试的程序 public void Debit(double amount) { if (m_frozen) { throw new Exception("Account frozen"); } if (amount > m_balance) { throw new ArgumentOutOfRangeE

我创建了一个生成随机数的函数。我计划使用这些随机数作为程序的输入,以测试不同的输入

我怎样才能做到这一点

这是我想测试的程序

public void Debit(double amount)
{
    if (m_frozen)
    {
        throw new Exception("Account frozen");
    }

    if (amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount");
    }

    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount");
    }

    m_balance += amount;
}
公共作废借方(双倍金额)
{
如果(m_冻结)
{
抛出新异常(“账户冻结”);
}
如果(金额>m_余额)
{
抛出新ArgumentOutOfRangeException(“金额”);
}
如果(金额<0)
{
抛出新ArgumentOutOfRangeException(“金额”);
}
m_余额+=金额;
}
这是生成随机数的函数:

using System;
namespace Csharp.RandomExample
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i <= 100; i++)
            {
                Console.WriteLine(GenerateRandomNumber());
            }

            Console.ReadLine();
        }

        static int GenerateRandomNumber()
        {
            Random randomNumber = new Random();
            return randomNumber.Next();
        }
    }
}
使用系统;
命名空间Csharp.random示例
{
班级计划
{
静态void Main(字符串[]参数)
{

对于(int i=0;i如果我理解正确,只需将GenerateRandomNumber()方法的返回值传递给Debit()方法


for(int i=0;i问题在于,您正在
GenerateRandomNumber
中创建一个新的
Random
实例,该实例基于系统时间进行播种,并且它使用的值仅每隔几毫秒更新一次。您每几毫秒请求一个以上的值


您应该创建一个
Random
的实例,然后对该实例重复调用
Next
。在您的情况下,您可以创建一个
private static Random number=new Random()
就在方法之前,它会解决这个问题。

为测试创建随机输入并不是增加代码覆盖率的好方法。事实上,在任何单元测试中使用随机值都不是好的做法,但可能有些与线程有关

在您的情况下,只需几个简单的测试就可以实现100%的代码覆盖率

  • 账户冻结(余额和金额无关紧要)
  • 金额>余额
  • 金额=余额(边缘案例)
  • 金额<余额
  • 金额=0(边缘情况)
  • 数量<0

  • 如果你使用随机输入,你永远不能保证你测试了所有的路径。

    这是一个问题。但问题是他如何使用随机数来测试他的类
    借记卡
    代码,而你现在还没有解决这个问题。我不知道如何用两个变量来处理随机数金额和余额。我需要代码因此,我会使用显式种子。如果测试显示错误,您应该能够重现其行为。如果您每次使用新的随机数,并且错误每百万分之一次出现一次,那么您就有问题了。@OlivierJacot Descombes该问题也可以通过记录种子来解决。如果您使用硬编码值,则每次运行大部分程序都有相同的输出。这对于测试来说很好,但对于生产应用程序来说往往很差。@Servy。记录种子也是一个很好的解决方案。这段代码被认为只用于测试。我认为客户不会喜欢随机借记。你是指单元测试还是某种自动测试?如果是,你怎么能验证结果从随机输入?我应该使用自动工具进行自动测试。但是每次我测试我的方法时,结果都是60,70%的代码覆盖率。有人建议我使用这种随机方法,它将创建随机值作为我的方法的输入。使用这种随机方法,我希望有更大的代码覆盖率。你能帮助我如何通过r解决这个问题吗andom方法???感谢你的写作,我仍然无法解决我的问题。这对你有效吗?我知道你的测试将实现100%的代码覆盖率。但我必须使用某种随机方法,为方法生成输入。如果你有一些想法,请帮我解决真正的问题。你曾经使用随机方法创建测试的输入?不,我没有在测试中使用随机输入,因为它没有意义。
     for (int i = 0; i <= 100; i++)
     {
        Debit((double)GenerateRandomNumber());
     }
    
    for (int i = 0; i <= 100; i++)
    {
         int testNumber = GenerateRandomNumber();
         m_Amount = m_Balance = testNumber;
         Debit(doubleValueYouWantToTest);
    }