QTest — написание тестов для библиотеки на основе Qt и предоставление классов

У меня есть библиотека (назовем ее MyLib), которая имеет следующую структуру:

  • mylib_global.h — определяет, стоит ли Q_DECL_IMPORT или Q_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, который можно установить в настройках проекта, и только когда он определен, все классы, у которых нет префикса, получат его, иначе они не будут выставлены. Хотя это решение, скорее всего, поможет, оно создаст беспорядок в коде, которого я хотел бы избежать, если это возможно.


person rbaleksandar    schedule 03.11.2016    source источник


Ответы (1)


Поскольку многие функции не экспортируются, вы уже решили не тестировать окончательный результат: вы не можете просто взять конечный продукт и запустить на нем тестовую систему.

Затем самое простое решение — включить все заголовки/источники в сам тестовый комплект.

Вы можете выделить список исходников и заголовков в отдельный файл, который будет включен в файл проекта для конечного результата и для тестового комплекта. Это легко сделать как в cmake, так и в qmake.

person Kuba hasn't forgotten Monica    schedule 03.11.2016
comment
Я решил пойти с #ifdef с определением внутри файла проекта моей библиотеки. Когда переменная определена, я экспортирую все, иначе только несколько классов, которые я действительно хочу экспортировать. Ваши решения, конечно, совершенно верны. - person rbaleksandar; 07.11.2016