Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2013, 00:06   #11
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
тема интересная, только инструмент выбран неподходящий. CppUnit уже безнадежно устарел, и заброшен самими авторами. Трупик, короче.

По сравнению с GoogleTest, количество ненужного синтаксического мусора чтобы создать 1 тест, у CppUnit примерно в 3(!) раза больше.

к обоим фреймворкам можно добавлять расширения, чтобы сравнивать в ассертах свои типы данных с подробной распечаткой экспектов, но у Google больше матчеров в комплекте.
Ну и естессно у Гоогле есть GoogleMock - охренительная вещь- тут и CppUnit и Boost.Test в полном обломе.
За информацию спасибо! Я работаю в среде NetBeans. Там поддержка CppUnit интегрированна в среду. Новые тесты добавлять удобно, всё под рукой. Пока меня всё устраивает. Следующий этап - возможно будет GoogleTest. Ещё раз - Спасибо!
8Observer8 вне форума Ответить с цитированием
Старый 29.08.2013, 01:55   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
к обоим фреймворкам можно добавлять расширения, чтобы сравнивать в ассертах свои типы данных с подробной распечаткой экспектов, но у Google больше матчеров в комплекте.
Ну и естессно у Гоогле есть GoogleMock - охренительная вещь- тут и CppUnit и Boost.Test в полном обломе.
Активно использую gtest.
Впервые слышу о "экспектах" и о "матчерах". Что это такое?

gMock ни разу не использовал. Даже не очевидна его полезность.
_Bers вне форума Ответить с цитированием
Старый 29.08.2013, 07:40   #13
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
Хорошо

Цитата:
Сообщение от _Bers Посмотреть сообщение
Активно использую gtest.
Впервые слышу о "экспектах" и о "матчерах". Что это такое?
gMock ни разу не использовал. Даже не очевидна его полезность.
Я тоже откровенно говоря никогда не сталкивался.... Интересно будет почитать тему.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 29.08.2013, 10:45   #14
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Я тоже откровенно говоря никогда не сталкивался.... Интересно будет почитать тему.
Почитал литературку.

В общем, "матчеры" - это средства с помощью которых конструируется ожидаемая модель поведения мок-объекта.

Смысл в том, что бы тестами контролировать поведение механизма.
То есть, нюансы и ход его внутренней работы.
_Bers вне форума Ответить с цитированием
Старый 04.01.2014, 15:20   #15
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Недавно нашёл более простой способ установки инструментария для разработки ПО на C++ через тестирование (Test-Driven Development). Мы просто скачиваем пакеты из набора Cygwin и подключаем их к среде разработки (об этом подробно ниже).

Принцип TDD - сначала пишем тесты для пустого модуля (модуль - это функция или класс), а потом реализацию для этого модуля.

Напомню для чего нужен TDD. Такой способ разработки позволяет:
- описывать функциональность до написания самой функции
- демонстрировать, что функциональность реализована, как это и требовалось (заказчику, пользователю и\или самому себе)
- рефакторить (усовершенствовать код с целью оптимизации и/или для улучшения читабельности) без опасения нарушения функциональности

Такой способ разработки идеально подходит для решения задач, например здесь: http://acmp.ru/?main=tasks

Процесс установки не требует сборки cppunit вручную, так как этот пакет входит в состав Cygwin (Cygwin - набор инструментария для разработчика). Нам нужно будет только установить пакеты из набора Cygwin и среду NetBeans (которая позволяет автоматически создавать cppunit-тесты). Ещё создадим проект для демонстрации разработки через тестирование. Опишу пошагово весь процесс. Начну с самого начала. Допустим у нас нет ничего для разработки.

- скачиваем и запускаем "setup-x86.exe" (или "setup-x86_64.exe"): http://cygwin.com/

- на следующих рисунках показаны этапы установки (к последнему рисунку прилагается список пакетов, которые нужно выбрать для установки)












Последний раз редактировалось 8Observer8; 04.01.2014 в 15:57.
8Observer8 вне форума Ответить с цитированием
Старый 04.01.2014, 15:21   #16
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Список пакетов, которые нужно выбрать как на следующем рисунке (mingw-gcc-g++ - выбирать не нужно! он выбран для примера)

