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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Видео-инструкция. Разработка ПО через тестирование (TDD, C++, Google Test)  (Прочитано 18179 раз)
8Observer8
Гость
« : Апрель 29, 2014, 14:48 »

Инструментарий:
- Win7
- Qt 5.4
- MinGW 4.9.1

Моя видео-инстукция: http://www.youtube.com/watch?v=6pp8S56sS2Y&feature=youtu.be
« Последнее редактирование: Февраль 14, 2015, 16:18 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #1 : Апрель 29, 2014, 14:49 »

Оставлю место для примера сравнения вещественных результатов: https://code.google.com/p/googletest/wiki/AdvancedGuide#Floating-Point_Comparison
Записан
8Observer8
Гость
« Ответ #2 : Апрель 29, 2014, 14:50 »

Общая информация о тестировании исключений на Google Test - здесь: https://code.google.com/p/googletest/wiki/AdvancedGuide#Exception_Assertions

Проект "TextFile"

Исходники примера "TextFile": https://github.com/8Observer8/Qt_TextFile

Описание:
В этом примере целые числа читаются из файла "input.txt" и выводятся файл "output.txt". Числа не должны выходить из диапазона [-100, 100]. В противном случае, пользователю будет выведено сообщение:
Цитировать
Error: the argument "101" doesn't hit into the range [-100, 100]

Пример демонстрирует, как тестировать свободные функции с помощью макроса "ASSERT_EQ( expected, actual )", и исключения с помощью макросов: ASSERT_THROW и ASSERT_NO_THROW.

Пример выполнен по методологии TDD. То есть, к примеру:
- сначала создавалась заглушка разрабатываемой функции
- потом, описывалась функциональность будущей функции с помощью тестов на GTest
- далее, реализовывалась функциональность и перезапускались тесты, до полного их выполнения

Краткое пояснение к этому проекту:

main.cpp
Код
C++ (Qt)
#include <iostream>
#include <string>
#include <vector>
#include <QString>
#include "freeFunctions.h"
#include "LogicError.h"
#include "FileError.h"
 
int main( )
{
   // Read data from the input file
   QString fileNameIn = "input.txt";
   QString content;
 
   try {
       readData( fileNameIn, content );
   } catch ( const LogicError &e ) {
       std::cerr << e.what( ) << std::endl;
       return 1;
   } catch ( const FileError &e) {
       std::cerr << e.what( ) << std::endl;
       return 1;
   } catch ( ... ) {
       std::cerr << "Error: unknown exception" << std::endl;
       return 1;
   }
 
   // Parse the content to the integer array
   std::vector<int> arr;
   try {
       parseToIntArray( content, arr );
   } catch ( const LogicError &e ) {
       std::cerr << e.what( ) << std::endl;
       return 1;
   } catch ( ... ) {
       std::cerr << "Error: unknown exception" << std::endl;
       return 1;
   }
 
   // Write data to the output file
   QString fileNameOut = "output.txt";
   try {
       writeData( fileNameOut, arr );
   } catch ( const LogicError &e ) {
       std::cerr << e.what( ) << std::endl;
       return 1;
   } catch ( const FileError &e ) {
       std::cerr << e.what( ) << std::endl;
       return 1;
   } catch ( ... ) {
       std::cerr << "Error: unknown exception" << std::endl;
       return 1;
   }
 
   return 0;
}
 

Функция "void readData( const QString &fileName, QString &content )" читает данные из файла с именем "fileName" и помещает их в строковый объект "content".

Функция "void parseToIntArray( const QString &source, std::vector<int> &destination )" парсит данные из строкового объекта "content" в массив целых чисел.

Массив выводится в файл "output.txt" с помощью функции: void writeData( const QString &fileName, const std::vector<int> &arr )

Эти функции выбрасывают исключения. Вот некоторые из них:
- FileOpenError - "Ошибка открытия файла". К примеру, это исключение может выдать такой текст пользователю: Error: unable to open the file "input.txt" in the function "readData()"
- FileReadError - "Ошибка чтения из файла"
- EmptyArgument - "Входной аргумент представляет из себя пустой аргумент"

