Какие файлы .cpp и .h необходимы для создания тестов CPPUnit в существующем проекте? - PullRequest
0 голосов
/ 17 ноября 2011

Я хочу добавить некоторые тесты в мое приложение, однако я не знаю, как это сделать и что нужно. Мне удалось выполнить базовый тест, просто создав сам тест, но я не могу сделать это, добавив его в проект. Вот тесты, которые работали, если я создал свой собственный проект для тестов.

Test1.h

#pragma once
#include <C:\cppunit-1.12.1\cppunit-1.12.1\include\cppunit\extensions\HelperMacros.h>
class Test1 : public CPPUNIT_NS::TestCase
{
        CPPUNIT_TEST_SUITE(Test1);
        CPPUNIT_TEST(testStringAssert);
        CPPUNIT_TEST_SUITE_END();

public:

    Test1(void);
    ~Test1(void);

    void testStringAssert ();
};

Test1.cpp

#include "Test1.h"
#include "string"

CPPUNIT_TEST_SUITE_REGISTRATION(Test1);

Test1::Test1(void)
{
}

Test1::~Test1(void)
{
}
void Test1::testStringAssert(){
    std::string s1 = "1234567";
    std::string s2 = "1234567";
    CPPUNIT_ASSERT_EQUAL(s1, s2);

}

CPPUnitMain.cpp (взят из папки примеров CPPUnit)

#include <cppunit/CompilerOutputter.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/TestRunner.h>
#include <cppunit/TextTestProgressListener.h>
#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/XmlOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <stdexcept>
#include <fstream>


int 
main( int argc, char* argv[] )
{
  // Retreive test path from command line first argument. Default to "" which resolve
  // to the top level suite.
  std::string testPath = (argc > 1) ? std::string(argv[1]) : std::string("");

  // Create the event manager and test controller
  CPPUNIT_NS::TestResult controller;

  // Add a listener that colllects test result
  CPPUNIT_NS::TestResultCollector result;
  controller.addListener( &result );        

  // Add a listener that print dots as test run.
#ifdef WIN32
  CPPUNIT_NS::TextTestProgressListener progress;
#else
  CPPUNIT_NS::BriefTestProgressListener progress;
#endif
  controller.addListener( &progress );      

  // Add the top suite to the test runner
  CPPUNIT_NS::TestRunner runner;
  runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );   
  try
  {
    CPPUNIT_NS::stdCOut() << "Running "  <<  testPath;
    runner.run( controller, testPath );

    CPPUNIT_NS::stdCOut() << "\n";

    // Print test in a compiler compatible format.
    CPPUNIT_NS::CompilerOutputter outputter( &result, CPPUNIT_NS::stdCOut() );
    outputter.write(); 

// Uncomment this for XML output
    std::ofstream file( "tests.xml" );
    CPPUNIT_NS::XmlOutputter xml( &result, file );
    xml.setStyleSheet( "report.xsl" );
    xml.write();
    file.close();
  }
  catch ( std::invalid_argument &e )  // Test path not resolved
  {
    CPPUNIT_NS::stdCOut()  <<  "\n"  
                            <<  "ERROR: "  <<  e.what()
                            << "\n";
    return 0;
  }

  return result.wasSuccessful() ? 0 : 1;
}

1 Ответ

2 голосов
/ 17 января 2012

Немного сложно начать.Лучший способ, который я использовал, - это установить связь между двумя проектами, исходным реальным проектом (я назову его RealProject) и тестовым проектом (назову этот TestProject.) Ваш реальный код будет продолжать житьв вашем RealProject.vcproj, но вам нужно добавить второй проект для размещения вашего тестового кода.

Откройте файл решения, содержащий ваш RealProject.Создайте новый проект в своем решении и назовите его TestProject.В тестовом проекте вы добавите свой тестовый код CppUnit и свою основную функцию (как у вас было выше).Если вы построите его сейчас, он должен потерпеть неудачу.Добавьте необходимые свойства, чтобы получить его по ссылке.Откройте свойства TestProject и на экране компоновщика / ввода измените поле «Дополнительные зависимости».Добавьте соответствующий файл .LIB из CppUnit (например, TestRunner.lib). Прежде чем продолжить, получите приведенный выше пример кода для сборки и компоновки.Подумайте небольшими шагами.

Теперь снова откройте свойства TestProject и на экране компоновщика / ввода измените значение «Дополнительные зависимости».В этот список добавьте объектные файлы реального проекта, которые содержат код, который вы хотите протестировать.Например, если RealProject имеет Foo.cpp, содержащий некоторые методы, которые вы хотите протестировать, вы бы добавили $ (SolutionDir) RealProject \ Debug \ obj \ Foo.obj. Конечно, при условии, что это правильный относительный путь к вашим объектным файлам.У вас могут быть разные пути для разных сборок, например, выпуск, x64 или что-то еще.Сначала работайте с одной версией, затем примените свои новые знания, чтобы правильно построить другие версии.

Теперь добавьте класс тестового набора в TestProject (назовите его FooTest.cpp), чтобы протестировать методы в модуле Foo.cpp.,Убедитесь, что он создает, ссылки и работает.Теперь вы проводите модульное тестирование своего первого кода!Поздравляем!

Возможно, вы захотите перестроить тесты при изменении исходного кода.Щелкните правой кнопкой мыши папку проекта TestProject и выберите «Зависимости проекта».Добавьте галочку напротив RealProject.Теперь, если вы выберете TestProject и соберете его, он удостоверится, что RealProject будет построен первым.

Если вы хотите сделать это один раз и забыть об этом, вы можете использовать подстановочный знак для всей папки объектного файла, например так:

$(SolutionDir)RealProject\Debug\obj\*.obj

Таким образом, каждый модуль, добавляемый вами в RealProject, может иметь написанный модульный тест, не вмешиваясь в настройки проекта.

Одним из преимуществ этого является то, что он всегда проверяет ваш фактический, фактический, скомпилированныйкод.Нет «подделки» компилятора, нет второй компиляции вашего исходного кода для тестирования, это действительный тест вашего живого кода.Другое преимущество состоит в том, что, сохраняя тестовый код в отдельном проекте, вы не случайно отправили свои юнит-тесты.Они скомпилированы в совершенно отдельную папку, которую вы не могли бы упаковать и доставить своим клиентам.

Честно говоря, было бы намного проще, чем эта.Я хотел бы, чтобы это было встроено в IDE, и автоматически управляло бы всей бухгалтерией, ссылками и прочим.Все, что упростит тестирование, увеличит шансы того, что разработчики действительно будут его использовать.

...