<100% кодовое покрытие плохо, но это не значит, что 100% кодовое покрытие хорошо. Это необходимое, но недостаточное условие, и к нему следует относиться. </p>
Также обратите внимание, что существует разница между покрытием кода и покрытием пути:
void bar(Foo f) {
if (f.isGreen()) accountForGreenness();
if (f.isBig()) accountForBigness();
finishBar(f);
}
Если вы передадите большой, зеленый Foo в этот код в качестве тестового примера, вы получите 100% покрытие кода. Но, как вы знаете, большой красный Foo может привести к сбою системы, потому что accountForBigness неверно предполагает, что какой-то указатель не равен NULL, что только делает NULL ненулевым с помощью accountForGreenness. У вас не было 100% покрытия пути, потому что вы не покрыли путь, который пропускает вызов accountForGreenness, но не призыв к accountForBigness.
Также возможно получить 100% покрытие филиала без 100% покрытия пути. В приведенном выше коде один вызов с большим зеленым Foo, а другой с маленьким красным Foo дает первый, но все еще не улавливает большой красный баг.
Не то, чтобы этот пример был лучшим OO-проектом, но редко можно увидеть код, в котором покрытие кода подразумевает покрытие пути. И даже если это подразумевает, что в вашем коде это не означает, что весь код или все пути в библиотеке или системе охвачены, что ваша программа могла бы использовать. В принципе, для этого вам потребуется 100% охват всех возможных состояний вашей программы (и, следовательно, убедитесь, что, например, ни в коем случае вы не вызываете с недопустимыми параметрами, приводящими к обнаружению ошибок в коде библиотеки или системы, которые не были достигнуты иначе ), что, как правило, невозможно.