Модульное тестирование встроенного кода C ++ с использованием Visual Studio 2010 - PullRequest
3 голосов
/ 25 марта 2011

У меня есть устаревший код, который я собираюсь изменить / добавить.Код написан на C ++ и предназначен для встроенного устройства с использованием компилятора Greenhills.Я слышал, что Visual Studio 2010 имеет улучшенную среду тестирования и требует меньше усилий для написания тестовых случаев.Можно ли использовать VS2010 для модульного тестирования встроенного кода?Пример того, как это сделать или пошаговая процедура, будет принята с благодарностью.

Если нет, то как CppUnit / CxxTest можно интегрировать с VS2010?Я не смог найти четкую документацию о том, как этого добиться.

1 Ответ

5 голосов
/ 25 марта 2011

Вы можете скомпилировать встроенное программное обеспечение в Visual Studio. Создание заглушек для конкретной функциональности платформы, а также для особенностей Green Hills, если таковые имеются. Также остерегайтесь любых специфических макросов Green Hills. Вам нужно будет найти или создать эквиваленты.

Я использую CppUnit в Visual Studio 2008 с wxWidgets. Я не пытался интегрировать CppUnit с Visual Studio 2010 отдельно.

Имейте в виду, что вы хотите сохранить код проверки отдельно от встроенного кода. Встроенный код должен быть импортирован в ваш проект проверки в виде библиотеки и заголовочных файлов. Это делает тестирование честным (хотя я понимаю, что вы не сможете связать библиотеку Green Hills с библиотекой Visual Studio). В противном случае создайте встроенный код, используя VS, но в качестве отдельной библиотеки на этапе сборки.

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

Редактировать # 1 - Пример

С учетом следующего класса во «встроенном» или реализации:

class Title
{
  public:
                                    Title();
                                    Title(const Title& rc);
    virtual                         ~Title();
    Title&                          operator= (const Title& rt);
    const std::string&              get_table_name(void) const;
    const std::string&              get_title_text(void) const;
    void                            set_table_name(const std::string&);
    void                            set_title_text(const std::string& new_text);
};

Класс тестирования CppUnit будет выглядеть так:

#include "cppunit/extensions/HelperMacros.h"

class Test_Ing_Title
    : public CPPUNIT_NS::TestFixture
{
    //---------------------------------------------------------------------
    //  Friends
    //---------------------------------------------------------------------
    CPPUNIT_TEST_SUITE(Test_Ing_Title);
    CPPUNIT_TEST(ing_name_field_testing);
    CPPUNIT_TEST(copying);
    CPPUNIT_TEST(table_name_testing);
    CPPUNIT_TEST(test_id_field);
    CPPUNIT_TEST(title_testing);
    CPPUNIT_TEST(visitor_test);
    CPPUNIT_TEST_SUITE_END();

    //---------------------------------------------------------------------
    //  Public types
    //---------------------------------------------------------------------
  public:

    //---------------------------------------------------------------------
    //  Public Constructors and Destructors
    //---------------------------------------------------------------------
  public:
    //! Constructor - Default
                                Test_Ing_Title();

    //! Copy Constructor
                                Test_Ing_Title(const Test_Ing_Title& n_obj);

    //! Destructor
    virtual                     ~Test_Ing_Title();

    //---------------------------------------------------------------------
    //  Public Overloaded Operators
    //---------------------------------------------------------------------
  public:

    //---------------------------------------------------------------------
    //  Public Methods
    //---------------------------------------------------------------------
  public:
    //! Test cloning of the title record.
    void                        cloning(void);

    //! Test copying
    void                        copying(void);

    //! Test the name field getters and setters
    void                        ing_name_field_testing(void);

    //! Test the table name getters & setters
    void                        table_name_testing(void);

    void                        tearDown(void);

    //! Test the ID field getters and setters.
    void                        test_id_field(void);

    //! Test the title getters and setters
    void                        title_testing(void);

    //! Test visitors to the title.
    void                        visitor_test(void);
};

Пример метода тестирования:

#include <stdafx.h>     // This line is required for precompiled headers on MSVC++.
#include <cppunit/TestCase.h>
#include <cppunit/extensions/HelperMacros.h>
#include <string>

void
Test_Ing_Title ::
title_testing(void)
{
    static const char           expected_title_text[] = "Ground Beef";
    const std::string           expected_title(expected_title_text);
    std::string             actual_title;
    Ingredient::Records::Title  ing_title;
    ing_title.set_title_text(expected_title);
    actual_title = ing_title.get_title_text();
    CPPUNIT_ASSERT(actual_title == expected_title);
    return;
}

В приведенном выше примере тестовый класс создает экземпляр класса для тестирования, а затем выполняет методы. Ключевым моментом является то, что тестовый класс изолирован от системы или, другими словами, тестовый класс не влияет на тестируемую систему. Размещение тестового кода в отдельном месте поможет подчеркнуть эту концепцию. Считайте «встроенный» код доступным только для чтения. Испытайте себя до крайности, оставайтесь на своем, уменьшенное количество возвратов продукции будет вашей наградой (и увеличит прибыль компании).

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...