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 something
和do something else
部分,问题出在methodB
的if (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 间谍和部分模拟这里。
您将如何使用以下代码获得 100% 的代码覆盖率?
- (void)methodA {
mState = Active;
// do something ...
methodB();
}
- (void)methodB {
if (mState != Active) return;
// do something else ...
}
我可以轻松测试do something
和do something else
部分,问题出在methodB
的if (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 间谍和部分模拟这里。