Практически все инструменты покрытия кода используют код для проверки того, какие части кода были выполнены.
Как определено в приведенной вами ссылке, C0 и C1 очень похожи с точки зрения человека, пишущего приборы. Разница лишь в том, где вы размещаете код. Я пойду дальше, чтобы предположить, что C1 даже проще, чем C0, потому что инструментарий происходит, скажем, на уровне абстрактного синтаксиса, где концы строк не имеют большого значения.
Другая причина, по которой я говорю, что C1 проще, заключается в том, что она имеет дело с синтаксическими сущностями, а не с лексическими сущностями: как бы вы работали:
if
c > 1 && c
< 10
then
blabla
end
Ну, просто мысль.
Что касается C2, я никогда не видел, чтобы это делалось на практике. Причина в том, что вы можете получить экспоненциальный взрыв:
if c1 then * else * end
if c2 then * else * end
...
if cn then * else * end
Для n строк кода вам потребуется 2 ^ n тестов. Кроме того, что вы делаете для петель? Как правило, вы абстрагируете их как простые операторы if (т.е. для каждого цикла, который вы проверяете, его тело было выполнено 0 раз для одного теста и, по крайней мере, один раз в другом тесте).
Я считаю, что выборка ПК является особенно ужасным способом выполнения покрытия кода, потому что вы можете пропустить некоторые операторы, потому что они выполняются слишком быстро: D То же самое касается нечеткой логики, которая используется для рассуждений о приближениях; обычно вы хотите, чтобы охват вашего кода был детерминированным.
Карты Карно используются для минимизации логических функций, и я не вижу никакой полезной ссылки с инструментами покрытия кода.
Кроме того, ваш вопрос иногда не очень ясен: хотите ли вы, чтобы методы обеспечивали лучшее покрытие кода, или вас интересует только реализация инструментов покрытия кода?