Общая информация о тестировании исключений на 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