Покрытие филиала

При написании тестовых случаев, которые должны иметь 100-процентное покрытие ветвей, нормально ли иметь один из ваших случаев, который охватывает две ветви, а другой — только одну.

примечание: мы предполагаем, что в коде всего три ветви.

редактировать: 3 ветки означают три основных оператора if, которые отделены друг от друга в теле кода. например

input (x, y)
if (x<0)
    something
if (x==y)
    something
if (x > y)
    something
output (x)

У меня есть один тестовый пример, который охватывает первую ветвь, и один тестовый пример, который охватывает две другие ветки.


person Community    schedule 25.05.2009    source источник
comment
Было бы намного проще ответить на примере... иначе разные люди могут по-разному интерпретировать три ветви. Три варианта? Три точки ветвления, каждая с двумя вариантами?   -  person Jon Skeet    schedule 26.05.2009
comment
Я предполагаю, что под «ветвями» вы подразумеваете то же самое, что и «дуги», т.е. линейная последовательность машинных инструкций, имеющая только одну точку входа и одну точку выхода.   -  person Remus Rusanu    schedule 26.05.2009
comment
На самом деле для случая x, y и что-то здесь более интересно посмотреть, может ли «что-то» изменить x или y, и в этом случае вам обязательно следует проверить этот случай, поскольку, вероятно, не ожидается, что два «что-то» будут выполняться. Конечно, это не настоящий пример, но я просто хочу проиллюстрировать образ мышления, который должен быть у тестировщиков.   -  person Remus Rusanu    schedule 26.05.2009


Ответы (3)


Тест — это вопрос, который у нас есть о продукте. Идея одного теста на (письменную) ветку может быть полезной или глупой.

У меня есть несколько вопросов по приведенному вами примеру

введите (x, y)
если (x‹0)
что-то
если (x==y)
что-то
если (x > y)
что-то< br> вывод (x)

Что произойдет, если x больше нуля? Вы должны провалиться? Что должно произойти, если x меньше y? Что-то? Ничего?

Вот в чем дело: покрытие кода (и ветки) (и условия) — хорошая идея. Но что значит «покрыть» линию, ветвь или условие? Чтобы убедиться, что программа может работать, то есть выполнять заданную строку/ветвь/условие без сбоев? Или убедиться, что эта программа будет работать?

---Майкл Б.

person Michael Bolton    schedule 26.05.2009

Лично я сосредотачиваюсь на поведении кода. Таким образом, существует три различных возможных способа выполнения кода, поэтому должно быть три теста.

Подумайте об этом так: если одна из двух ветвей сломается, вы можете не знать об этом, потому что тест все еще проходит (поскольку другая ветвь все еще работает), но производственный код дает сбой. Не идеально.

Да, это занимает больше времени, но в некоторых случаях оно того стоит... 100% за все? Может быть, не до такой степени крайности.

person Ben Hall    schedule 25.05.2009
comment
Опять же, не может ли тест провалиться, если одна из ветвей выйдет из строя? и тест может записать, какая ветвь не удалась? - person ; 26.05.2009
comment
Могло бы, но ваш тест содержит дополнительную логику, которая может скрывать истинное намерение того, что он покрывает. - person Ben Hall; 27.05.2009

100% охват филиала? Есть ли у человека, который просит что-то подобное, реальный опыт тестирования? По моему опыту, для достаточно сложных проектов получение 75-80% охвата кода и около 60-70% покрытия веток — лучшее, на что можно надеяться. Эти цифры обычно являются необработанными, предварительными анализами. Они увеличиваются (~ 92-95% кода и 80-85% ветвей) после устранения фрагментов, недоступных для доступа, таких как Asserts, случаи переключения по умолчанию, пути кода «глубокой защиты» и тому подобное. Что касается вашего вопроса: чем меньше у вас тестовых случаев, тем лучше. Не забывайте, что тесты требуют времени не только для разработки, но и для запуска и анализа сбоев. После того, как вы в первый раз подождали 4 дня, пока завершится весь набор тестов, вы быстро поймете ценность сокращения количества тестовых случаев до минимума, который дает уверенность в покрытии.

person Remus Rusanu    schedule 25.05.2009
comment
В общем, чем меньше случаев, тем лучше, я понял, что все, что вы сказали, было правильным, но это не относится к этой ситуации, поскольку это не «реальный мир». Это теоретический вопрос, который был брошен мне. Я не могу ответить со 100% охватом!!! ты спятил -_- - person ; 26.05.2009
comment
Мой ответ был строго практическим. В реальном мире время разработки и запуска тестов имеет значение, и практика быстро показывает, что экспоненциальный рост тестовой матрицы невозможно обогнать. Если дискуссия носит академический характер, то кто-то может выиграть спор со словами «но это не охватывает все возможные случаи», вы говорите «спасибо за ваш ценный вклад» и идете дальше... - person Remus Rusanu; 26.05.2009