100% 的单元测试代码覆盖率 - 如何用 'defensive' 编码实现?

100% unit test code coverage - how to achieve with 'defensive' coding?

您将如何使用以下代码获得 100% 的代码覆盖率?

- (void)methodA {
    mState = Active;
    // do something ...
    methodB();
}

- (void)methodB {
    if (mState != Active) return;
    // do something else ...
}

我可以轻松测试do somethingdo something else部分,问题出在methodBif (mState != Active) return;行。由于 methodA 总是将状态设置为 Active,所以早期的 return 永远不会被执行。

我有早期的 return 代码,以防将来在其他地方调用 methodB。如果 mState 不是 Active,则代码没有执行意义,因此它或多或少是防御性编码。

我可以向方法添加注释,说明 "this method assumes the state is Active" 或其他内容,但这并不强制执行状态必须处于活动状态的合同。抛出异常 and/or 断言也可能在这里,但我再次不确定如何测试它以获得 100% 的代码覆盖率。

我完全理解,对于这样的情况,获得 100% 的代码覆盖率可能无关紧要——但不幸的是,获得 100% 的代码覆盖率不是我的决定(至少现在是这样)。 'bosses' 想要这样做,如果你问我,他们对此是不合理的!

首先:不要太执着于 100% 的覆盖率。您可以花费大量时间来达到 数量 ,而无需为您的产品添加更多 "quality"!

意思是:如果 100% 的目标来自外部驱动因素,可能值得退后一步讨论严格的 100% 目标是否真的有帮助(我认为它没有,但这更像是一种意见).

假设您想要 100% 的覆盖率,我只看到一个选项: 您启用测试以 A) 将 mState 设置为 Active 以外的其他内容和 B) 无需通过方法 methodA() 即可调用 methodB()

例如,为该字段设置 setter;并使 methodB() 至少受到包保护,以便单元测试可以调用该方法。但是你正在对你的生产代码进行 "test only" 更改 - 只是为了达到那个神奇的 100% 数字。

如果 mState 不是字段,但会由 getter 返回,它 可能 可以使用 Mockito 间谍和部分模拟这里。