На следующей неделе я собираюсь поговорить с моим отделом о модульном тестировании и разработке через тестирование. В рамках этого я собираюсь показать некоторые реальные примеры из кода, который я недавно написал, но я также хотел бы показать несколько очень простых примеров, которые я напишу в докладе.
Я искал в Интернете хорошие примеры, но я изо всех сил пытался найти те, которые особенно применимы к нашей области разработки. Почти все программное обеспечение, которое мы пишем, представляет собой глубоко встроенные системы управления, работающие на небольших микроконтроллерах. Существует много кода на C, который легко применим к модульному тестированию (я буду говорить о модульном тестировании на ПК, а не на самой цели), если вы остаетесь в стороне от «нижнего» уровня: материала, который говорит непосредственно к периферии микроконтроллера. Тем не менее, большинство примеров, которые я обнаружил, как правило, основаны на обработке строк (например, превосходный пример римских цифр Dive Into Python), и поскольку мы почти никогда не используем строки, это не очень подходит (из-за единственных библиотечных функций, которые обычно использует наш код являются memcpy
, memcmp
и memset
,strcat
или регулярные выражения не совсем правильно).
Итак, к вопросу: пожалуйста, кто-нибудь может предложить несколько хороших примеров функций, которые я могу использовать для демонстрации модульного тестирования в режиме реального времени? Хороший ответ по моему (может быть изменен) мнению, вероятно, будет:
- Функция, которая достаточно проста, чтобы ее мог понять каждый (даже тот, кто только иногда пишет код);
- Функция, которая не выглядит бессмысленной (т. Е. Вычисление четности или CRC, вероятно, лучше, чем функция, которая умножает два числа вместе и добавляет случайную константу);
- Функция достаточно короткая, чтобы писать перед комнатой людей (я могу воспользоваться множеством буферов обмена Vim, чтобы уменьшить количество ошибок ...);
- Функция, которая принимает числа, массивы, указатели или структуры в качестве параметров и возвращает нечто подобное, а не обрабатывает строки;
- Функция, которая имеет простую ошибку (например,
>
а не>=
), которую легко внедрить, будет по-прежнему работать в большинстве случаев, но не справится с некоторым конкретным крайним случаем: легко идентифицировать и исправить с помощью модульного теста.
Есть предположения?
Хотя это, вероятно, не имеет значения, сами тесты, вероятно, будут написаны на C ++ с использованием Google Test Framework: все наши заголовки уже содержат #ifdef __cplusplus extern "C" {
оболочку; это хорошо сработало с тестами, которые я провел до сих пор.
Ответы:
Вот простая функция, которая должна генерировать контрольную сумму по длинам байтов.
У него есть ошибка забора: в операторе for должен быть тест
i < len
.Что интересно, если вы примените его к текстовой строке, как это ...
Вы получите «правильный ответ»! Это потому, что дополнительный байт, который был контрольной суммой, был нулевым ограничителем строки. Таким образом, вы можете включить эту функцию контрольной суммы в код, и, возможно, даже отправить ее вместе с ней, и никогда не заметить проблему - то есть, пока вы не начнете применять ее к чему-то, кроме текстовых строк.
Вот простой модульный тест, который помечает эту ошибку (большую часть времени ... :-)
источник
Как насчет реализации функции сортировки, такой как пузырьковая сортировка ? После того, как вы установили функцию сортировки, вы можете продолжить бинарный поиск, который так же хорош для введения модульного тестирования и TDD.
Сортировка и поиск зависят от сравнений, в которых легко ошибиться. Это также включает в себя обмен указателями, которые должны быть выполнены с осторожностью. Оба подвержены ошибкам, так что не стесняйтесь облажаться :)
Еще несколько идей:
qsort
, и тесты все равно должны пройти, подтверждая, что ваша новая функция сортировки также работает.источник