2. Кто я?
По образованию радиоинженер
Занимаюсь разработкой встраиваемых систем с 2000
года, пишу на Си и Python
(плюс иногда на C++)
Использую TDD в свой работе
3. Ситуация
• Проект стартовал в 2005 году,
использовалось ручное тестирование
• В 2006 году в связи с расширением
функциональности появилась нужда в
значительном рефакторинге кода
• Нужны были тесты для защиты от
последствий рефакторинга
4. Что у нас было
(-) Практически нулевые знания
фреймворков для тестирования Си
(+) Уверенные знания как писать тесты на
Python
(+) Опыт создания связки между Си и
Python
6. Тестируем черный ящик
[установка начального состояния]
Выходные
Входное воздействия
событие
Логирование внутреннего состояния
7. Тестовая конфигурация
Python Си
Запускатель Обвертка для тестирования
тестов
Интерфейс Тестируемый
К Си коду код
(ctypes)
Динамическая библиотека
Тестовые сценарии (.dll / .so)
9. Прогон тестов
Øscons test
Fifo cache loaded from file.
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
..............................................................................
----------------------------------------------------------------------
Ran 878 tests in 16.109s
OK
Fifo cache saved to file.
10. Если тест не проходит
FAIL: testfoobarpower-off-broken.test
[compare log from testfoobarpower-off-broken.test]
log: Fsm1:E_waiting_off
4: R: button power-off
log: Fsm1:E_power_off
**** Diff ****
5: - W: PowerControlDevice: ESTD_switch_on_ups
fifo: + W: PowerControlDevice: ESTD_switch_off_ups
[/compare log from testfoobarpower-off-broken.test]
testfoobarpower-off-broken.test(5): AssertionError: Different packets
11. Результаты скрещивания
(+) На Python легко создать тестовую инфраструктуру
(+) Легко обрабатывать тестовые сценарии в текстовом
виде
(-) Тесты могут работать медленно
(+) Мы использовали кеширование для преобразований
«бинарные данные» ßà «текст» для ускорения
(-) Нужно писать связку между Python и Си
(+) есть готовые генераторы кода для связки (SWIG, SIP,
boost.python, …)
(-) Плохо подходит для низкоуровневых unit-test
(+) нормально для тестирования черного ящика