CppUnit создает простой тест

Во-первых, какой класс я использую, если я хочу настроить тест вроде:

class MyClassTests
setup()
teardown()
testDoingSomething()
testDoingA()

Похоже, класс для использования является TestSuite?


Итак, я только что создал очень простой класс:

# ParserUnitTests.h
#include <cppunit\TestFixture.h>;
#include <cppunit\extensions\HelperMacros.h>

class ParserUnitTests : public CppUnit::TestFixture {

public:
void testCanDoUnitTest();
};

И соответствующий ему cpp:

#include "ParserUnitTests.h"
CPPUNIT_TEST_SUITE(ParserUnitTests);

void ParserUnitTests::testCanDoUnitTest() {
CPPUNIT_ASSERT_EQUAL(1, 2, "Expected failure");
}

CPPUNIT_TEST(ParserUnitTests::testCanDoUnitTest);

Я получаю ошибки, как «ожидал декларации» на CPPUNIT_TEST_SUITE линия … кажется очень отличается от того, откуда я родом … более современные языки … как JS / Python … Кажется, здесь это более явно? Я должен сказать CppUnit, какой класс / контрольные примеры для запуска? Хорошо, но что вызывает ошибки?

Код в кулинарной книге CppUnit — это в основном фрагменты, и трудно понять, что требуется для импорта и что нужно делать, где … возможно, кто-то может мне помочь?

1

Решение

С некоторыми небольшими изменениями ваш код должен работать.

// ParserUnitTests.h
#include <cppunit\TestFixture.h>;
#include <cppunit\extensions\HelperMacros.h>

class ParserUnitTests : public CppUnit::TestFixture {

CPPUNIT_TEST_SUITE(ParserUnitTest);
CPPUNIT_TEST(testCanDoUnitTest);
CPPUNIT_TEST_SUITE_END();

public:
void testCanDoUnitTest();
};

CPPUNIT_TEST_SUITE_REGISTRATION( ParserUnitTest );

а также

// ParserUnitTests.cpp
#include "ParserUnitTests.h"
void ParserUnitTests::testCanDoUnitTest() {
CPPUNIT_ASSERT_EQUAL(1, 2, "Expected failure");
}

тогда вам нужен только основной (который я скопировал только из кулинарной книги Cppunit)

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

int main()
{
CppUnit::TextUi::TestRunner runner;
CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry();
runner.addTest( registry.makeTest() );
bool wasSuccessful = runner.run();
return !wasSuccessful;
}

Таким образом, единственное изменение заключается в том, что вам нужно объявить набор тестов в заголовочном файле внутри объявления TestFixture.

2

Другие решения

Вот как я использую CppUnit:

#include "MyClass.hpp"
struct callable
{
void operator()()
{
}
};

class MyClassTest : public CppUnit::TestCase
{
public:
void testEquality()
{
CPPUNIT_ASSERT(1 == 1);
}

void testCreation()
{
MyClass<callable>* tp = new MyClass<callable>(1);
CPPUNIT_ASSERT(tp->done() == true);
delete tp;
}

static CppUnit::Test* suite()
{
CppUnit::TestSuite* suiteOfTests = new CppUnit::TestSuite("MyClassTest");
suiteOfTests->addTest(new CppUnit::TestCaller<MyClassTest>("testEquality",
&ThreadPoolTest::testEquality));
return suiteOfTests;
}
};

А также :

#include <cstdlib>
#include <iostream>
#include <limits>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/XmlOutputter.h>
#include <cppunit/TextOutputter.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>

#include "MyClass.hpp"
int main(int argc, char** argv)
{
CppUnit::TextUi::TestRunner   runner;

runner.addTest(MyClass::suite());

runner.run();

return (EXIT_SUCCESS);
}

Некоторый код отсутствует в основном, но я упростил его, чтобы вы могли видеть важные биты.
Надеюсь это поможет.

1

По вопросам рекламы [email protected]