尽管测试成功,但 CppUnit 测试核心已转储。为什么?
CppUnit test core dumped despite successful test. Why?
所以我想尝试 TDD 并将 CppUnit 设置为测试环境。我读了这本食谱,因为我想从小处着手。我只是想测试 class 因子的 public 阶乘函数。我的测试运行成功,但程序突然核心转储,我不知道为什么。我在 Ubuntu 18.04 64 位和 CppUnit 1.14 上使用 g++。
testmain.cpp
#include "test1.h"
int main(){
CppUnit::TestCaller <Test1> test ("test", &Test1::testFactorial );
CppUnit::TestSuite suite;
suite.addTest(&test);
CppUnit::TextUi::TestRunner runner;
runner.addTest(&suite);
runner.run( );
return 0;
}
test1.h
#ifndef TEST1_H
#define TEST1_H
#include <cppunit/TestAssert.h>
#include <cppunit/TestCase.h>
#include <cppunit/TestFixture.h>
#include <cppunit/TestCaller.h>
#include <cppunit/TestResult.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/TestSuite.h>
#include "factorial.h"
class Test1 : public CppUnit::TestFixture {
private:
Factor *f_6;
public:
void setUp(){
f_6 = new Factor();
}
void tearDown(){
//to see whether my variable gets freed
std::cout << "delete testvariable\n";
delete f_6;
}
void testFactorial(){
int f6 = f_6->factorial(6);
CPPUNIT_ASSERT(f6 == 720);
}
};
#endif
factorial.h
#ifndef FACTORIAL_H
#define FACTORIAL_H
class Factor{
public:
int factorial(int arg){
int result = 1;
for(int i = 1; i <= arg; i++){
result *= i;
}
return result;
}
};
#endif
命令行输出:
user@computer:~/folder$ make test
g++ -g -Wall -o testexecutable testmain.cpp -lcppunit
user@computer:~/folder$ ./testexecutable
.delete testvariable
OK (1 tests)
free(): invalid size
Aborted (core dumped)
user@computer:~/folder$
为什么在执行测试用例的时候会出现这个奇怪的free and core dump?
CppUnit 测试套件删除析构函数中的所有测试 object。所以你需要在你的 main 中分配一个测试,而不是直接在堆栈上使用一个。
同样,我认为 TestRunner 也会进行清理,因此您也需要分配 TestSuide object。
查看 "Suite" 和 "TestRunner" 标题:
http://cppunit.sourceforge.net/doc/cvs/cppunit_cookbook.html
因此你的主要变成:
int main() {
CppUnit::TestSuite* suite = new CppUnit::TestSuite();
suite->addTest(new CppUnit::TestCaller<Test1>("test", &Test1::testFactorial));
CppUnit::TextUi::TestRunner runner;
runner.addTest(suite);
runner.run();
return 0;
}
所以我想尝试 TDD 并将 CppUnit 设置为测试环境。我读了这本食谱,因为我想从小处着手。我只是想测试 class 因子的 public 阶乘函数。我的测试运行成功,但程序突然核心转储,我不知道为什么。我在 Ubuntu 18.04 64 位和 CppUnit 1.14 上使用 g++。
testmain.cpp
#include "test1.h"
int main(){
CppUnit::TestCaller <Test1> test ("test", &Test1::testFactorial );
CppUnit::TestSuite suite;
suite.addTest(&test);
CppUnit::TextUi::TestRunner runner;
runner.addTest(&suite);
runner.run( );
return 0;
}
test1.h
#ifndef TEST1_H
#define TEST1_H
#include <cppunit/TestAssert.h>
#include <cppunit/TestCase.h>
#include <cppunit/TestFixture.h>
#include <cppunit/TestCaller.h>
#include <cppunit/TestResult.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/TestSuite.h>
#include "factorial.h"
class Test1 : public CppUnit::TestFixture {
private:
Factor *f_6;
public:
void setUp(){
f_6 = new Factor();
}
void tearDown(){
//to see whether my variable gets freed
std::cout << "delete testvariable\n";
delete f_6;
}
void testFactorial(){
int f6 = f_6->factorial(6);
CPPUNIT_ASSERT(f6 == 720);
}
};
#endif
factorial.h
#ifndef FACTORIAL_H
#define FACTORIAL_H
class Factor{
public:
int factorial(int arg){
int result = 1;
for(int i = 1; i <= arg; i++){
result *= i;
}
return result;
}
};
#endif
命令行输出:
user@computer:~/folder$ make test
g++ -g -Wall -o testexecutable testmain.cpp -lcppunit
user@computer:~/folder$ ./testexecutable
.delete testvariable
OK (1 tests)
free(): invalid size
Aborted (core dumped)
user@computer:~/folder$
为什么在执行测试用例的时候会出现这个奇怪的free and core dump?
CppUnit 测试套件删除析构函数中的所有测试 object。所以你需要在你的 main 中分配一个测试,而不是直接在堆栈上使用一个。
同样,我认为 TestRunner 也会进行清理,因此您也需要分配 TestSuide object。
查看 "Suite" 和 "TestRunner" 标题: http://cppunit.sourceforge.net/doc/cvs/cppunit_cookbook.html
因此你的主要变成:
int main() {
CppUnit::TestSuite* suite = new CppUnit::TestSuite();
suite->addTest(new CppUnit::TestCaller<Test1>("test", &Test1::testFactorial));
CppUnit::TextUi::TestRunner runner;
runner.addTest(suite);
runner.run();
return 0;
}