Unit testing 确定一个方法最实用的测试用例数量

Unit testing 确定一个方法最实用的测试用例数量,unit-testing,Unit Testing,假设您的业务层中有一个类的方法check(),该类对该类的实例执行一些验证。检查的形式是,如果该类的属性a具有特定值,则属性b需要具有特定的其他值(即a确定b)。例如,该方法可以在内部使用包含a和b的所有有效组合的映射: public bool check() { if (mapOfValidCombos.get(a)!=b) return false; return true; } 或者它可以在外部csv文件中查找它们,或者它可以由if语句列表组成: public

假设您的业务层中有一个类的方法check(),该类对该类的实例执行一些验证。检查的形式是,如果该类的属性a具有特定值,则属性b需要具有特定的其他值(即a确定b)。例如,该方法可以在内部使用包含a和b的所有有效组合的映射:

public bool check() {
   if (mapOfValidCombos.get(a)!=b)
        return false;
   return true;
}
或者它可以在外部csv文件中查找它们,或者它可以由if语句列表组成:

public bool check() {
    if (a==1) and (b!=5) then return false;
    if (a==2) and (b!=3) then return false;
    return true;
}
现在,如果您想对该方法进行单元测试。您应该实现哪些测试用例:

  • 您可以测试a和b的所有有效组合,也可以测试无效组合(假设a和b是可枚举类型)
  • 您只能为该方法的每个路径创建一个测试用例(例如,一个用于有效组合,一个用于无效组合)
方法2导致更少的单元测试用例(从而减少维护工作量)。但是,从业务角度(例如,有效组合的映射是否包含正确的值)实际测试方法是否正在进行正确检查的正确位置在哪里

如果您选择方法1,那么如果您将实现从let say Map base更改为If语句,那么您是否应该添加额外的测试用例,因为您获得了更多的方法执行路径

编辑:我更多地考虑这些测试将为我们的测试套件增加什么价值。假设使用check()方法的基于映射的实现,那么将映射的内容复制到测试用例中有什么用呢。关于hidro提示使用辅助测试。他们仍然需要从某个地方获取参数(而且很可能没有超出check()的实现),因此这些值会以某种方式重复。我一直在想,实际值的测试和检查方法的完整性是由QA或业务部门在验收测试中完成的,作为我的单元测试,只检查代码的执行路径,而不一定检查所有允许值的组合。有什么想法吗?

我的经验法则是:

  • 如果可能,尝试每个测试方法只使用一个
    断言
    。如果要同时计算多个
    assert
    s,则仅使用它们
  • 使用单个
    assert
    编写测试,直到覆盖所有执行路径,这意味着多个测试可能共享相同的
    assert
    输出,但具有不同的输入值,所有这些都会导致相同的期望
现在,如果您开始在测试类中看到大量重复,那么不必担心

  • “参数化”您的测试。我不确定您使用的是哪种语言,但其中许多语言都支持参数化测试,例如,如果给定了测试规范的“表”,则执行相同的测试代码(相同的
    断言
  • 避免编写实用程序方法或类来重用测试代码,从长远来看,这更像是反模式的

我们使用的是Cpp/Cpp单元。它不支持开箱即用的参数化,但有可能扩展它来完成,请参见:有关可参数化宏的示例实现,请参见我的编辑我的一位老板曾经问我们可以做的最小测试量是多少。我的回答是:“没有”。只是在这里分享,而不是争论。在我的公司,我们至少有两个级别的测试。单元测试是工程师对代码进行单元测试,确保单元测试覆盖所有的执行路径(他们是唯一控制这些执行路径的人),然后由QA进行验收测试,测试指标将覆盖尽可能多的业务特性(可能不会直接映射到执行路径,因为有些情况很少发生).@Raedwald::-)不错,我正在寻找合适的测试数量,不过…@hidro对我来说这听起来很合理,因此如果我重构代码以减少执行路径,我还可以减少维护的测试数量。在我的重构导致更多执行路径的罕见情况下,我必须添加更多的测试用例。