关于如何对这种“大”(不是那么多!)方法进行单元测试的问题

时间:2010-12-23 03:00:15

标签: unit-testing testing

所以我有一个我想要测试的这个长期的方法。我可能会打破其他一些4-5方法,但我不想公开这些方法(虽然我可能,但如果可能的话,我想远离它们。进入包保护/内部):

如果我的数学没有错误,要测试它,我需要8次测试。用较小的方法划分它不会让我不得不进行更少的单元测试,是吗? 除了可见性问题之外,我在创建更小的方法(用于测试)时看到的一个大问题是需要向这些小方法传递大量参数。

虽然最初编写此代码的是我,但我仍然觉得很难理解。 所以我的问题是......如何测试这个?!?你会怎么做?我应该以任何方式对其进行重组吗?

    public Genoma GenerateOffspring(Genoma genoma1, Genoma genoma2) {
        if (genoma1.NumberOfGenes != genoma2.NumberOfGenes) throw new ArgumentException("Both individuals must have the same size!");
        if (genoma1.NumberOfGenes == 0 || genoma2.NumberOfGenes == 0) throw new ArgumentException("0-sized genomas not allowed!");

        if (genoma1.NumberOfGenes == 1) {
            if (numberGenerator.GenerateInteger(0, 2) == 0) {
                return genoma1;
            } else {
                return genoma2;
            }
        }

        int cutPoint = numberGenerator.GenerateInteger(1, genoma1.NumberOfGenes);

        Genoma parent1;
        Genoma parent2;

        if (numberGenerator.GenerateBool()) {
            parent1 = genoma1;
            parent2 = genoma2;
        } else {
            parent1 = genoma2;
            parent2 = genoma1;
        }

        Genoma offspring = parent1.Clone();

        if (numberGenerator.GenerateBool()) {
            for (int i = 0; i < cutPoint; ++i) {
                offspring.SetGeneAt(i, parent2.GetGeneAt(i));
            }
        } else {
            for (int i = cutPoint; i < offspring.NumberOfGenes; ++i) {
                offspring.SetGeneAt(i, parent2.GetGeneAt(i));
            }
        }

        return offspring;
    }

由于

3 个答案:

答案 0 :(得分:1)

我说这个没有简单的方法。您似乎随机生成了一些值然后决定如何设置实例变量,因此像真值表这样的东西基本上可以帮助您,以便检查您正在设置的变量的所有可能值。另外,我会在顶部测试if语句,以确保在继续执行其余操作之前满足这些条件。现在有办法轻松测试,只是彻底。

答案 1 :(得分:1)

要记住的主要事情是,当你开始测试时,你将运行所有测试,但对于给定的测试,如果它在某个时刻失败了一个断言,它将停止,这意味着它之后的内容将不会进行测试,因为它被认为需要已经没有正确断言的内容。

将它分成更小的方法的好处是你最终会得到更多可以独立测试的东西,但是你提到的论据的增加表明它不是一个“自然”的事情,所以你应该把它全部保存在同一个测试中,因为按照你的说法,你将整个函数视为一个单元本身,因此,一个单元测试应该测试该单元。

另外,我认为参数的增加也会使你的代码变得不那么漂亮,效率也会降低。

我希望有所帮助。

答案 2 :(得分:1)

略过代码,至少应测试以下条件

  • genoma1.NumberofGenes = genoma2.NumberOfGenes
  • genoma1.NumberofGenes&lt;&gt; genoma2.NumberOfGenes
  • genoma1.NumberofGenes = -1
  • genoma1.NumberofGenes = 0
  • genoma1.NumberofGenes = 1
  • genoma2.NumberofGenes = -1
  • genoma2.NumberofGenes = 0
  • genoma2.NumberofGenes = 1
  • genoma1.NumberOfGenes = HighBound - 1
  • genoma1.NumberOfGenes = HighBound(Max Integer?)
  • genoma1.NumberOfGenes = HighBound + 1
  • genoma2.NumberOfGenes = HighBound - 1
  • genoma2.NumberOfGenes = HighBound(Max Integer?)
  • genoma2.NumberOfGenes = HighBound + 1

