100%单元测试代码覆盖率 - 如何通过'防御'编码实现?

时间:2017-05-22 14:43:09

标签: android unit-testing code-coverage

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

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

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

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

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

我可以在方法中添加注释,声明“此方法假定状态为活动”或其他内容,但这并未强制执行状态必须处于活动状态的合同。抛出异常和/或声明也可能是这里的可能性,但我不知道如何测试它以获得100%的代码覆盖率。

我完全明白,对于这样的情况,获得100%的代码覆盖率可能无关紧要 - 但不幸的是,获得的决定不是我的(至少现在)。 “老板”希望这样做,如果你问我,这对你来说是不合理的!

1 个答案:

答案 0 :(得分:1)

首先:不要过于挂掉100%的报道。您可以花费大量时间来覆盖数字,而无需为您的产品添加更多“质量”!

含义:如果100%的目标来自外部驱动程序,则可能值得退一步讨论严格的100%目标是否真的有帮助(我认为它没有,但更多的是意见)。

假设您希望获得100%的覆盖率,我看到只看到一个选项: 您启用测试A)将mState设置为除Active和B之外的其他内容,以便能够在不经过方法methodB()的情况下调用methodA()

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

如果mState不是字段,但是会被getter返回,那么可能可以使用Mockito间谍和部分模拟。