【问题标题】:CppUnit creating a simple testCppUnit 创建一个简单的测试
【发布时间】:2012-11-03 14:53:41
【问题描述】:

如果我想设置一个测试,首先我使用的类是什么:

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 行上收到类似“expected a declaration”之类的错误...似乎与我来自的地方大不相同...更现代的语言...例如 JS/Python ... 似乎在这里它更明确?我必须告诉 CppUnit 运行哪些类/测试用例?好的,但是是什么导致了错误?

CppUnit 食谱中的代码主要是snipplets,很难弄清楚需要什么进口以及应该去哪里......也许有人可以指导我?

【问题讨论】:

  • 可能是编译器想要在constant之前声明函数parserUnitTests,试着把函数移到const上面看看会发生什么。
  • 包含路径中的斜线是向后的。

标签: c++ unit-testing 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");
}

那么你只需要一个 main(我只是从 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);
    }
    

    主代码中缺少一些代码,但我对其进行了简化,以便您可以看到重要的部分。 希望这会有所帮助。

    【讨论】:

    • 我从几天开始就在 cppunit 上工作,我有一个小问题。我如何将 3 个或更多 SUITE_REGISTRATION 注册到一个中。即 CPPUNIT_TEST_SUITE_REGISTRATION( ParserUnitTest ) 和 CPPUNIT_TEST_SUITE_REGISTRATION( FormUnitTest ) 并继续。我想将所有这些合并到单个 XML 输出文件中。个别测试用例工作正常。任何建议都会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 2014-08-13
    • 1970-01-01
    • 2010-10-17
    • 2016-07-29
    • 2020-02-21
    相关资源
    最近更新 更多