Russian Qt Forum

Qt => Уроки и статьи => Тема начата: 8Observer8 от Апрель 29, 2014, 14:48



Название: Видео-инструкция. Разработка ПО через тестирование (TDD, C++, Google Test)
Отправлено: 8Observer8 от Апрель 29, 2014, 14:48
Инструментарий:
- Win7
- Qt 5.4
- MinGW 4.9.1

Моя видео-инстукция: http://www.youtube.com/watch?v=6pp8S56sS2Y&feature=youtu.be


Название: Re: Разработка ПО на Qt c помощью методологии TDD и фреймворка Google Test (GTest)
Отправлено: 8Observer8 от Апрель 29, 2014, 14:49
Оставлю место для примера сравнения вещественных результатов: https://code.google.com/p/googletest/wiki/AdvancedGuide#Floating-Point_Comparison


Название: Re: Разработка ПО на Qt c помощью методологии TDD и фреймворка Google Test (GTest)
Отправлено: 8Observer8 от Апрель 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


Название: Re: Разработка ПО на Qt c помощью методологии TDD и фреймворка Google Test (GTest)
Отправлено: 8Observer8 от Апрель 29, 2014, 17:52
Оставлю ещё место для инструкции по фреймворку Google Mock: https://code.google.com/p/googlemock/


Название: Re: Разработка ПО на Qt c помощью методологии TDD и фреймворка Google Test (GTest)
Отправлено: 8Observer8 от Апрель 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. Лишние сообщения потом удалю.


Название: Re: Разработка ПО на Qt c помощью методологии TDD и фреймворка Google Test (GTest)
Отправлено: xintrea от Апрель 30, 2014, 09:18
Спасибо, тема важная. Будем посмотреть.


Название: Re: Разработка ПО на Qt c помощью методологии TDD и фреймворка Google Test (GTest)
Отправлено: 8Observer8 от Апрель 30, 2014, 11:10
Спасибо за отзыв :) Если я в инструкции где-то допустил ошибку или будут предложения по улучшению, то обязательно пишите :)


Название: Re: Разработка ПО на Qt c помощью методологии TDD и фреймворка Google Test (GTest)
Отправлено: pilot.net от Май 01, 2014, 06:35
Для кого эта 'документация' для деобилов  ? Это элементарные вещи
Лучше скажи как добавить пост билд евент в про файлы чтобы он в вижуал студии работал


Название: Re: Разработка ПО на Qt c помощью методологии TDD и фреймворка Google Test (GTest)
Отправлено: _Vitaliy_ от Май 01, 2014, 11:05
Цитировать
Для кого эта 'документация' для деобилов  ?
Вы сначала внесите некоторый интеллектуальный вклад в ресурс, а потом позволяйте себе комментарии подобного вида.
Цитировать
Лучше скажи как...
со второго сообщения и сразу на Ты... несерьезно.
Вы сами разберитесь с данным вопросом и выложите в разделе уроки, распишите так, чтобы всякие (позволю Ваше определение) деобилы не задавали вопросы...
З.Ы. ничего личного.


Название: Re: Разработка ПО на Qt c помощью методологии TDD и фреймворка Google Test (GTest)
Отправлено: 8Observer8 от Июнь 26, 2014, 08:06
Добавил пример: http://www.prog.org.ru/index.php?topic=26944.msg194685#msg194685


Название: Re: Видео-инструкция. Разработка ПО через тестирование (TDD, C++, Google Test)
Отправлено: 8Observer8 от Февраль 14, 2015, 16:17
Заменил инструкцию

Моя видео-инстукция: http://www.youtube.com/watch?v=6pp8S56sS2Y&amp;feature=youtu.be