- cppunit: C++ unit testing framework
- gcc-core: GNU Compiler Collection (C, OpenMP)
- gcc-g++: GNU Compiler Collection (C++)
- gdb: The GNU Debugger
- make: The GNU version of the 'make' utility



- нажимаем кнопку "Next" и соглашаемся с установкой всех зависимостей

- дожимаемся окончания установки

- для работы среды NetBeans нужно Java-окружение. Устанавливаем: http://java.com/

- скачиваем и устанавливаем NetBeans (я предпочитаю английскую версию) https://netbeans.org/downloads/

- запускаем NetBeans и в меню выбираем "Tools" -> "Options" -> в верхней части выбираем "C/C++"

- нажимаем кнопку "Add..." -> нажимаем кнопку "Browser" и выбираем путь "C:\cygwin64\bin" (при необходимости выбираем из выпадающего списка с названием "Tool Collection Family" - выбираем "Cygwin 4.x") Выглядит это так:



- теперь протестируем, для этого решим задачу: http://acmp.ru/index.asp?main=task&id_task=25

- в меню выбираем "File" -> "New Project..."

- выбираем, как на рисунке:



- нажимаем кнопку "Next" -> вводим имя проекта: acmp_0025_less_more -> нажимаем кнопку "Finish"

- в файл "main.cpp" копируем (на данном этапе, функция для решения задачи (т.е. "less_or_more()") - это просто "заглушка", т.е. она не обрабатывает входные данные, а просто возвращает фиксированный результат):

Код:
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

int less_or_more(int first, int second) {
    return 0;
}

int main(int argc, char** argv) {
    string inFileName = "input.txt";
    ifstream in;
    in.open(inFileName.c_str());
    if (!in.is_open()) {
        cerr << "Error: Could not open file " << inFileName.c_str() << endl;
        return 1;
    }

    string outFileName = "output.txt";
    ofstream out;
    out.open(outFileName.c_str());
    if (!out.is_open()) {
        cerr << "Error: Could not open file " << outFileName.c_str() << endl;
        in.close();
        return 1;
    }
    
    int first, second;
    
    if (in >> first >> second) {
        int result = less_or_more(first, second);
        if (result > 0) {
            out << ">" << endl;
        } else if (result < 0) {
            out << "<" << endl;
        } else {
            out << "=" << endl;
        }
    } else {
        cerr << "Error: incorrect data in the file " << inFileName.c_str() << endl;
        in.close();
        out.close();
        return 1;
    }
    
    in.close();
    out.close();
    return 0;
}
- кликаем правой кнопкой мыши по файлу "main.cpp" -> выбираем "Create Test" -> "New CppUnit Test...", как на рисунке:

8Observer8 вне форума Ответить с цитированием
Старый 04.01.2014, 15:22   #17
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

- ставим галочку напротив функции "less_or_more(int,int)", как на рисунке:



- нажимаем кнопку "Next" -> нажимаем кнопку "Finish"

- заменяем содержимое файлов "newtestclass.h" и "newtestclass.cpp" следующим:

newtestclass.h
Код:
#ifndef NEWTESTCLASS_H
#define	NEWTESTCLASS_H

#include <cppunit/extensions/HelperMacros.h>

class newtestclass : public CPPUNIT_NS::TestFixture {
    CPPUNIT_TEST_SUITE(newtestclass);

    CPPUNIT_TEST(testLess_or_more_001);
    CPPUNIT_TEST(testLess_or_more_002);
    CPPUNIT_TEST(testLess_or_more_003);
    CPPUNIT_TEST(testLess_or_more_004);
    CPPUNIT_TEST(testLess_or_more_005);
    CPPUNIT_TEST(testLess_or_more_006);
    CPPUNIT_TEST(testLess_or_more_007);
    CPPUNIT_TEST(testLess_or_more_008);
    CPPUNIT_TEST(testLess_or_more_009);
    CPPUNIT_TEST(testLess_or_more_010);

    CPPUNIT_TEST_SUITE_END();

public:
    newtestclass();
    virtual ~newtestclass();
    void setUp();
    void tearDown();

private:
    void testLess_or_more_001();
    void testLess_or_more_002();
    void testLess_or_more_003();
    void testLess_or_more_004();
    void testLess_or_more_005();
    void testLess_or_more_006();
    void testLess_or_more_007();
    void testLess_or_more_008();
    void testLess_or_more_009();
    void testLess_or_more_010();
};

#endif	/* NEWTESTCLASS_H */
newtestclass.cpp
Код:
#include "newtestclass.h"


CPPUNIT_TEST_SUITE_REGISTRATION(newtestclass);

newtestclass::newtestclass() {
}

newtestclass::~newtestclass() {
}

void newtestclass::setUp() {
}

void newtestclass::tearDown() {
}

int less_or_more(int first, int second);

void newtestclass::testLess_or_more_001() {
    int first = 0;
    int second = 0;
    int actual = less_or_more(first, second);
    int expected = 0;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testLess_or_more_002() {
    int first = 5;
    int second = 10;
    int actual = less_or_more(first, second);
    int expected = -1;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testLess_or_more_003() {
    int first = 10;
    int second = 5;
    int actual = less_or_more(first, second);
    int expected = 1;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testLess_or_more_004() {
    int first = -5;
    int second = -10;
    int actual = less_or_more(first, second);
    int expected = 1;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testLess_or_more_005() {
    int first = -10;
    int second = -5;
    int actual = less_or_more(first, second);
    int expected = -1;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testLess_or_more_006() {
    int first = 5;
    int second = -10;
    int actual = less_or_more(first, second);
    int expected = 1;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testLess_or_more_007() {
    int first = -5;
    int second = 10;
    int actual = less_or_more(first, second);
    int expected = -1;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testLess_or_more_008() {
    int first = 2000000000;
    int second = 10;
    int actual = less_or_more(first, second);
    int expected = 1;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testLess_or_more_009() {
    int first = -10;
    int second = 2000000000;
    int actual = less_or_more(first, second);
    int expected = -1;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testLess_or_more_010() {
    int first = 10;
    int second = -2000000000;
    int actual = less_or_more(first, second);
    int expected = 1;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}
- выбираем в меню "Run" -> "Test Project (acmp_0025_less_more)" или нажимаем Alt+F6

- мы увидим результаты тестов:



- отрываем файл "main.cpp" и пишем реализацию функции:

Код:
int less_or_more(int first, int second) {
    int result;
    
    if (first > second) {
        result = 1;
    } else if (first < second) {
        result = -1;
    } else {
        result = 0;
    }

    return result;
}
- выбираем в меню "Run" -> "Test Project (acmp_0025_less_more)" или нажимаем Alt+F6

- результаты тестов:

8Observer8 вне форума Ответить с цитированием
Старый 04.01.2014, 16:07   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может немного не в тему, но ктонить разбирался с тестами в MSVC++?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.04.2014, 16:42   #19
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Фреймворк QTest не поддерживает ни тестирование исключений, ни сравнение вещественных результатов, ни Mock-объектов. Здесь инструкция по самому продвинутому TDD-фреймворку на C++ - http://www.prog.org.ru/topic_26944_0.html

Последний раз редактировалось 8Observer8; 30.04.2014 в 07:58.
8Observer8 вне форума Ответить с цитированием
Старый 26.06.2014, 09:32   #20
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Написал пример: http://www.prog.org.ru/index.php?top...4685#msg194685
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка, отладка, тестирование и документирование программ на Паскале Химия Помощь студентам 0 18.12.2011 23:19
статья - Test-Driven Development для Java(TDD, разработка через тестирование) на практике. Pblog Обсуждение статей 0 16.06.2011 23:10
Пользование cppunit? mike_tihomirov Общие вопросы C/C++ 0 15.04.2010 23:56
Тесты CPPUNIT Lazio Помощь студентам 0 13.12.2009 13:18
Разработка тестов CPPUNIT Lazio Фриланс 1 11.12.2009 00:55