Во-первых, какой класс я использую, если я хочу настроить тест вроде:
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 — это в основном фрагменты, и трудно понять, что требуется для импорта и что нужно делать, где … возможно, кто-то может мне помочь?
С некоторыми небольшими изменениями ваш код должен работать.
// 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 ®istry = CppUnit::TestFactoryRegistry::getRegistry();
runner.addTest( registry.makeTest() );
bool wasSuccessful = runner.run();
return !wasSuccessful;
}
Таким образом, единственное изменение заключается в том, что вам нужно объявить набор тестов в заголовочном файле внутри объявления TestFixture.
Вот как я использую 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);
}
Некоторый код отсутствует в основном, но я упростил его, чтобы вы могли видеть важные биты.
Надеюсь это поможет.