- •Содержание Введение
- •Задача 1: Обнаружить учетку памяти
- •Задача 2. Составить тесты к программе
- •Задача 3: Напечатать все содержимое файла на экран.
- •Задача 3: Напечатать все содержимое файла на экран (оптимизация).
- •Задача 4. Удалить все нечетные элементы из массива
- •Задача4.Удалить все нечетные элементы из массива (оптимизация)
- •Задача 4. Удалить все нечетные элементы из массива (последующая оптимизация)
- •Задача 4. Удалить все нечетные элементы из массива (основа тестов)
- •Задача 5. В файле удалить все слова, которые начинаются и заканчиваются одной буквой
- •Задача 5. В файле удалить все слова, которые начинаются и заканчиваются одной буквой (без использования потоков и std::string)
- •Задача 6. Удалить строки, в которых есть два одинаковых элемента (без использования std::vector)
- •Задача 6. Удалить строки, в которых есть два одинаковых элемента (c использованием std::vector)
- •Задача 7. Отсортировать содержимое словаря
- •Задача 8. Реализовать сохранение и загрузку пользовательских структур данных с использованием fstream
- •Заключение Глоссарий
- •Список рекомендуемой литературы
Задача 2. Составить тесты к программе
Рассуждения:
В современном мире использование Unit тестирования во время работаботки программного обеспечения является почти повсеместным. Поэтому в этой задаче мы рассмотрим составление тестов к программе на примере программы сложения двух чисел.
Известно, что к Visual Studio существует множество различных плагинов, которые могут быть платными или бесплатными, и добавляют различные функциональности к возможностям Visual Studio. Один из таких плагинов – Visual Assert (http://www.visualassert.com). Данный плагин очень просто установить в Visual Studio и работать с ним довольно легко. Поэтому мы остановимся на нем.
Составим программу (файл назовем main.cpp), которая содержит класс для сложения двух чисел.
#include <iostream>
using namespace std;
class ClassForTest {
public:
int getSum(int a, int b) {
return a + b;
}
};
int main(int argc, char * argv[]) {
ClassForTest testClass = ClassForTest();
cout << testClass.getSum(1,2);
return 0;
}
Следует отметить, что на самом деле функция getSum должна быть статической. Но это сейчас нас не интересует, потому что наша задача – составить тесты. Если программу запустить, то в консоли появится число 3 и она сразу закроектся.
По хорошему тону программирования тесты необходимо создавать в отдельном файле. Однако это потребует вынеса ClassForTest в отдельный h файл (header file в папке проекта Header Files) и реализации в отдельный cpp файл (C++ File в папке проекта Source Files). Сделаем это. После этого в Solution Explorer будет следующая структура:
А содержимое файлов будет следующим:
ClassForTest.h
#pragma once
class ClassForTest {
public:
int getSum(int a, int b);
};
ClassForTest.cpp
#include "ClassForTest.h"
int ClassForTest::getSum(int a, int b) {
return a + b;
}
main.cpp
#include <iostream>
#include "ClassForTest.h"
using namespace std;
int main(int argc, char * argv[]) {
ClassForTest testClass = ClassForTest();
cout << testClass.getSum(1,2);
return 0;
}
Теперь составим тесты. Для этого создадим С++ файл с названием tests.cpp. Его содержимое представлено ниже:
#include "ClassForTest.h"
#include <cfixcc.h>
class ExampleTest : public cfixcc::TestFixture {
public:
void test1() {
ClassForTest z;
int c = z.getSum(1, 2);
CFIXCC_ASSERT_EQUALS(c, 3);
}
void test2() {
ClassForTest z;
int c = z.getSum(2, 2);
CFIXCC_ASSERT_EQUALS(c, 4);
}
};
CFIXCC_BEGIN_CLASS(ExampleTest)
CFIXCC_METHOD(test1)
CFIXCC_METHOD(test2)
CFIXCC_END_CLASS()
Отметим некоторые важные моменты в этом коде:
#include <cfixcc.h> - это подключает класс, от которого необходимо наследоваться для создания тестов
public cfixcc::TestFixture - это наследование от базового класса для тестов
CFIXCC_BEGIN_CLASS(ExampleTest)… CFIXCC_END_CLASS() – внутри этого указываются, какие методы необходимо запускать во время тестирования.
Теперь перейдем в главном меню в «Visual Assert», подпункт «Test Explorer Window». В появившемся окне выберем кнопку «Run Tests without debugging»
После этого мы можем просмотреть результаты тестирования (после разворачивания всех «плюсиков» панель Test Run представлена на рисунке:
Как видно из него, оба теста прошли успешно. Если у нас будет неверный тест или ошибка в кодах, то соответствующий тест не пройдет, и картина будет следующей (по ней очень легко понять, что test2 не прошел):
Однако теперь при запуске приложения (F5) мы будем видеть следующее сообщение (и программа не будет запускаться):
Эту проблему легко исправить. Логично предположить, что тесты являются дополнительным кодом, который облегчает поддержку кода. Поэтому во время использования программы в Debug и в Release версии он не нужен. Поэтому мы создадим специальную Test конфигурацию, в которую вынесем тесты.
Перейдем в Configuration Manager, как показано на рисунке
После этого появится следующее окно:
Создадим новую конфигурацию для Solution
После выбора «New» появится окно, в котором надо ввести название новой конфигурации и от какой конфигурации брать настройки. Вид окна после заполнения представлен на рисунке.
После запонения нажмем кнопку «OK» и закроем Configuration Manager. После этого проект будет находится в Test конфигурации.
Теперь зайдем в свойства проекта
Теперь перейдем в Configuration Properties, в С/С++,
В Preprocessor Defenitions выберем пункт Edit и появится следующее окно:
Туда добавим новую символьную константу – TEST, как показано на рисунке
Теперь нажмем кнопку «OK» и вернемся к файлу tests.cpp. В начале файла добавим строку «#ifdef TEST», а в конце – «#endif». Тогда файл будет выглядить следующим образом (середина файла не представлена для уменьшения объема):
#ifdef TEST
#include "ClassForTest.h"
#include <cfixcc.h>
//старое содержимое
CFIXCC_BEGIN_CLASS(ExampleTest)
CFIXCC_METHOD(test1)
CFIXCC_METHOD(test2)
CFIXCC_END_CLASS()
#endif
Теперь для запуска тестов необходимо перейти в Test конфигурацию и работать с тестами. А для запуска приложения – перейти в Debug или Release конфигурацию и работать с приложением.