簡體   English   中英

使用Visual Studio 2010對嵌入式C ++代碼進行單元測試

[英]Unit Test Embedded C++ Code using Visual Studio 2010

我有遺留代碼,我將重構/添加。 代碼是用C ++編寫的,目標是使用Greenhills編譯器的嵌入式設備。 我聽說Visual Studio 2010有更好的測試框架,編寫測試用例所需的工作量更少。 是否可以使用VS2010對嵌入式代碼進行單元測試? 將非常感謝關於如何執行或逐步過程的示例。

如果沒有,CppUnit / CxxTest如何與VS2010集成? 我找不到關於如何實現這一目標的明確文檔。

您可以在Visual Studio中編譯嵌入式軟件。 為平台特定功能創建存根,也為Green Hills細節創建存根(如果有)。 還要注意任何特定的Green Hills宏。 您需要找到或創建等價物。

我在Visual Studio 2008中使用帶有wxWidgets的CppUnit。 我沒有嘗試單獨將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;
}

在上面的示例中,測試類創建要測試的類的實例,然后練習方法。 關鍵點在於測試類與系統隔離或以另一種方式隔離,測試類不會影響被測系統。 將測試代碼放在一個單獨的位置將有助於強調這一概念。 將“嵌入”代碼視為只讀。 對極端情況進行測試,堅持不懈,減少產品退貨數量將是您的回報(並增加公司的利潤)。

HTH。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM