CppUnit: запустить один тестовый случай - PullRequest
1 голос
/ 13 декабря 2011

In http://cppunit.sourceforge.net/doc/lastest/cppunit_cookbook.html

Они дают простой TestCase, но не показывают, как его запустить (функции main нет).Я просмотрел их документацию и не могу найти, как просто запустить тест и получить текстовый вывод о том, удалось ли ему.Я не хочу собирать приборы или использовать реестр или что-то в этом роде.

Как мне запустить этот отдельный контрольный пример?IE Что это за функция main, которая будет с этим работать?

Ответы [ 3 ]

2 голосов
/ 23 октября 2012

Я так понимаю, вы просили SSCCE CppUnit.Так как CppUnit является фреймворком, минимальный пример должен поместить минимальную тестовую структуру на место - как TestFixture, потому что в противном случае можно обойтись без всего CppUnit и просто использовать std::assert.Все это может быть сделано в одном файле, скажем Main.cpp следующей формы:

//Declaration file: MTest.h
#ifndef MTEST_H
#define MTEST_H
#include <cppunit/extensions/HelperMacros.h>

class MTest : public CPPUNIT_NS::TestFixture
{
  CPPUNIT_TEST_SUITE(MTest);
  CPPUNIT_TEST(simpleTest);
  CPPUNIT_TEST_SUITE_END();
public:
  void simpleTest();
};
#endif  // MTEST_H

//////////////////////////////////////
// Implementation file, e.g. MTest.cpp
#include <cppunit/config/SourcePrefix.h>
//#include "MTest.h"

// Registers the fixture into the 'registry'
CPPUNIT_TEST_SUITE_REGISTRATION(MTest);

// Some code to be tested.
void MTest::simpleTest() {
  CPPUNIT_ASSERT_EQUAL(1, 2);
}

/////////////////////////////////////
// Main file, Main.cpp
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>

int main(int argc, char* argv[])
{
  CPPUNIT_NS::TextUi::TestRunner runner;   //the runner
  // Get the top level suite from the registry
  CPPUNIT_NS::Test* suite = 
      CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest();
  // Adds the test to the list of test to run
  runner.addTest(suite);  
  // Run the test.
  bool wasSucessful = runner.run();
  // Return error code 1 if the one of test failed.
  return wasSucessful ? 0 : 1;
}

, который необходимо скомпилировать / связать с библиотекой cppunit, например, g++ Main.cpp ../../src/cppunit/.libs/libcppunit.a (если вы начинаетеНа 2 уровня ниже основного каталога библиотеки [вставьте статическую или динамическую версию библиотеки libcppunit в соответствии с требованиями вашей среды]).

Например, «чистый» разделит код на отдельные MTest (.h и .cpp, как указано) и Main.cpp.В этом случае методы CppUnit из Main.cpp вызывают методы, предоставляемые вспомогательными макросами CppUnit в MTest файлах.Поэтому они должны быть связаны друг с другом, например, g++ MTest.o Main.o ../../src/cppunit/.libs/libcppunit.a.

0 голосов
/ 16 февраля 2012

Страница, на которую вы ссылаетесь, описывает весь процесс, включая множество дополнительных сведений о том, как вы вручную пишете код в TestFixtures, затем о том, как зарегистрировать их в TestSuites, и о том, как вы будете использоватьМакросы, чтобы написать и зарегистрировать их, и это очень многословно.Иногда лучше просто показать людям легкий пример.У них есть это в самом низу страницы:

#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>

int main( int argc, char **argv)
{
  CppUnit::TextUi::TestRunner runner;
  CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry();
  runner.addTest( registry.makeTest() );
  bool wasSuccessful = runner.run( "", false );
  return wasSuccessful;
}

Инфраструктура довольно проста, действительно.Вы создаете бегуна тестов, затем извлекаете список зарегистрированных тестов, добавляете их в бегун, заставляете бегуна запускать тесты и отчитываетесь перед вами.Но да, всегда лучше все упростить.Люди не хотят делать сложные вещи.

0 голосов
/ 13 декабря 2011

Базовый класс для всех ваших тестовых классов - CppUnit::TestFixture, вы можете переопределить некоторые функции, такие как setUp и tearDown, чтобы инициализировать ваши тестовые объекты и удалить их.

Предположим, у вас есть тестовый классс именем MyFirstTest, чтобы зарегистрировать тестовые функции в Cpp Framework, вам нужно будет сделать:

CPPUNIT_TEST_SUITE(MyFirstTest);
CPPUNIT_TEST(myTestFunction);
... //any other function you want to register with appropriate macros
CPPUNIT_TEST_SUITE_END();

Также вам нужно будет зарегистрировать каждый тестовый класс (в соответствующем заголовке или файле cpp)

CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(MyFirstTest, "YouTestName");

Как только ваш тестовый класс настроен, вы можете его запустить.Основная функция будет выглядеть следующим образом:

bool wasSuccessful = false;

    try
    {
        CppUnit::TextUi::TestRunner runner;
        runner.setOutputter( new CppUnit::CompilerOutputter(&runner.result(), std::cerr));
        CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry("YouTestName");
        runner.addTest(registry.makeTest());
        wasSuccessful = runner.run("", false);
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        wasSuccessful = false;
    }

Если вы хотите добавить больше тестовых классов, основная функция останется прежней.Вы просто создаете тестовый класс (производный от этого CppUnit::TestFixture класса), регистрируете свои методы, и важным шагом является регистрация вашего класса в фреймворке с использованием CPPUNIT_TEST_SUITE_NAMED_REGISTRATION.Метод getRegistry, используемый в функции main, получит все тестовые классы, которые вы зарегистрировали в framwork, и выполнит все методы тех классов, которые вы зарегистрировали, используя CPPUNIT_TEST или любой другой подходящий макрос.

...