代码之家  ›  专栏  ›  技术社区  ›  Pablo Cabrera

Assert.Inconclusive的用法

  •  22
  • Pablo Cabrera  · 技术社区  · 7 年前

    我想知道应该如何使用Assert.Inconclusive()。

    如果我的单元测试因为测试目的以外的原因而即将失败,我将使用它。

    为Sum()编写单元测试很简单。然而,当我为Average()编写一个测试,并且Sum()失败时,Average()也可能失败。

    这是否被视为良好做法?断言。非结论性的目的是什么?还是我应该通过一个隔离框架来解决前面的例子?

    4 回复  |  直到 8 年前
        1
  •  25
  •   Igor Brejc    16 年前

    非决定性测试是您无法确定结果的测试。例如,如果您有一个使用某种外部资源(例如Internet连接)的测试,该怎么办。如果连接当前不可用,这并不意味着测试失败。另一方面,你不应该仅仅将它标记为成功,而不实际运行它。因此,您将其标记为不确定,这可以在测试报告中看到。

    对于尚未完成的测试,我使用MbUnit Explicit 属性

        2
  •  16
  •   tranmq    16 年前

    嗯,这就是我使用它的方式。从它的名字“不确定”,我想你可以用它来表示你的不确定状态,只要你记录下它的意思。

    但是,从您的 Average() 方法,我认为可能您的单元测试不够原子化,无法只覆盖一个“单元”,一个特定场景。有时,我为一个方法编写2或3个单元测试方法。或者你可以打破你的习惯 平均值() 平均值() 一个。


    约翰尼斯,

    这就是我将如何实现 Sum() 方法。

    public static class MyMath
    {
        private static void ValidateInput(ICollection<int> numbers)
        {
            if (numbers == null)
                throw new ArgumentNullException("numbers", "Null input.  Nothing to compute!");
            if (numbers.Count == 0)
                throw new ArgumentException("Input is empty.  Nothing to compute!");
        }
    
        public static int Sum(int[] numbers)
        {
            ValidateInput(numbers);
    
            var total = 0;
            foreach (var number in numbers)
                total += number;
    
            return total;
        }
    
        public static double Average(int[] numbers)
        {
            ValidateInput(numbers);
            return Sum(numbers) / numbers.Length;
        }
    }
    

    为了简单起见,我只是抛出 ArgumentException ValidateInput(ICollection<int>) 方法。您还可以检查溢出和抛出的可能性 OverflowException 验证输入(ICollection<int>)

    话虽如此,下面是我将如何测试 Average(int[])

    [TestMethod]
    public void AverageTest_GoodInput()
    {
        int[] numbers = {1, 2, 3};
        const double expected = 2.0;
        var actual = MyMath.Average(numbers);
        Assert.AreEqual(expected, actual);
    }
    
    [TestMethod]
    [ExpectedException(typeof(ArgumentNullException))]
    public void AverageTest_NullInput()
    {
        int[] numbers = null;
        MyMath.Average(numbers);
    }
    
    [TestMethod]
    [ExpectedException(typeof(ArgumentException))]
    public void AverageTest_EmptyInput()
    {
        var numbers = new int[0];
        MyMath.Average(numbers);
    }
    

    通过这些测试设置,我可以确定当所有测试都通过时,我的功能是正确的。嗯,除了溢出的情况。现在我可以回到过去了 验证输入(ICollection<int>) 方法添加逻辑以检查溢出,然后再添加一个测试以期望 对于导致溢出的输入类型抛出。或者,如果您想使用TDD,则按相反的顺序执行。

    我希望这有助于澄清这个想法。

        3
  •  9
  •   JaredPar    16 年前

    这样做的原因是,它提供了关于我需要测试的东西的文档,而不会过多地中断我的工作流程。它还可以在结果列表中快速筛选出测试失败。非决定性的失败意味着我没有破坏任何东西,我只需要编写更多的测试。

        4
  •  7
  •   DavidGiard    16 年前

    断言。非决定性表示:

    我还没有写测试;我只创建了测试方法

    -或-

    我的测试有一个依赖项,该依赖项不可用。例如

    List<Customer> custs = o.GetAllCustomers();
    if (custs.Count == 0)
    {
      Assert.Inconclusive("No customers to test");
      return;
    }
    
    推荐文章