Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Тестирование кода в ROS

Тестирование кода в ROS

Avatar for Oleg Shipitko

Oleg Shipitko

February 15, 2020
Tweet

More Decks by Oleg Shipitko

Other Decks in Programming

Transcript

  1. ❏ Зав. лаб. – к.ф.-м.н. Д. П. Николаев ❏ 50+

    сотрудников ❏ 100+ публикаций в 2018 году ❏ МИП «Визиллект Сервис» ❏ 5 крупных проектов за 5 лет ❏ 100% поддержка исходного кода ❏ Владение ключевыми РИД Лаборатория зрительных систем ИППИ РАН
  2. Области исследования ❏ Быстрые процедуры обработки изображений ❏ Алгоритмы томографической

    реконструкции ❏ Методы и технологии обучения машин ❏ Комплексирование и фильтрация данных ❏ Проблемы «слепой» автокалибровки ❏ Модели внимания человеческого зрения ❏ Цвет и мультиспектральная визуализация Лаборатория зрительных систем ИППИ РАН
  3. ❏ Распознавание типа ТС по количеству колесных осей и габаритам

    ❏ Оптимизирован по цене аппаратуры и обслуживания (без лидаров и оптопар) ❏ Качество классификации 99,7%+ при любых погодных условиях ❏ Установлен на 300+ полос трасс М-1, М-4 и ЗСД ❏ 100 000+ строк «собственного» C++ кода: распознающее ядро, система визуализации и отладки, инструментарий обучения, БД истории событий Автоматический классификатор транспортных средств для контроля тарификации Программно-аппаратный комплекс «АКТС-4»
  4. Алгоритмическое обеспечение «Адамант» ❏ Распознавание и отсечка алмазов в реальном

    времени для технологической цепочки горно- обогатительного комбината ❏ Чувствительность 99%, избирательность 99,999% ❏ Используется в серийных сепараторах РГС-1 НПП «Буревестник» ❏ В сепараторе компании «Aliud» впервые успешно реализован алгоритм детектирования закрытых алмазов ❏ Разработка для ОСРВ “QNX”, скорость обработки – 200 мкс/скан на Atom D525 ПО для рентгенографических сепараторов алмазосодержащей руды
  5. Программный комплекс «МАРИНА» Система распознавания автономеров ❏ Распознавание знаков номера

    транспортного средства в экстремальных условиях съемки (большие углы, грязь на номере) ❏ Система лицензирована для использования одним из крупнейших интеграторов в Китае ❏ Работа с кадрами низкого качества и наличием артефактов (загрязнение и др.) ❏ Малое энергопотребление – без видеокарт ❏ Работа в многополосном режиме
  6. Система визуальной навигации LiNE Система управления беспилотными ТС ❏ ПАК

    для распознавания окружения, локализации, управления движением, комплексирования данных сенсоров, удаленного мониторинга и контроля ❏ Полностью автономное ТС, передвигающееся по фиксированному маршруту со скоростью до 20 км/ч ❏ Визуальная система навигации и распознавания препятствий на базе 6 оптических камер (без использования лидаров и GPS) ❏ Около 1000 пассажиров перевезено во время празднования 870-летия Москвы
  7. Зачем тестировать код? 13 Тестирование... ❏ Ускоряет инкрементальное улучшение кода

    ❏ Делает рефакторинг доступным ❏ Больше никаких “работает — не трогай!” ❏ Вынуждает лучше проектировать код
  8. Зачем тестировать код? 14 Тестирование... ❏ Предотвращает повторное появления багов

    ❏ Позволяет вам винить других людей ❏ Является автоматической формой документации ❏ ...
  9. Виды тестирования ПО ❏ Модульное тестирование (unit testing) ❏ Интеграционное

    тестирование (integration testing) ❏ Системное тестирование (system testing) ❏ Регрессионное тестирование (regression testing) ❏ Тестирование производительности (performance testing) ❏ Тестирование безопасности (security testing) ❏ ... 15
  10. Виды тестирования ПО ❏ Модульное тестирование (unit testing) ❏ Интеграционное

    тестирование (integration testing) ❏ Системное тестирование (system testing) ❏ Регрессионное тестирование (regression testing) ❏ Тестирование производительности (performance testing) ❏ Тестирование безопасности (security testing) ❏ и.т.д. 16 Распространены в рамках ROS
  11. Уровни тестирования в ROS 17 ❏ Уровень 1. Модульное тестирование

    библиотек ❏ Уровень 2. Модульное тестирование ROS-нодов ❏ Уровень 3. Интеграционное/регрессионное/системное тестирование группы ROS-нодов
  12. 20 Node 1 Node 2 Node 3 ❏ Тестирование ROS-

    независимого кода ❏ Каждый компонент тестируется отдельно ❏ Инструменты: ❏ Google Test (С++) ❏ Unittest (Python) Тестирование кода на уровне библиотек
  13. 21 Node 1 Node 2 Node 3 ❏ Тестирование запуска/завершения,

    сервисов, публикаций, подписок нода ❏ Каждый нод тестируется отдельно ❏ Инструменты: ❏ Google Test (С++) Unittest (Python) ❏ rostest Тестирование кода на уровне нодов
  14. 22 Node 1 Node 2 Node 3 ❏ Тестирование обмена

    и совместной логики работы ❏ Тестируются 2 и более нодов ❏ Инструменты: ❏ Google Test (С++) Unittest (Python) ❏ rostest Тестирование кода на уровне интеграции нодов
  15. Виды тестирования ПО в ROS 24 Node 1 Node 2

    Node 3 Тестирование кода на уровне библиотек
  16. Виды тестирования ПО в ROS 25 Node 1 Node 2

    Node 3 Тестирование кода на уровне библиотек Тестирование кода на уровне нода
  17. Виды тестирования ПО в ROS 26 Node 1 Node 2

    Node 3 Тестирование кода на уровне интеграции нодов Тестирование кода на уровне библиотек Тестирование кода на уровне нода
  18. Модульное тестирование за 5 минут ❏ Модульное тестирование - тестирование

    отдельных модулей (функций, классов, библиотек) ❏ Цель модульного тестирования — изолировать отдельные части программы и показать, что по отдельности эти части работоспособны 27
  19. Принципы модульного тестирования 28 ❏ Каждый тест должен быть направлен

    на тестирование определенного аспекта работы модуля ❏ Каждый баг должен быть обнаружен вручную лишь единожды ❏ Принцип AAA: Arrange, Act, Assert
  20. Модульное тестирование c GoogleTest 29 ❏ Структура кода my_library/ include/

    my_library/ my_component.h some_other_headers src/ some_source_files test/ my_component_test.cpp CMakeLists.txt CMakeLists.txt
  21. Модульное тестирование c GoogleTest 30 ❏ Простейший тест ❏ Наименование

    наборов тестов - CamelCased ❏ Наименование тестовых сценариев - camelCased // Component to be tested #include "foo/foo.h" // Bring in gtest #include <gtest/gtest.h> // Declare a test TEST(TestSuiteName, testCaseName) { // test things here, calling EXPECT_* and/or ASSERT_* macros as needed }
  22. Модульное тестирование c GoogleTest 31 ❏ Простейший тест (продолжение) ❏

    Наименование наборов тестов - CamelCased ❏ Наименование тестовых сценариев - camelCased // Run all the tests that were declared with TEST() int main(int argc, char **argv){ testing::InitGoogleTest(&argc, argv); // ros::init(argc, argv, "tester"); // ros::NodeHandle nh; return RUN_ALL_TESTS(); }
  23. Модульное тестирование c GoogleTest 32 ❏ Простейший тест (продолжение) ❏

    Наименование наборов тестов - CamelCased ❏ Наименование тестовых сценариев - camelCased // Run all the tests that were declared with TEST() int main(int argc, char **argv){ testing::InitGoogleTest(&argc, argv); ros::init(argc, argv, "tester"); ros::NodeHandle nh; return RUN_ALL_TESTS(); }
  24. Модульное тестирование c GoogleTest 33 ❏ CmakeLists.txt ❏ Запуск теста

    ## Add gtest based cpp test target and link libraries catkin_add_gtest(${PROJECT_NAME}_test test/foo_tests.cpp) if(TARGET ${PROJECT_NAME}_test) target_link_libraries(${PROJECT_NAME}_test ${PROJECT_NAME}) endif() ./bin/test/foo_test
  25. Модульное тестирование c GoogleTest 34 ❏ Пример теста TEST(MyComponentTest, initializationTest)

    { // Arrange MyComponent * mc = new MyComponent; // Act MyComponent->initialize(); // Assert const int expected_value = 5; EXPECT_EQUAL(MyComponent->get_initialized_value(), expected_value); // Don't forget to release resources delete mc; }
  26. 35

  27. Интеграционное тестирование за 5 минут 36 ❏ Интеграционное тестирование -

    тестирование группы модулей ❏ Цель интеграционного тестирования - проверка правильного функционирования подсистем ❏ Тестирование выполняется через интерфейсы т.е. методом «чёрного ящика» ❏ Входом интеграционного тестирования являются компоненты, прошедшие модульное тестирование
  28. Пакет rostest 37 ❏ Предоставляет расширение функциональности roslaunch ❏ Позволяет

    проводить интеграционное тестирование систем состоящих из 2 и более нодов ❏ Для написания сценариев тестирования используется синтаксис .launch-файлов с тэгом <test> ❏ Запуск rostest: rostest <имя пакета> <имя теста>.test
  29. Пакет rostest 38 <launch> <param name="string" value="mystring" /> <node pkg="mypkg"

    type="mynode" name="mynode" /> <test test-name="test_mynode" pkg="mypkg" type="test_mynode" /> </launch> ❏ Пример файла .rostest
  30. Таким образом... 39 Тестирование в ROS Google Test (С++) или

    Unittest (Python) для написания тестов rostest для их запуска
  31. Что и как тестировать? 40 ❏ Нормальные условия ❏ Граничные

    условия ❏ Неправильные входные данные ❏ Интерфейсы между модулями/нодами (подписки, публикации, сервисы)
  32. Что НЕ тестировать? 41 ❏ Сами тесты ❏ Модули, которые

    не могут быть сломаны или которые нельзя починить (системные вызовы) ❏ Чужие библиотеки (стандартная библиотека, и.т.д.). Такие модули уже должны быть оснащены своими тестами ❏ Тривиальные функции и модули
  33. Чего я вам не сказал? 42 ❏ Тесты - такой

    же код. Его нужно... ❏ ...писать ❏ ...поддерживать ❏ ...рефакторить ❏ Тесты полезны только при одном условии...
  34. Чего я вам не сказал? 44 ❏ Тесты - такой

    же код. Его нужно... ❏ ...писать ❏ ...поддерживать ❏ ...рефакторить ❏ Тесты полезны только при одном условии ❏ При наличии непрерывной интеграции (Continuous Integration, CI)
  35. Тестирование беспилотного автомобиля Данные 47 Данные для тестирования .bag файл

    с сырыми данными отдельный датасет .bag файл с предобработанными данными
  36. 50 Полезные ссылки ❏ ROS UnitTesting: http://wiki.ros.org/Quality/Tutorials/UnitTesting ❏ ROS gtest

    (C++): http://wiki.ros.org/gtest ❏ ROS unittest (Python): http://wiki.ros.org/unittest ❏ Rostest: http://wiki.ros.org/rostest
  37. 51 Полезные ссылки ❏ Доклад “Test Driven Development in ROS”,

    Victor Gonzales Pacheco ❏ Доклад “Effective C++ Testing Using Google Test”, Zhanyong Wan ❏ Инструмент для тестирования надежности/восстановления системы (Chaos Monkey для ROS): https://github.com/ros-testing/roschaos ❏ Инструмент для генерации псевдослучайных данных для ROS- топиков: https://github.com/ros-testing/hypothesis-ros
  38. 53 Наше состояние дел с тестированием Мы здесь 500к+ строк

    кода без тестов Система, покрытая модульными, регрессионными и интеграционными тестами