【问题标题】:CppUnit, very simple test code crashed, why?CppUnit,很简单的测试代码崩溃了,为什么?
【发布时间】:2011-10-11 14:14:15
【问题描述】:

我正在学习 CppUnit,我的代码在调用 TestRunner::run() 时被转储。这是下面代码中的第 34 行。我看不出有什么不对。它与 CppUnit 食谱中的示例代码几乎相同。

#include <iostream>  
#include <cppunit/TestCaller.h>  
#include <cppunit/TestSuite.h>  
#include <cppunit/ui/text/TestRunner.h>  
using namespace std;  

//class MyFixture: public CppUnit::TestFixture {  
class MyFixture{  
public:  
   MyFixture() {cout<<"MyFixture:: ctor()"<<endl;}  
   ~MyFixture() {cout<<"MyFixture:: dtor()"<<endl;}  
   void setUp() {cout<<"MyFixture::Setup()"<<endl;}  
   void tearDown() {cout<<"MyFixture::tearDown()"<<endl;}  
   void testFunc1() {cout<<"MyFixture::testFunc1()"<<endl; m=1; CPPUNIT_ASSERT(m==1);}  
   void testFunc2() {cout<<"MyFixture::testFunc2()"<<endl; m=2;}  
   int m;  
   static CppUnit::TestSuite * CreateSuite();  
};  

CppUnit::TestSuite * MyFixture::CreateSuite()  
{  
   CppUnit::TestSuite * suite = new CppUnit::TestSuite("My TestSuite for MyFixture");  
   suite->addTest(new CppUnit::TestCaller<MyFixture>("MyFixture::testFunc1", &MyFixture::testFunc1));  
   suite->addTest(new CppUnit::TestCaller<MyFixture>("MyFixture::testFunc2", &MyFixture::testFunc2));  
}  

int main()  
{  
   cout<<"point 1000"<<endl;  
   CppUnit::TextUi::TestRunner runner;  
   runner.addTest(MyFixture::CreateSuite());  
   cout<<"point 7000"<<endl;  
/*Line34*/   runner.run();  


   cout<<"point 8000"<<endl;  
}  

输出:

  cppunit$ ./test_runner   
  point 1000  
  MyFixture:: ctor()  
  MyFixture:: ctor()  
  point 7000  
  Segmentation fault (core dumped)  

堆栈跟踪:

(gdb)bt  
-0  0x00733cc9 in CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult*) ()  
   from /usr/lib/libcppunit-1.12.so.1  
-1  0x0073170a in CppUnit::TestResult::runTest(CppUnit::Test*) () from /usr/lib/libcppunit-1.12.so.1  
-2  0x00733af0 in CppUnit::TestRunner::run(CppUnit::TestResult&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /usr/lib/libcppunit-1.12.so.1  
-3  0x00736d2b in CppUnit::TextTestRunner::run(CppUnit::TestResult&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /usr/lib/libcppunit-1.12.so.1  
-4  0x00736da2 in CppUnit::TextTestRunner::run(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, bool, bool) () from /usr/lib/libcppunit-1.12.so.1  
-5  0x080494dd in main () at test_runner.cpp:34  

编译行:g++ -g -o -Wall test_runner test_runner.cpp -lcppunit
它编译成功,没有任何警告。
如果我打开“-Wall”,它会报错:

......
(.data+0x4): multiple definition of `__dso_handle'  
/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/crtbegin.o:(.data+0x0): first defined here  
test_runner: In function `_init':  
(.init+0x0): multiple definition of `_init'  
/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../crti.o:(.init+0x0): first defined here  
/tmp/ccgzqvu9.o: In function `MyFixture::CreateSuite()':  
/home/fzhao/temp/cppunit/test_runner.cpp:22: multiple definition of `MyFixture::CreateSuite()'  
test_runner:/home/fzhao/temp/cppunit/test_runner.cpp:22: first defined here  
/tmp/ccgzqvu9.o: In function `main':  
/home/fzhao/temp/cppunit/test_runner.cpp:29: multiple definition of `main'  
test_runner:/home/fzhao/temp/cppunit/test_runner.cpp:29: first defined here  
/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/crtend.o:(.dtors+0x0): multiple definition of `__DTOR_END__'  
test_runner:(.dtors+0x4): first defined here  
/usr/bin/ld: warning: Cannot create .eh_frame_hdr section, --eh-frame-hdr ignored.  
/usr/bin/ld: error in test_runner(.eh_frame); no .eh_frame_hdr table will be created.  
collect2: ld returned 1 exit status  
make: *** [test_runner] Error 1  

【问题讨论】:

  • 它是崩溃了,还是没有构建?选择一个。

标签: c++ unit-testing cppunit


【解决方案1】:

假设函数的签名是:

CppUnit::TestSuite * MyFixture::CreateSuite()

你不应该返回什么吗(suite 是我的第一个猜测)?

不返回任何东西,行:

runner.addTest(MyFixture::CreateSuite());

将为您的runner 添加一个非常狡猾的指针。


您在插入 -Wall 时可能遇到这些错误的原因是:

g++ -g -o -Wall test_runner test_runner.cpp -lcppunit
       \______/ \___________________________________/

将尝试通过将test_runnertest_runner.cppcppunit 库链接在一起,将您的可执行文件输出到文件-Wall。也许您打算输入:

g++ -g -Wall -o test_runner test_runner.cpp -lcppunit
             \____________/ \_______________________/

(我在这里假设您给出的编译行是发生错误的行,因为它实际上 -Wall 在其中)。

【讨论】:

  • 但是,为什么当我打开“-Wall”时,g++ 给出了这么多错误并且失败了?它报告了 main()、_init、_dso_handle 的“多重定义”?现在这是我的主要问题。我将编辑帖子以反映这一点。
  • @John,请参阅我的第二部分。如果你有-Wall,你说你有它,你正在尝试组合test_runner可执行文件,test_runner.cppcppunit库。由于可执行文件已经定义了一切,你会得到重复的符号错误。更改它,使-otest_runner 相邻,并按此顺序。
  • 又来了。这又是一个愚蠢的错误。感谢您的帮助
  • 没问题,@John。就一件事。从根本上改变你的问题通常不是一个好主意,因为它会“破坏”已经完成的答案。无论如何 augment 那里的信息(通过添加另一个代码块)但将 return 语句添加到现有代码意味着问题/答案不再匹配,使它们对未来的访问者无用。我已回复问题以解决此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多