2016-11-03 66 views
0

我有一個庫(我們稱之爲MyLib),它具有以下結構:QTEST - 編寫基於Qt庫的測試和暴露類

  • mylib_global.h - 確定是否Q_DECL_IMPORTQ_DECL_EXPORT是後面被寫入使用該庫的應用程序時,用於曝光的庫的特定符號的前綴MYLIBSHARED_EXPORT

    #ifndef MYLIB_GLOBAL_H 
    #define MYLIB_GLOBAL_H 
    
    #include <QtCore/qglobal.h> 
    
    #if defined(MYLIB_LIBRARY)  // Set using DEFINES inside MyLib.pro 
    # define MYLIBSHARED_EXPORT Q_DECL_EXPORT 
    #else 
    # define MYLIBSHARED_EXPORT Q_DECL_IMPORT 
    #endif 
    
    #endif // MYLIB_GLOBAL_H 
    
  • MyLib.h - 包含主類還包括各種其他類:

    #include "mylib_global.h" 
    #include "MyLibOtherClass1.h" 
    #include "MyLibOtherClass2.h" 
    
    // Symbol will be exposed to the application that links against MyLib 
    // and can be directly interacted with from the application's code 
    class MYLIBSHARED_EXPORT MyLibMainClass { 
        public: 
         ... 
        private: 
         MyLibOtherClassA ocA; 
         MyLibOtherClass1 oc1; 
         MyLibOtherClass2 oc2; 
         ... 
    } 
    
    // Symbol will not be exposed to the application that links against MyLib 
    // however it is indirectly used through the `MyLibMainClass` 
    class MyLibOtherClassA { 
        ... 
    } 
    
  • 源文件和其他類(報頭+源) - 包含的MyLib底層邏輯的聲明和定義。

正如你可以看到我有一個類的混合 - 有些是在同一個頭文件作爲庫的主類中定義(它控制的所有其他類的實例),其它的是在不同的頭文件。我需要公開的MYLIBSHARED_EXPORT只有很少的類,以便在鏈接時能夠訪問庫的功能。

編寫普通應用程序時,這是完全正確的。但是我決定編寫一些測試(使用Qt測試框架),因爲我經常更改代碼(現在:)),那裏有很多複雜的依賴關係,我想確保在每次更改所有測試後,已經寫好了,功能與預期保持一致。

在編寫測試時,我需要訪問所有類,以確保每個齒輪都朝着正確的方向轉動(即使它沒有暴露在外面)。我如何處理這個問題?我可以在所有課程前添加MYLIBSHARED_EXPORT,但這也可以讓普通用戶看到東西,這只是間接使用。這可以通過使用另一個#define來更精確地調整,這可以通過項目的設置進行設置,並且只有在定義了所有沒有前綴的類時纔會得到一個,否則它們將不會暴露。雖然這個解決方案很可能會做到這一點,但它會產生一個代碼混亂,如果可能的話,我想避免這種混亂。

回答

0

由於很多功能都沒有導出,因此您已經設置了不測試最終可交付成果:您不能只抓取最終產品並在其上運行測試工具。

然後,最簡單的解決方案是將所有標題/源代碼包含到測試工具中。

您可以將源代碼和頭文件列表分解爲單獨的文件,該文件將包含在可交付項目的項目文件以及測試工具中。這在cmake和qmake中都很容易實現。

+0

我決定在'我的圖書館的項目文件中使用'#ifdef'和define。當定義變量時,我導出所有東西,否則只是我實際想要導出的幾個類。您的解決方案當然完全有效。 – rbaleksandar