2012-03-20 22 views
1

我正在Qt Creator中製作一個單元測試Qt項目,該項目引用了我想測試的項目中的文件。現在,無論我是通過.pri文件引用類還是通過將相關文件直接添加到單元測試項目的SOURCES和HEADERS變量(和.pri文件看起來確實也是如此,它只包含SOURCES和HEADERS條目),添加主項目中的文件似乎覆蓋了單元測試項目中的main.cpp。Qt - 涉及項目的main()函數,覆蓋實際項目的main()

我的意思是,當我構建並運行uni測試可執行文件時,原始項目的main()函數將運行!如果我重命名原始項目中的main.cpp或單元測試項目(它更改了.pro文件)中的main.cpp,那麼事情就會順利進行。好吧,我可以接受這樣的解決方案,但它有點不舒服,因爲將來有一天我可能會意外地在這兩個項目中的某些文件中使用相同的名稱,並且誰知道,也許會得到錯誤,這將是追查的噩夢。除了我只是好奇這種行爲的原因是什麼。

當然.pri文件只包含類頭文件和cpp文件,而不是原始應用程序的main.cpp文件,例如,在我的情況下:

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

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

也兩個項目在彼此相鄰,不嵌套目錄。

編輯:Frank Osterfeld要求看我的測試的親文件,所以這裏是:

測試的親文件:

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); \ 
} 

參觀此page對於什麼是描述AutoTest.h的確如此。簡而言之,它使運行多個單元測試與Qt框架少一點麻煩。


編輯: 親。主體工程(即包含我想測試類之一)的文件是:

QT  += core 
QT  -= gui 

TARGET = Project 
CONFIG += console 
CONFIG -= app_bundle 

TEMPLATE = app 

SOURCES += main.cpp \ 
    fooclass.cpp 

HEADERS += \ 
    fooclass.h 

它位於路徑:... \ Unit_Test \項目 儘管單元測試項目位於路徑上。 .. \ Unit_Test \ Tests 現在事情正常工作,因爲定義main()的文件在兩個項目中都不相同。只要我重命名它們以使它們相同,單元測試項目就會執行原始項目的主要功能。

+0

請問您能否同時顯示.pro和.pri。如果兩個項目都在不相關的目錄中,並且不包含基本應用程序的'main()',那麼我很難看到這是如何實現的。 – Koying 2012-03-20 09:58:44

+0

@Koying - 按要求完成 – Puchatek 2012-03-22 02:09:45

+0

我無法看出這種情況會怎樣發生......如果您希望我看得更遠,請提供一個.tar/.zip文件給您完整的源代碼。 – Koying 2012-03-22 09:45:10

回答

0

文件名無關緊要,重要的是單元測試版本中包含多少main()函數。不要在你的單元測試項目的SOURCES中包含你的實際應用的main.cpp,你應該沒問題。

+0

基本應用程序的main.cpp從未包含在單元測試項目的源代碼中。單元應用程序的main.cpp不能被刪除,因爲沒有定義main()函數的文件(除非我在不同的文件中定義了main,這正是我現在所做的)。 – Puchatek 2012-03-20 07:22:11

+0

使用QTEST_MAIN()來定義測試的主要功能。如果不是爲測試而構建的,我不明白基本應用程序的main()函數是如何運行的?你的測試的.pro文件是怎麼樣的? – 2012-03-20 08:16:06

+0

我編輯了包含pro文件的問題。 – Puchatek 2012-03-20 10:14:08

0

GNU make實用程序不是最好的。

如果您的obj文件是針對實際應用程序和測試項目在同一個文件夾中創建的,則可能會鏈接錯誤的main.o

請確保您的測試項目和實際應用項目構建文件夾不同,或者根本不要使用main.cpp文件名兩次。

+0

建立目錄,以及源目錄(當然除了參考文件)是不同的。 – Puchatek 2012-03-20 09:55:03