Dodavanje testova
Postoje dva glavna načina testiranja koda vašeg dodatka za Qt Creator a temeljenog na C++:
Oba imaju svoje specifične slučajeve upotrebe i postavke koje su opisane u sljedećim odjeljcima.
Postavljanje CMakea
Prije dodavanja testova pripremite svoje build datoteke. One moraju pretraživati ovisnost o QtTest u i imati CMake opciju za izgradnju vašeg dodatka s testovima:
# Add a CMake option that enables building your plugin with tests.
# You don't want your released plugin binaries to contain tests,
# so make that default to 'NO'.
# Enable tests by passing -DWITH_TESTS=ON to CMake.
option(WITH_TESTS "Builds with tests" NO)
if(WITH_TESTS)
# Look for QtTest
find_package(${QtX} REQUIRED COMPONENTS Test)
# Tell CMake functions like add_qtc_plugin about the QtTest component.
set(IMPLICIT_DEPENDS Qt::Test)
# Enable ctest for auto tests.
enable_testing()
endif()Testovi dodatka
Testovi dodatka duboko su integrirani u vaš dodatak i njegovu interakciju s Qt Creator. Da biste dodali test za nešto što zahtijeva postavljanje infrastrukture Qt Creator ili vašeg dodatka, napišite test dodatka.
Testovi dodatka izvršavaju se pokretanjem Qt Creator s argumentom naredbenog retka -test <pluginname>. Qt Creator zatim u potpunosti učitava vaš dodatak i sve dodatke na koje on ovisi, prolazeći kroz normalni životni ciklus dodatka. Nakon što su vaš dodatak i sve ovisnosti u potpunosti inicijalizirani, vaši se testovi izvršavaju. Nakon toga se Qt Creator automatski zatvara. Stoga vaši testovi dodatka imaju pristup svim izvezanim funkcionalnostima svih dodataka Qt Creator na koje vaš dodatak ovisi, poput Core::ICore. Koristite uobičajene testne makroe QtTest, poput QVERIFY ili QCOMPARE, za izvještavanje o uspjehu ili neuspjehu vašeg testa.
Da biste dodali testove dodatka, dodajte klasu temeljenu na QObject s privatnim slotovima za vaše testove i registrirajte je pomoću ExtensionSystem::IPlugin::addTest() u metodi ExtensionSystem::IPlugin::initialize() vašeg dodatka. Zaštitite sav kod vezan uz testiranje provjerom WITH_TESTS kako biste izbjegli slanje binarne verzije vašeg dodatka s testnim funkcijama.
Uključite QtTest:
#ifdef WITH_TESTS #include <QtTest> #endif
Zatim implementirajte testne funkcije:
#ifdef WITH_TESTS class MyPluginTests : public QObject { Q_OBJECT private slots: void testMyTest() { // a failing test QVERIFY(false); } }; #endif
Registrirajte svoj test u ExtensionSystem::IPlugin::initialize():
#ifdef WITH_TESTS addTest<MyPluginTests>(); #endif
Ako ste deklarirali testni objekt u izvornoj datoteci, kao u ovom primjeru, također uključite i datoteku .moc, koja je potrebna za Qt-ov meta-objekt kompajler:
#ifdef WITH_TESTS #include "example.moc" #endif
Automatski testovi
Za dodavanje testa koji ne ovisi o pokrenutoj infrastrukturi Qt Creator, upotrijebite auto-test koji postoji neovisno o vašem sučelju dodatka. Parseri su čest primjer, ali na ovaj način možete testirati mnogo toga ako je napisano modularno.
Iako vaš test ne boravi u sučelju vašeg dodatka, kao i kod testova dodataka, i dalje možete povezati test s bibliotekama, pa čak i s bibliotekom vašeg dodatka, kako biste izbjegli dupliciranje koda ili dupliciranu kompilaciju koda.
U načelu možete koristiti bilo koji okvir za automatsko testiranje, ali QtTest je jednostavan okvir koji se dobro integrira s Qt-om, a također se koristi i za testove dodataka.
Da biste dodali svoj test, dodajte C++ datoteku testa i upotrijebite add_qtc_test u svojoj CMake datoteci za dodavanje cilja testa. Ako vaš test koristi vašu biblioteku dodatka, dodajte je kao ovisnost pomoću DEPENDS.
U sljedećem primjeru dodatak izvozi funkciju addOne:
#pragma once #include "example_global.h" namespace Example { int EXAMPLE_EXPORT addOne(int i); } // namespace Example
I implementira je u izvornoj datoteci:
int addOne(int i) { return i; // that is wrong! }
Test se povezuje s ciljem biblioteke dodatka pomoću DEPENDS:
# conditionally add auto tests
if(WITH_TESTS)
add_qtc_test(tst_mytest
SOURCES tst_mytest.cpp
DEPENDS Example
)
endif()Test temeljen na QtTest zatim uključuje glavu iz plugina i testira funkciju:
#include "examplefunctions.h" #include <QtTest> class tst_MyTest : public QObject { Q_OBJECT private slots: void mytest(); }; void tst_MyTest::mytest() { // a failing test QCOMPARE(Example::addOne(1), 2); } QTEST_GUILESS_MAIN(tst_MyTest) #include "tst_mytest.moc"
Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.