Russian Qt Forum
Май 08, 2024, 20:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [Решено] Прикручивание фреймворка CppUnit к Qt  (Прочитано 12135 раз)
Bepec
Гость
« Ответ #15 : Апрель 22, 2014, 13:15 »

Метод направлен на правильное вычисление значения Веселый
Т.е. по сути подбирается массив проверочных значений и результат функции сравнивается с ожидаемым результатом в тесте. Вот только это работает на простейших функциях Улыбающийся
Записан
OKTA
Гость
« Ответ #16 : Апрель 22, 2014, 13:24 »

Вот шайтан-метод  Смеющийся
Записан
Bepec
Гость
« Ответ #17 : Апрель 22, 2014, 13:53 »

А самое в нём интересное, что покрытие теста минимальное. Т.е. массив редко бывает больше 50-100 значений и ответов.
Если по серьёзному подходить, то необходима проверка всех вариантов аргументов в зависимости от типа. Но руками такое вбивать в тест можно, но бессмысленно.
Идём дальше.
Возьмём тогда класс для проверки который будет генерить аргументы, ожидаемые ответы и тестировать. Вроде решили проблему Улыбающийся
Ан нет, ведь никто не может сказать что этот класс считает верно, следовательно и его проверить надо Веселый

PS замкнутый круг ^.^
Записан
OKTA
Гость
« Ответ #18 : Апрель 22, 2014, 14:09 »

Девочки-тестировщики незаменимы  Смеющийся
Записан
8Observer8
Гость
« Ответ #19 : Апрель 23, 2014, 07:33 »

Для пользовательских типов надо, чтобы фреймворк поддерживал Mock-объекты: http://ru.wikipedia.org/wiki/Mock-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82

TDD на Западе очень популярен. Microsoft даже включил его в Visual Studio, начиная с версии 2012:


Причём они реализовали TDD так, что можно создавать классы и методы (загрушки) прямо из тестов. Таким образом, сначала пишем тесты, а потом открываем файл с классами и начинаем писать реализацию для методов (часто запуская тесты), пока вся полоса не будет зелёной. Вот здесь на примере можно понять философию методологии "Разработка через тестирование": http://msdn.microsoft.com/en-us/library/hh212233.aspx

К сожалению, QTest в Qt не поддерживает Mock-объекты, поэтому придётся изучать фреймворки "Google Mock" и\или "Boost Mock". На данном этапе, QTest вполне устраивает. Смог обойти проблему, что QTest не поддерживает тестирование исключений и сравнение вещественных чисел с дельтой. Для демонстрации есть пример:
- проект: https://github.com/8Observer8/FiveAndFive
- проект "Qt Unit Test": https://github.com/8Observer8/FiveAndFiveTests

В CppUnit это есть:

Сравнение вещественных чисел с дельтой:
Код
C++ (Qt)
CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( message, expected, actual, delta );
 

Тестирование на выброс исключения:
Код
C++ (Qt)
CPPUNIT_ASSERT_THROW_MESSAGE( message, expression, ExceptionType );
 

Пример из фреймворка CppUnit:
Код
C++ (Qt)
std::vector<int> v;
CPPUNIT_ASSERT_THROW_MESSAGE( "- std::vector<int> v;", v.at( 50 ), std::out_of_range );
 

Подробно о TDD написано в книгах:
- Мартин Фаулер - Рефакторинг. Улучшение существующего кода
- Кент Бек. Экстремальное программирование. Разработка через тестирование
- Р. Мартин. Быстрая разработка программного обеспечения. Принципы, практика, примеры (в примерах использованы языки C++ и Java)
- Мартин Р.С., Мартин М. - Принципы, паттерны и методики гибкой разработки на языке C# - 2011
« Последнее редактирование: Апрель 23, 2014, 07:43 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #20 : Апрель 30, 2014, 06:44 »

Фреймворк CppUnit уже давно не поддерживается и не развивается. К тому же, у него отсутствует возможность создавать Mock-объекты. Здесь инструкция по самому продвинутому TDD-фреймворку на C++ GTest - http://www.prog.org.ru/topic_26944_0.html
Записан
OKTA
Гость
« Ответ #21 : Апрель 30, 2014, 09:50 »

А почему не поддерживается и не развивается? всего 5 месяцев назад последняя версия вышла.
Записан
8Observer8
Гость
« Ответ #22 : Апрель 30, 2014, 11:01 »

Да, я видел в википедии. Его не развивают, а просто что-то там отрефакторили. Самое очевидное развитие должно быть - это Mock-объекты. Без них можно писать TDD-тесты только для функций, которые принимают и возвращают простые типы: строки, целые, вещественные и т.д. А в ООП в функцию часто передаются объекты пользовательских классов. Я читал, что с помощью Mock-объектов эмулируют данные из сети, из базы данных и любые объекты пользовательских классов. Это удобно, если хочется потестить приложение, в котором реализована не вся функциональность (к примеру, сам разработчик или член команды ещё не закончил свою работу над какими-то классами), либо база данных не готова, либо она пустая, либо в базе данных нужны специфические данные, либо надо получить ответ на запрос с сайта (к примеру, комменты со стены в фейсбуке, которых нет), сайт может быть недоступен, к примеру, нет интернета или сайт ещё не разработан и т.д. На все эти ситуации ответ один - Mock-объекты. Позже напишу инструкцию по Google Mock: https://code.google.com/p/googlemock/
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.094 секунд. Запросов: 21.