unit-testing - 条件覆盖和单元测试
问题描述
在编写单元测试(使用junit)时,是否有必要分离测试方法以达到完整的条件覆盖?
以这个片段为例:
int foo(boolean a, boolean b, boolean c){
if(a && b && c)
return 1;
else return 0;
}
如果出现这种情况,为条件覆盖编写一种方法和不同的断言会更好吗?或者每种情况都有一种方法?
@Test
void conditionsTest(){
assertEqual(0, foo(true, false, false));
assertEqual(0, foo(true, true, false));
assertEqual(1, foo(true, true, true));
...
}
或者
@Test
void condition1Test(){
assertEqual(0, foo(true, false, false));
}
@Test
void condition2Test(){
assertEqual(0, foo(true, true, false));
}
@Test
void condition3Test(){
assertEqual(1, foo(true, true, true));
}
解决方案
虽然没有必要拆分测试,但这样做会更好:
多合一测试功能将在第一个失败的断言时中止执行。没有关于其他组合的信息。分开后,您将获得有关哪些组合完全失败的更详细信息。请注意,参数化测试将达到相同的效果。
从覆盖率的角度来看,一体化测试将在单个测试中积累覆盖率。无法分析每种条件组合的贡献。当使用更复杂的条件覆盖率指标(如MC/DC )时,这变得更加有价值。
诚然:第二个方面取决于您的覆盖工具提供的数据收集粒度。我们公司的工具Coco收集每个测试函数的覆盖率,但到目前为止只对 C、C++ 和 C# 这样做。您可能想要寻找 Java 代码的等效功能。
推荐阅读
- c++ - 如果父级没有没有参数的构造函数,我该如何制作子构造函数
- yarnpkg - 如何从纱线零安装包创建包包?
- github - Pycharm 的 Github 永久链接?
- python - 使用openCV保存图像时颜色错误
- google-apps-script - Google Vision API 偶尔返回 404 错误
- json - JSON查询未在Ansible playbook中返回值
- azure-devops - azure devops cli 查询工作时间
- variadic-templates - 我如何去获取可变参数并将它们转换/添加到向量中?+ 问题
- python - 在 Python 中使用正则表达式时,如何考虑可能为空的组?
- emv - 有没有办法知道使用 EMV 的卡中有多少应用程序?