Qt - функция main () ссылочного проекта, охватывающая main () фактического проекта - PullRequest
1 голос
/ 20 марта 2012

Я делаю проект Qt модульных тестов в Qt Creator, который ссылается на файлы из проекта, который я хочу протестировать. Теперь, ссылаюсь ли я на классы, которые я хочу протестировать через файл .pri или добавляя соответствующие файлы непосредственно в переменные SOURCES и HEADERS проекта модульных тестов (а файл .pri, похоже, действительно делает то же самое, он просто содержит SOURCES и Записи заголовков), добавление файлов из основного проекта, по-видимому, перезаписывает файл main.cpp в проекте модульных тестов.

Я имею в виду, что когда я собираю и запускаю исполняемый файл uni tests, запускается функция main() исходного проекта! Если я переименую либо main.cpp в исходном проекте, либо main.cpp в проекте модульных тестов (который изменяет его .pro-файл), то все идет гладко. Ну, я могу жить с таким решением, но оно немного неудобно, потому что однажды в будущем я могу случайно использовать одни и те же имена для некоторых файлов в этих двух проектах, и кто знает, может быть, получит ошибки, которые станут кошмаром для отслеживания , Кроме того, мне просто любопытно, что является причиной такого поведения.

Конечно, файл .pri включает только заголовки классов и файлы cpp, а не main.cpp исходного приложения, например в моем случае:

HEADERS += \
    ../Project/fooclass.h

SOURCES += \
    ../Project/fooclass.cpp

Также оба проекта находятся в каталогах рядом друг с другом, а не во вложенных.

Редактировать: Фрэнк Остерфельд попросил посмотреть про файл моего теста, вот он:

Про файл теста:

QT       += core
QT       -= gui
QT += testlib

TARGET = Tests
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

SOURCES += \
    test_class.cpp \
    main_unit_tests.cpp

HEADERS += \
    AutoTest.h \
    test_class.h \

include(trial.pri)

Trial.pri содержит файлы из основного проекта, который я хочу протестировать. main_unit_tests.cpp (переименован из оригинального main.cpp как специальное решение) содержит:

#include <QtCore/QCoreApplication>
#include "AutoTest.h"

TEST_MAIN

TEST_MAIN определяется в AutoTest.h как

#define TEST_MAIN \
  int main(int argc, char *argv[]) \
  { \
    return AutoTest::run(argc, argv); \
}

Посетите эту страницу для описания того, что делает AutoTest.h. Короче говоря, это немного облегчает запуск нескольких модульных тестов с каркасом Qt.


Edit: профи. Файл основного проекта (то есть, который содержит классы, которые я хочу протестировать):

QT       += core
QT       -= gui

TARGET = Project
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

SOURCES += main.cpp \
    fooclass.cpp

HEADERS += \
    fooclass.h

И он лежит по пути: ... \ Unit_Test \ Project Принимая во внимание, что проект модульных тестов лежит по пути: ... \ Unit_Test \ Tests Сейчас все работает хорошо, так как файлы, определяющие main(), различны в обоих проектах. Как только я переименую их, чтобы они были одинаковыми, проекты модульных тестов оправдывают основную функцию исходного проекта.

Ответы [ 2 ]

0 голосов
/ 20 марта 2012

Утилита GNU make не самая лучшая.

Если ваши файлы obj как для реальных приложений, так и для тестовых проектов созданы в одной папке, возможно, что неверный main.o будет связан.

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

0 голосов
/ 20 марта 2012

Имена файлов не имеют значения, важно то, сколько функций main () включено в сборку вашего модульного теста. Не включайте main.cpp вашего реального приложения в ИСТОЧНИКИ проекта модульного тестирования, и все будет в порядке.

...