您的测试工作可以通过模拟numberGenerator对象并使其返回固定值而大大受益。
这将为您提供以下附加条件进行测试

  • numberGenerator.GenerateInteger = LowBound - 1
  • numberGenerator.GenerateInteger = LowBound
  • numberGenerator.GenerateInteger = LowBound + 1
  • numberGenerator.GenerateInteger = HighBound - 1
  • numberGenerator.GenerateInteger = HighBound
  • numberGenerator.GenerateInteger = HighBound + 1
  • numberGenerator.Generate = True
  • numberGenerator.GenerateBool = False

使用给定的intputs测试所有可能的组合调用432个测试用程序 (6.6.6.2)

使用pairwise testgeneration工具可将此功能减少到39个测试用例。

当你的所有测试都通过时,你应该运行一个覆盖率分析器来验证你没有错过编码路径。每条路径至少应该执行一次。

  • 到目前为止,您已经删除了大部分错误的代码。
  • 到目前为止,您的代码很可能仍然包含一些错误。 (伤心但真实)。

PICT模型

genoma1_NumberOfGenes: -1, 0, 1, HighboundMinOne, HighBound, HighBoundPlusOne
genoma2_NumberOfGenes: -1, 0, 1, HighboundMinOne, HighBound, HighBoundPlusOne

numberGenerator.GenerateInteger: LowBoundMinOne, LowBound, LowBoundPlusOne, HighBoundMinOne, HighBound, HighBoundPlusOne
numberGenerator.GenerateBool: True, False

PICT生成的测试用例参数

genoma1_NumberOfGenes    genoma2_NumberOfGenes   numberGenerator.GenerateInteger     numberGenerator.GenerateBool
HighBoundPlusOne         -1                      HighBoundPlusOne                    True
HighBound                1                       HighBoundPlusOne                    False
-1                       HighBoundPlusOne        HighBound                           True
HighBoundPlusOne         0                       LowBound                            False
0                        HighBoundPlusOne        HighBoundPlusOne                    False
0                        1                       HighBoundMinOne                     True
-1                       0                       HighBoundMinOne                     False
HighBound                0                       LowBoundPlusOne                     True
1                        HighboundMinOne         LowBound                            True
HighboundMinOne          HighBound               LowBoundMinOne                      False
-1                       HighBound               HighBoundPlusOne                    True
1                        0                       HighBound                           False
HighBoundPlusOne         HighboundMinOne         HighBoundMinOne                     False
HighboundMinOne          HighboundMinOne         LowBoundMinOne                      True
HighBound                -1                      LowBoundMinOne                      False
HighBoundPlusOne         1                       LowBoundMinOne                      True
HighBoundPlusOne         HighBound               LowBoundPlusOne                     False
1                        -1                      HighBoundMinOne                     True
HighBound                HighBound               HighBoundMinOne                     False
1                        HighboundMinOne         HighBoundPlusOne                    True
HighBound                HighboundMinOne         HighBound                           False
1                        1                       LowBoundPlusOne                     False
HighBoundPlusOne         -1                      HighBound                           True
0                        0                       LowBoundMinOne                      True
1                        HighBound               LowBound                            True
0                        HighBound               HighBound                           False
HighBound                HighBoundPlusOne        LowBound                            True
-1                       -1                      LowBoundMinOne                      True
0                        HighboundMinOne         LowBoundPlusOne                     True
HighBoundPlusOne         HighBoundPlusOne        LowBoundPlusOne                     False
HighboundMinOne          1                       HighBound                           True
-1                       1                       LowBound                            True
HighboundMinOne          -1                      LowBound                            True
HighboundMinOne          -1                      LowBoundPlusOne                     False
-1                       HighboundMinOne         LowBoundPlusOne                     False
HighboundMinOne          HighBoundPlusOne        HighBoundMinOne                     False
HighboundMinOne          0                       HighBoundPlusOne                    False
1                        HighBoundPlusOne        LowBoundMinOne                      False
0                        -1                      LowBound                            False
相关问题