2011-07-05 3 views
0

私のユニットテストプロジェクトの依存関係に問題があります。QTestLib:ターゲットテストの問題=アプリケーション

次のように私のプロジェクト構造は次のとおりです。

MyProject 
    |---MyProject.pro 
    |---src 
    |  |---src.pro 
    |  |---ClassA.h 
    |  |---ClassA.cpp  
    |  |---ClassB.h 
    |  |---ClassB.cpp 
    | 
    |---tests 
     |--tests.pro 
     |--testClassA.cpp 

MyProject.pro:

TEMPLATE = subdirs 
SUBDIRS = src tests 

src.pro:

TEMPLATE = app 
TARGET = someApp 
HEADERS += classA.h classB.h 
SOURCES += classA.cpp classB.cpp 

にClassAはClassA.cppにClassBのを起動するとしましょう:

void ClassA::someFunctionInClassA() 
{ 
    ClassB b; 
} 

今、私はClassAの単体テストをしたいと思います。私はそうする2つの方法を見つけた。 最初に、src-Subプロジェクトをライブラリに変換します(src.proのTARGET = lib)。それから私はtests.proに次の行を追加し、そのすべての罰金:

LIBS += ../libSrc.so 

秒1はtest.proににClassAで使用されるすべてのファイルに名前を付けることです。

TARGET = testclassA 
TEMPLATE = app 
/*...*/ 
HEADERS += ../src/ClassA.h \ 
      ../src/ClassB.h 
SOURCES += testClassA.cpp \ 
      ../src/ClassA.cpp \ 
      ../src/ClassB.cpp 

は、私が最初のソリューション(LIBにSRC-プロジェクトを変換)を使用することはできませんので、私は2番目のいずれかを使用する必要があります。これは私のtests.proがどのように見えることを意味します。私がそれらのうちの1つだけをテストしたいとしても、本当にすべてのソース/ヘッダーに名前を付ける必要はありますか? アドバイスをいただきありがとうございます。

+0

私は*私は* ...最初のソリューションを使用することはできません得ることはありませんが、あなたの質問には、場合'ClassA' *実際には' ClassB'をインスタンス化します。そうすれば、テスト実行ファイルで 'ClassB.cpp'をコンパイルする必要があります。そうしないと、 '未定義参照 'を取得します。 – vrince

答えて

0

私は最初の解決策を使用できません。私はソースコードについてあまり変更してはならないということです。 TARGET =今のアプリはアプリのままでなければなりません。私の唯一の仕事は、ユニットテストをプロジェクトに追加することです。 は私が明示的にすべてのクラスに名前を付けないようにする回避策を見つけました:tests.proで :

SOURCES += $$files(../pathToCppDir/*.cpp) 
HEADERS += $$files(../pathToHppDir/*.h) 
SOURCES -= ../pathToCppDir/main.cpp   // excluding second main(){} 
関連する問題