В корневой папке этого проекта находится папка "GTests", в которой хранятся тестовые проекты на Qt для всех классов и свободных функций, которые можно было протестировать в этом проекте. Вот список этих тестовых проектов:
- TextFile_EmptyArgument_gtests
- TextFile_FileOpenError_gtests
- TextFile_FileReadError_gtests
- TextFile_FileWriteError_gtest
- TextFile_isAllDigits_gtests
- TextFile_NotNumber_gtests
- TextFile_OutOfRange_gtests
- TextFile_parseToIntArray_gtests

Все детали вы увидите, когда просмотрите сам проект "TextFile" и проекты с тестами его модулей из папки GTests: https://github.com/8Observer8/Qt_TextFile
« Последнее редактирование: Июнь 26, 2014, 08:04 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #3 : Апрель 29, 2014, 17:52 »

Оставлю ещё место для инструкции по фреймворку Google Mock: https://code.google.com/p/googlemock/
Записан
8Observer8
Гость
« Ответ #4 : Апрель 29, 2014, 21:01 »

Пока оставлю пару полезных заметок про вещественные результаты и исключения.

При нормальных условиях функция не должна выбрасывать исключения, поэтому всегда в тестах надо использовать ASSERT_NO_THROW:
Код
C++ (Qt)
TEST( test001, normalTest ) {
   int input = 15;
   int expected = 120;
 
   int actual = 0;
   ASSERT_NO_THROW({
                       actual = myFunc( input );
                   });
   ASSERT_EQ( expected, actual );
}
 

Если функция при определённых входных данных выбрасывает исключение и вы его ожидаете (например, ваше исключение называется OutOfRange), то надо указать тип исключения:
Код
C++ (Qt)
TEST( test002, exeptionTest ) {
   int input = 10001;
 
   ASSERT_THROW({
                    myFunc( input );
   }, OutOfRange);
}
 

Если вы хотите сравнивать вещественные: ожидаемый результат и выходной результат функции с погрешностью дельта, то надо использовать ASSERT_NEAR:
Код
C++ (Qt)
TEST( test003, normalTest ) {
   int input = 5;
   double expected = 25.0;
 
   double actual = 0.0;
   ASSERT_NO_THROW({
                       actual = myFunc( n );
                   });
   double delta = 0.001;
   ASSERT_NEAR( expected, actual, delta );
}
 

P.S. Лишние сообщения потом удалю.
« Последнее редактирование: Сентябрь 11, 2014, 19:52 от 8Observer8 » Записан
xintrea
Moderator
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #5 : Апрель 30, 2014, 09:18 »

Спасибо, тема важная. Будем посмотреть.
Записан

Собираю информацию по крупицам
http://webhamster.ru
8Observer8
Гость
« Ответ #6 : Апрель 30, 2014, 11:10 »

Спасибо за отзыв Улыбающийся Если я в инструкции где-то допустил ошибку или будут предложения по улучшению, то обязательно пишите Улыбающийся
Записан
pilot.net
Гость
« Ответ #7 : Май 01, 2014, 06:35 »

Для кого эта 'документация' для деобилов  ? Это элементарные вещи
Лучше скажи как добавить пост билд евент в про файлы чтобы он в вижуал студии работал
Записан
_Vitaliy_
Гость
« Ответ #8 : Май 01, 2014, 11:05 »

Цитировать
Для кого эта 'документация' для деобилов  ?
Вы сначала внесите некоторый интеллектуальный вклад в ресурс, а потом позволяйте себе комментарии подобного вида.
Цитировать
Лучше скажи как...
со второго сообщения и сразу на Ты... несерьезно.
Вы сами разберитесь с данным вопросом и выложите в разделе уроки, распишите так, чтобы всякие (позволю Ваше определение) деобилы не задавали вопросы...
З.Ы. ничего личного.
Записан
8Observer8
Гость
« Ответ #9 : Июнь 26, 2014, 08:06 »

Добавил пример: http://www.prog.org.ru/index.php?topic=26944.msg194685#msg194685
Записан
8Observer8
Гость
« Ответ #10 : Февраль 14, 2015, 16:17 »

Заменил инструкцию

Моя видео-инстукция: http://www.youtube.com/watch?v=6pp8S56sS2Y&amp;feature=youtu.be
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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