Pertanyaan Cara menyusun proyek sambil menguji unit aplikasi Qt oleh QTestLib


Saya mendapat proyek Qt dan saya menggunakan Qt Creator. Saya ingin menguji unit semua kode saya.
Namun saya cukup baru di kerangka QTestLib tetapi semua orang merekomendasikannya untuk menguji sumber berbasis Qt. Sekarang saya sedikit bingung bagaimana menyusun proyek uji dengan proyek aplikasi.

  1. Bisakah saya memasukkan semua kode sumber dan pengujian dalam proyek yang sama? Jika ya, bagaimana saya bisa mengelolanya? Saya tidak menemukan opsi apa pun yang memungkinkan saya memulai aplikasi atau memulai pengujian dalam satu proyek.
  2. Jika saya memasukkan kode sumber dan pengujian aplikasi dalam proyek terpisah, proyek pengujian akan mereferensikan proyek aplikasi, itu tidak cukup nyaman.
  3. Untuk banyak kelas yang perlu diuji, bagaimana cara mengelola kode pengujian?

Bagaimana Anda mengelola kode pengujian dalam situasi seperti ini? Terima kasih.


32
2017-08-28 07:54


asal


Jawaban:


Sumber struktur pertama seperti di bawah ini:

MyApp
MyAppUnitTest

Dibawah MyApp proyek, gunakan a MyAppSrc.pri untuk mencari file sumber:

SOURCES += \
    ../../../framework/src/myapp.cpp \
    ../../../framework/src/mycontrol.cpp

HEADERS += \
    ../../../framework/inc/myapp.h \
    ../../../framework/inc/mycontrol.h

INCLUDEPATH += ../../../framework/extlibs

Termasuk ini .pri di MyApp.pro seperti:

include(MyAppSrc.pri)

Kemudian struktur proyek pengujian persis seperti proyek utama, dengan satu tambahan termasuk dalam MyAppUnitTest.pro:

include(MyAppUnitTestSrc.pri)
include(../MyApp/MyAppSrc.pri)

15
2017-12-25 02:46



Saya menggunakan pendekatan ini: http://xilexio.org/?p=125

Yaitu, tempatkan a test konfigurasi dalam single .pro file yang membangun segalanya. Hierarki file:

myproject.pro
src/
    Example1.cpp
    Example2.cpp
    Example1.h
    Example2.h
test/
    ExampleTest.cpp
    ExampleTest.h

myproject.pro mengajukan:

QT += #needed modules

CONFIG += qt c++11

HEADERS += \
    src/Example1.h \
    src/Example2.h

SOURCES += \
    src/Example1.h \
    src/Example2.h

test{
    message(Configuring test build...)

    TEMPLATE = app
    TARGET = myapptests

    QT += testlib

    HEADERS += \
        test/ExampleTest.h

    SOURCES += \
        test/ExampleTest.cpp
}
else{
    TEMPLATE = lib
    TARGET = myapp

    CONFIG += plugin

    TARGET = $$qtLibraryTarget($$TARGET)
}

Dalam contoh saya, saya sedang membangun pustaka plugin, tetapi metode ini juga harus berfungsi untuk aplikasi. Dalam kasus aplikasi, sangat mungkin itu SOURCES -= src/main.cpp diperlukan di bawah else klausa, perpustakaan plugin tidak memilikinya. Jika ini tidak dilakukan, main() aplikasi akan berbenturan dengan main() dari tes unit.

ExampleTest.cpp terlihat seperti berikut:

#include "ExampleTest.h"

void ExampleTest::exampleTest(){
    //Do the tests
}

QTEST_MAIN(ExampleTest)

ExampleTest.h terlihat seperti berikut:

#include <QtTest/QtTest>

class ExampleTest : public QObject {
Q_OBJECT

private slots:
    void exampleTest();
};

Untuk membuat tes proyek, di direktori terpisah dari build reguler, jalankan:

qmake path/to/myproject.pro "CONFIG += test"

7
2018-04-29 09:25



