簡體   English   中英

Qt測試模擬動態鏈接庫

[英]Qt test mock dynamic linked library

我有點困惑如何使用模擬和動態鏈接庫。 讓我們假設一個如下的項目結構

subdirs.pro (subdir project)     
\- app (subdir project)
\-- app (executable, include and use lib)
\-- lib (dynamic library)
\- test (subdir project)
\-- test_app (test the app WITHOUT test lib again)
\-- test_lib (fully test of lib functions)

“ app”正在使用一個庫; 該庫在test_lib項目中進行了測試。

現在,我想測試該應用程序,但是我不想再次測試整個lib的東西(這是愚蠢的,可以不費吹灰之力!)。 因此,我需要某種方法來模擬整個lib。 有人在Qt之前做過此事,可以幫助我嗎? Qt測試框架中可能嗎? 我已經閱讀了很多文章和關於SO的問題,但是對於這個特殊問題,我沒有找到任何解決方案。

我使用基於Qt 5.6.1的Qt Creator 4.0.3,帶有mscv2013的qmake和隨附的Qt測試框架。

正如我在評論中建議的那樣,創建一個僅模擬原始庫的API的庫,這是如何完成的。 假設您在原始庫中有一個帶有一些瑣碎API的Foo類:

class Foo
{
public:
    void doSomething();
    int returnSomething();
private:
    void doSometingElse();
};

要創建模擬庫,您必須遵循與原始庫相同的類層次結構,並保留公共API(可以忽略私有和受保護的東西),以便應用程序也可以針對該模擬庫進行編譯和鏈接。 因此,我們的Foo類將如下所示:

class Foo
{
public:
    // This is just a stub
    void doSomething()
    {
        // Do nothing
    }

    // This is just a stub
    int returnSomething()
    {
        return 0; // Some value
    }
};

您將必須對應用程序使用的所有類執行相同的技巧。 如果要構建用於測試的應用程序,則必須將其鏈接到模擬庫而不是原始庫。 您將不需要更改應用程序的代碼,但是它將調用不會執行任何操作的函數。

注意:這種方法可能並不總是能正常工作,因為您的應用程序行為可能取決於庫函數的工作方式和方式。

更新

另一種方法是保留單個庫,但是要有條件地構建每個公共功能的內容。 在原始庫中使用相同的示例Foo類:

class Foo
{
public:
    void doSomething()
    {
    #ifdef TEST_MODE
        // Do nothing
    #else
        // Do things normally
    #endif
    }

    int returnSomething()
    {
    #ifdef TEST_MODE
        // Return some dummy value
    #else
        // Do the real calculations
    #endif
    }
private:
    void doSometingElse();
};

當您需要構建用於測試的應用程序時,只需使用定義的TEST_MODE預處理程序宏來構建庫。 這樣,您將繞過不必要的庫代碼執行。

暫無
暫無

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

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