Тестовое ядро ​​CppUnit выгружено, несмотря на успешное тестирование. Зачем? - PullRequest
0 голосов
/ 04 ноября 2018

Итак, я хотел попробовать TDD и настроить CppUnit в качестве тестовой среды. Я читаю поваренную книгу, потому что хочу начать с малого Я просто хочу протестировать публичную факториальную функцию класса Factor. Мой тест прошел успешно, но затем программа неожиданно сбросила дамп памяти, и я понятия не имею, почему. Я использую g ++ на 64-битной Ubuntu 18.04 и CppUnit 1.14.

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$

Почему этот странный дамп памяти и дамп ядра при выполнении контрольного примера?

1 Ответ

0 голосов
/ 04 ноября 2018

Наборы тестов CppUnit удаляют все тестовые объекты в деструкторе. Таким образом, вам нужно распределить тест по основному, а не использовать его непосредственно в стеке.

Точно так же я думаю, что TestRunner также выполняет очистку, поэтому вам нужно также выделить объект TestSuide.

См. Заголовки «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;
}
...