Saya suka jawaban yang lain tetapi saya juga ingin memberikan umpan balik tentang bagaimana kami melakukan ini di perusahaan tempat saya bekerja saat ini:

  1. Membuat subdirs proyek (ini akan menjadi proyek tingkat atas yang akan mengelola SEMUA termasuk proyek perpustakaan Anda atau apa pun yang ingin Anda uji)

    +-----MyProject (top-level subdirs)
    
  2. Tambahkan proyek perpustakaan Anda sebagai sub-proyek

    +-----MyProject (top-level subdirs)
              |
              +-----Library (library project, UI project etc.)
    
  3. Tambahkan yang lain subdirs proyek (untuk tes)

    +-----MyProject (top-level subdirs)
              |
              +-----Library (library project, UI project etc.)
              |
              +-----Tests (subdirs for tests)
    
  4. Membuat QUnitTest proyek menambahkannya ke pengujian subdirs proyek

    +-----MyProject (subdirs)
              |
              +-----Library (library project, UI project etc.)
              |
              +-----Tests (subdirs for tests)
                      |
                      +----- TestA (QUnitTest project for testing feature A)
    
  5. Tambahkan tes sebanyak yang Anda mau

             ...
              |
              +-----Tests (subdirs for test)
                      |
                      +----- TestA (QUnitTest project for testing feature A)
                      |
                      +----- TestB (QUnitTest project for testing feature B)
                      |
                      +----- TestC (QUnitTest project for testing feature C)
                      |
                     ...
                      |
                      +----- TestZ (QUnitTest project for testing feature Z)
    

Jika Anda perlu mengelompokkan tes dalam kelompok, Anda juga dapat menggunakan subdirs untuk melakukannya. subdirs juga memastikan pembuatan nyata direktori dalam sistem file Anda. Jika Anda ingin menghindari terlalu banyak subdirsAnda dapat mengelompokkan tes dalam folder yang telah Anda buat sendiri di sistem file Anda di dalam Tests folder proyek.

Selain itu saya juga merekomendasikan untuk menambahkan subdirs untuk proyek template.

+-----MyProject (subdirs)
          |
          +-----Library (library project, UI project etc.)
          |
          +-----Tests (subdirs for tests)
          |           |
          |          ...
          |
          +-----Templates (subdirs for template projects
                      |
                      +----- TemplateA (template project for feature A)
                      |
                      +----- TemplateB (template project for feature B)
                      |
                      +----- TemplateAB (template project for feature A and B together)
                      |
                     ...
                      |
                      +----- TemplateZ (template project for feature Z)

Ini tentu saja berdasarkan fungsionalitas perpustakaan Anda. Dengan proyek templat, maksud saya adalah widget khusus, dll. Yang menautkan ke pustaka Anda dan memaparkan secara selektif (atau semua) fungsinya dengan cara yang seharusnya ditampilkan kepada pengguna. Sebagai contoh jika Anda memiliki perpustakaan yang mengelola berbagai perangkat kamera Anda dapat membuat proyek template untuk setiap perangkat kamera sehingga memungkinkan bagi pengguna perpustakaan Anda untuk hanya menyalin-tempel proyek template tertentu dan memperluasnya atau setidaknya melihat bagaimana integrasi perpustakaan Anda seharusnya terjadi secara umum. Hal ini memungkinkan pengurangan dokumentasi dan pada saat yang sama memberikan contoh-contoh mandiri yang baik yang seharusnya mengurangi waktu pengembangan yang dihabiskan untuk mencari tahu bagaimana integrasi dan penggunaan pustaka bekerja (Anda dapat mengatakan bahwa ini adalah seperangkat Hello World proyek :)). Last but not least Anda dapat menguraikan solusi untuk berbagai use-cases.


4
2017-11-02 12:40



Saya menggunakan Qt Creator oleh CMake daripada qmake untuk membangun proyek Qt saya.

Pada dasarnya saya harus folder:

src
tests

Setiap tes adalah program tersendiri yang menguji kelas. Aplikasi yang akan diuji dikompilasi sebagai pustaka.. Anda mengkompilasi semua sumber Anda di folder src sebagai pustaka.

// ClassTest.cpp
#include "ClassTest.h"
#include "Class2Test.h" // Class of the app

#include <QtTest/QtTest>

ClassTest::ClassTest( QObject* parent )
    : QObject(parent)
{ 
}

QTEST_MAIN( ClassTest )
#include "ClassTest.moc"

Anda hanya perlu menautkan lib Anda ke eksekusi uji Anda.

Contoh:

di folder src CMakeLists.txt contoh

add_library( MyAPP
    SHARED
    Class2Test.cpp
)
target_link_libraries( MyAPP
    ${QT_LIBRARIES}
)

dalam contoh folder tes CMakeLists.txt, untuk setiap tes.

qt4_automoc( ${test_src} )
add_executable( ${test_name} ${test_src} )
target_link_libraries( ${test_name}
    MyAPP
    ${QT_LIBRARIES}
    ${QT_QTTEST_LIBRARY}
)

Ini masih dalam proyek yang sama tetapi Anda dapat menambahkan bendera untuk membiarkan pengguna mengkompilasi tes atau tidak. Ini bersih karena aplikasi tetap tak tersentuh dan memungkinkan Anda menguji setiap kelas aplikasi Anda.


1
2017-12-21 23:56