[英]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.