Более сильный критерий покрытия логики программы известен как покрытие решений, или покрытие переходов.
Согласно данному критерию должно быть записано достаточное число тестов, такое, что каждое решение на этих тестах примет значение истина и ложь, по крайней мере, один раз. Иными словами, каждое направление перехода должно быть реализовано, по крайней мере, один раз. Примерами операторов перехода, или решений, являются операторы DO (или PERFORM UNTIL в Коболе, REPEAT UNTIL, WHILE в Паскале, WHILE и DO WHILE в Си), IF, многовыходные операторы GO TO.
Можно показать, что покрытие решений обычно удовлетворяет критерию покрытия операторов. Поскольку каждый оператор лежит на некотором пути, исходящем либо из оператора перехода, либо из точки входа программы, при выполнении каждого направления перехода каждый оператор должен быть выполнен. Однако существует, по крайней мере, два исключения. Первое — патологическая ситуация, когда программа не имеет решений. Второе встречается в программах или подпрограммах с несколькими точками входа; данный оператор может быть выполнен только в том случае, если выполнение программы начинается с соответствующей точки входа. Так как покрытие операторов считается необходимым условием, покрытие решений, которое представляется более сильным критерием, должно включать покрытие операторов. Следовательно, покрытие решений требует, чтобы каждое решение имело результатом значение истина или ложь и при этом каждый оператор выполнялся бы, по крайней мере, один раз. Альтернативный и более легкий способ выражения этого требования состоит в том, чтобы каждое решение имело результатом значение истина или ложь и что каждой точке входа должно быть передано управление при вызове программы, по крайней мере, один раз.
Изложенное выше предполагает только двузначные решения или переходы и должно быть модифицировано для программ, содержащих многозначные решения. Примерами таких программ являются:
· программы на PL/1, включающие операторы SELECT (CASE) или операторы GO TO, использующие метку-переменную;
· программы на Фортране с вычисляемыми операторами GO TO или операторами GO TO по предписанию;
· программы на Бейсике с вычисляемыми операторами ON — GOTO, ON — GOSUB;
· программы на Коболе, содержащие операторы GO TO вместе с ALTER или операторы GO ТО — DEPENDING — ON;
· программы на Паскале, использующие операторы CASE;
· программы на языке Си, использующие операторы SWITCH — CASE;
· любые программы с арифметическими операторами IF.
Критерием для них является выполнение каждого возможного результата всех решений, по крайней мере, один раз и передача управления при вызове программы или подпрограммы каждой точке входа, по крайней мере, один раз.
В программе, представленной на рис. 6.5, покрытие решений может быть выполнено двумя тестами, покрывающими либо пути асе и abd, либо пути acd и аbе. Если мы выбираем последнее альтернативное покрытие, то входами двух тестов являются A = 3, B = 0, X = 3 и A = 2, B = 1, X = 1.
Покрытие решений — более сильный критерий, чем покрытие операторов, но и он имеет свои недостатки. Например, путь, где Х не изменяется (если выбрано первое альтернативное покрытие), будет проверен с вероятностью 50 %. Если во втором решении существует ошибка (например, Х<1 вместо Х>1), то ошибка не будет обнаружена двумя тестами предыдущего примера.