代码之家  ›  专栏  ›  技术社区  ›  OwenP

如何为需要复制被测代码的代码编写测试?

  •  3
  • OwenP  · 技术社区  · 16 年前

    GeometryGenerator PathGeometry ArcSegment 生成。我可以根据测试参数计算弧的属性,但这个计算与我试图测试的代码相同。这似乎会使测试无效;如果计算中有错误,测试中也会有错误,如果方法中的计算发生了变化,测试中可能也会发生变化。

    4 回复  |  直到 16 年前
        1
  •  4
  •   Bill the Lizard    16 年前

    我提出的唯一方法是手动计算测试用例的结果,并将这些值硬编码到测试中。这是一种可以接受的方法吗(如果我在实现之前编写测试,我会这样做)?

    是的,这是典型的。为了进行单元测试,您必须假设 公式 你用它来计算你的结果是正确的。这是你正在测试的软件实现。

    您预先计算了一些手工计算的结果,以确保您没有使用被测代码来生成测试数据(单元测试中的一个非常糟糕的错误)。只要确保你记录了你的测试用例,这样你就知道预期值代表什么以及它们来自哪里。

        2
  •  1
  •   Yes - that Jake.    16 年前

    手工计算和硬编码在生产代码中是不好的,但对于良好的单元测试至关重要。

    您通常希望为代码的每个“状态”编写一个测试。例如,我经常编写具有正输入、负输入和零输入的测试,以确保代码按预期工作。

        3
  •  1
  •   Drew Hoskins    16 年前

    通常,我会制作一个自己记录但硬编码的神奇数字,比如

    const int expected结果=2*4/some常量;//也许是一条评论。

    测试的读者可以推断出值是什么,或者您可以在必要时添加额外的注释。

        4
  •  0
  •   matt b    16 年前

    “单元测试”实际上应该只是测试单个单元。因此,理想情况下,您应该为您的 GeometryGenerator ,另一个给你 PathGeometry 类,第三个为你 ArcSegment 等等。

    通过分别测试每个单元,您可以对它们在使用给定的输入集对其调用给定操作时的行为(如何 几何生成器 当字段处于 ArcSegment 设置为1,与相同字段设置为0时的行为等)。

    如果你的单元测试开始看起来像是在复制现有代码来测试某个功能,那么恐怕你做的单元测试是错误的,而且有一个更简单、更有效的解决方案适合你。