Соединение в тестовых библиотеках с CppUnit

Этот метод делает то же самое, но немного проще и, возможно, немного более производительно, и, если вы используете отражение, он автоматически пропускает эти кадры. Единственная проблема заключается в том, что он может отсутствовать в JVM не от Sun, хотя он включен в классы выполнения JRockit 1.4 -> 1.6. (Дело в том, что это не публичный класс).

sun.reflect.Reflection

    /** Returns the class of the method <code>realFramesToSkip</code>
        frames up the stack (zero-based), ignoring frames associated
        with java.lang.reflect.Method.invoke() and its implementation.
        The first frame is that associated with this method, so
        <code>getCallerClass(0)</code> returns the Class object for
        sun.reflect.Reflection. Frames associated with
        java.lang.reflect.Method.invoke() and its implementation are
        completely ignored and do not count toward the number of "real"
        frames skipped. */
    public static native Class getCallerClass(int realFramesToSkip);

Что касается значения realFramesToSkip, версии VM для Sun 1.5 и 1.6 java.lang.System, то существует защищенный пакетный метод getCallerClass (), который вызывает sun.reflect.Reflection.getCallerClass(3), но в моем помощнике служебный класс Я использовал 4, так как добавлен фрейм вызова вспомогательного класса.

6
задан dagorym 19 June 2009 в 03:14
поделиться

1 ответ

Добавляя неопределенный символ в main, он просто означает создание любого случайного внешнего символа, чтобы заставить компоновщик искать ваши внешние библиотеки, содержащие тест код.

Например, предполагая две тестовые библиотеки, fred и barney, в fredTestLib.cpp вы просто добавляете эту строку:

int fredDummyInt = 0; // declare a unique symbol for the linker to resolve

, а в barneyTestLib.cpp вы бы добавляете аналогичную строку:

int barneyDummyInt = 0; // a different unique symbol for the linker to resolve

Вы можете компилируйте каждую библиотеку отдельно на разных этапах. Затем в основной тестовой программе вы заставляете компоновщик разрешить их. Так что добавьте эти строки в main.cpp:

extern int fredDummyInt;
extern int barneyDummyInt;
...
main () {
    ...
    fredDummyInt++; // give the linker some symbols to resolve
    barneyDummyInt++;
    ...

Идея (согласно тому, что говорит автор вышеупомянутого трюка) заключается в том, что, поскольку компоновщик уже ищет fredTest.lib для fredDummyInt, он также найдет и разрешит ваши автоматически зарегистрированные тесты.

Примечание: я не пробовал это, чтобы увидеть, работает ли это! Я просто отвечаю на ваш вопрос о внешних компонентах.

Еще один подход, который следует рассмотреть, - это создавать ваши тесты в библиотеках DLL и использовать LoadLibrary () для явного их запуска. Если вы используете MfcUi :: TestRunner, вы могли бы создать небольшой выпадающий графический интерфейс, который позволит вам выбрать библиотеку для загрузки, загрузить ее, затем отобразить тесты для запуска в этой библиотеке, а затем запустить их.

1
ответ дан 17 December 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: