Effektivt testing Qt 5 ved hjelp av Squish Coco.

Effektivt testing Qt 5 ved hjelp av Squish Coco.

Sinebastien Fricker og Amanda Burma.

1. Introduksjon.

Med mer enn tre millioner kodelinjer er Qt 5 en av de storste apen kildekodeprosjektene. Skape en utfordring for alle bidragsytere. Faktisk hvordan kan vi v re sikre pa:

kodeendringer er tilstrekkelig testet? kodeendringer pavirker ikke andre funksjoner? en anmelder kan godkjenne en patch ved a bare lese en grunnleggende diff?

Tiln rmingen til a forvente enhetsproving av en utvikler og la vedlikeholderen eller godkjenningen ta ansvar nar en utvidelse integreres, kan forbedres betydelig av Squish Coco som det:

hjelper Qt-bidragsyteren til a finne omrader som inneholder uprovde deler av koden. hjelper godkjenner verifiser modifikasjonen, er grundig testet og ingen regressjoner eksisterer.

2 System Forutsetninger.

2.1 Installere Squish Coco.

Squish Coco er tilgjengelig i to utgaver:

En ikke-kommersiell utgave som inkluderer en kompilatorutskifting, utforer kodedekningsanalysen og et sett med kommandolinjeverktoy som skaper muligheten til a generere rapporter og manipulere kodedekningsdata. En profesjonell utgave som ogsa inneholder et grafisk brukergrensesnitt, profesjonell stotte og en lisens som utvider bruken sin utover ikke-kommersielle applikasjoner.

For a installere forste pamelding for en evaluering eller permanent lisens:

Denne artikkelen bruker bare Squish Cocos kommandolinjeverktoy, slik at begge utgaver kan brukes.

Etter at du har installert Squish Coco, endrer du sti-variabelen for a fa tilgang til csg ++, erstatning for Squish Coco-kompilatoren, fra kommandolinjen.

2.2 Systemforutsetninger for bygging Qt 5.

Qt 5 avhenger av et viktig sett med biblioteker. En fullstendig beskrivelse av kravene finner du pa Qt hjemmeside: http://qt-project.org/wiki/Building_Qt_5_from_Git.

2.3 Nedlasting av Qt 5 Kilde.

Systemvariabelen $ WORK refererer til arbeidskatalogen. $ QT5 er Qt 5-kilden sjekk ut plassering. Og $ PROCESSORS angir antall tilgjengelige CPU-kjerner.

eksporter PROCESSORS = $ (cat / proc / cpuinfo | grepprosessor | wc -l)

git klon git: //gitorious.org/qt/qt5.git.

git submodule oppdatering.

Avsnittet (over) laster ned hele Qt 5-kilden.

3 Bygg Qt 5 og utfore Unit Test.

Qt 5 gir en kommandolinjebryter som kalles -testcocoon, som tillater instrumentering av Squish Coco & # X1E40; malm nettopp:

Makefile bruker csg ++ i stedet for g ++ for kodegenerering. for hver test av enhetstesting genereres en utforelsesrapport som viser kodedekningen for en test eller en hel testpakke.

Utfor folgende for a kompilere:

-utvikler-bygge-no-gtkstyle-no-pch \

-Opslag -Testcocoon-Confirm-License -prefix $ QT5BASE.

Pa dette stadiet genereres QtBase sammen med $ QT5BASE / lib for hvert generert delt bibliotek en fil med utvidelsen .csmes er produsert. Denne filen inneholder kodedekningsinstrumentet, og inneholder ved ferdigstillelse ogsa kodedekningsrapporten for hver enhetstest.

Utfor folgende for a utfore testpakken: 1.

Na, etter hvert som hver test utfores, blir instrumentasjonsfilene i $ QT5BASE / lib ikke oppdatert, men importerer enhetstestresultater.

4 Kode Dekningsrapport av Qt 5 Biblioteker.

Folgende undertrykker alle dekning rapporter fra uic, moc og rcc verktoy:

finn $ QT5-navn «moc.csexe» -exec rm -v \;

finn $ QT5-navn «uic.csexe» -exec rm -v \;

Folgende importerer utforelsesrapporten (.csexe-filen) for hver enhetstest i instrumentasjonsdatabasen (.csmes-fil):

finn. -name «tst _ *. csexe» | mens du leser LINE.

CSMES = $ (dirname «$ CSEXE») / $ (basenavn «$ CSEXE» .csexe) .csmes.

ekko -n «Generere Unit Test Database $ CSMES.»

cmcsexeimport -m «$ CSMES» -e «$ CSEXE» -t «unittest» -p fusjon.

cmcsexeimport utforer importoperasjonen. Deretter er den importerte utforelsesrapporten ikke lenger nodvendig, og kan fjernes trygt.

Pa dette stadiet eksisterer en instrumenteringsdatabase for hver enhetstest, som inneholder kodedekningsinformasjonen for hver utforelse. Folgende henter og plasserer denne informasjonen i Qt 5-bibliotekene & # X2019; instrumenteringsdatabaser:

for QTLIB i lib / lib * .csmes.

UNITTESTS = $ (finn. -navn «tst _ *. Csmes»)

ekko -n «Importerer Unit Tests Resultat i $ QTLIB.»

cmmerge -o «$ QTLIBTMP» -i «$ QTLIB» $ UNITTESTS.

cmmerge importerer enhetstestresultatene til Qt 5-bibliotekets database. Det ignorerer ogsa kodedekningen i testkoden. Etter denne operasjonen er instrumentasjonsdatabasen for hver enhetstest ikke lenger nodvendig.

Folgende genererer en HTML-rapport fra kodedekningsdatabasen:

for QTLIB i lib / lib * .csmes.

HTML = $ (dirname «$ QTLIB») / $ (basenavn «$ QTLIB» .csmes) .html.

TTTLE = $ (basenavn «$ QTLIB» .csmes)

cmreport -m «$ QTLIB» -s ‘. *’ –html = «$ HTML» –toc –title = «$ TITLE» \

–source = all –method = all –global = all -dead-code \

-bargraph – source-sort = dekning – metode-sort = dekning.

I $ QT5BASE / lib genereres en HTML-rapport for hvert Qt-bibliotek, noe som gjor det mulig a analysere hvilken kildekoden linje ikke var dekket av testpakken.

5 Bruk Squish Coco Qt 5 Development.

A ha en kodetekningsrapport for Qt 5 i sin helhet har ingen reell verdi for en Qt-utvikler: Utvikleren er bare fokusert pa a utvikle en funksjon eller fikse en feil og trenger ikke a v re oppmerksom pa kvaliteten pa hele Qt-prosjektet . I stedet ma utvikleren vite hvordan modifikasjonen kan pavirke prosjektet negativt og hvor godt endringene testes.

5.1 Hacking i Qt 5.

Folgende eksempel viser hvordan Squish Coco kan brukes til a bedre forsta effekten av en endring og den nodvendige testingen: For a stotte & euro; symbol nar du konverterer en Unicode-streng til en Latin-1-kodek, & euro; (unicode 0x20AC) blir konvertert til tegnet & # X2019; E & # X2019 ;.

Endre QLatin1Codec :: convertFromUnicode som folger (modifikasjoner er understreket):

2 int len, ConverterState * state) const.

4 const char erstatning = (state & amp; state-> flags & ConvertInvalidToNull)? 0: ‘?’;

5 QByteArray r (len, Qt :: Uninitialized);

7 int ugyldig = 0;

9 hvis (ch [i] == 0x20AC) // MODIFIKASJON: Euro symbolhandtering.

12 d [i] = erstatning;

19 state-> invalidChars + = ugyldig;

For du lager Qt-biblioteket, gjor du en kopi av gjeldende instrumenteringsdatabase som folger:

cp $ QT5BASE / lib / *. csmes $ QT5REF /

Sa lop gjor a kompilere. $ QT5BASE / lib / libQtCore.so.5.0.0.csmes er oppdatert samtidig som $ QT5BASE / lib / libQtCore.so.5.0.0.so.

Ingen tester blir utfort pa dette stadiet; Men Squish Coco kan analysere hvilken test som pavirkes av modifikasjonen:

cmreport -m «$ QT5REF / libQtCore.so.5.0.0.csmes» -s ‘. *’ –html = «euro_sym.html» \

–toc –title = «Euro symbol stotte» \

–source = all –method = all – global = all \

-bargraph – source-sort = dekning – metode-sort = dekning \

-mr «$ QT5BASE / lib / libQtCore.so.5.0.0.csmes» –execution = all.

euro_sym.html rapport er dekningrapporten for de modifiserte funksjonene, og i vart tilfelle kun QLatin1Codec :: convertFromUnicode-funksjonen. Listen over henrettelser er begrenset til to oppforinger:

tst_QString med 78% dekning tst_QTextStream med 64% dekning.

Dette er de eneste testene som pavirkes av endringen, noe som betyr at alle andre tester er irrelevante. Rapporten (ovenfor) illustrerer ogsa at denne funksjonen ikke er fullstendig dekket av testpakken, og etterlater folgende som vare potensielle regresjoner:

Et tegn som ikke kan samordnes til Latin-1, forblir uprovd (Unicode-verdi storre enn 255) Et null-erstatningskarakter forblir uprovd.

5.2 Enhetstesten.

De to manglende enhetstestene er illustrert nedenfor: en for testing av & euro; symbolkonvertering, og en for testing av andre Unicode-verdier.

Endre $ QT5BASE / tester / auto / corelib / tools / qstring / tst_qstring.cpp og definer to nye spor:

2 tomrom invalidUnicodeConversionToLatin1 ();

Spillekoden er:

3 QTextCodec * codec = QTextCodec :: codecForName («Latin1»);

4 QVERIFY (codec! = NULL);

7 str + = QChar (0x21AC);

8 QByteArray latin1_converted = codec-> fromUnicode (str);

9 QCOMPARE (latin1_converted, QByteArray («?»));

12 tomrom tst_QString :: euroSym ()

14 QTextCodec * codec = QTextCodec :: codecForName («Latin1»);

15 QVERIFY (codec! = NULL);

18 str + = QChar (0x20AC);

19 QByteArray latin1_converted = codec-> fromUnicode (str);

21 QCOMPARE (latin1_converted, QByteArray («E»));

Kjor testpakken igjen:

finn $ QT5-navn «rcc.csexe» -exec rm -v \;

finn $ QT5-navn «moc.csexe» -exec rm -v \;

finn $ QT5-navn «uic.csexe» -exec rm -v \;

finn. -name «tst _ *. csexe» | mens du leser LINE.

CSMES = $ (dirname «$ CSEXE») / $ (basenavn «$ CSEXE» .csexe) .csmes.

ekko -n «Generere Unit Test Database $ CSMES.»

cmcsexeimport -m «$ CSMES» -e «$ CSEXE» -t «unittest» -p fusjon.

for QTLIB i lib / lib * .csmes.

UNITTESTS = $ (finn. -navn «tst _ *. Csmes»)

ekko -n «Importerer Unit Tests Resultat i $ QTLIB.»

cmmerge -o «$ QTLIBTMP» -i «$ QTLIB» $ UNITTESTS.

Etter utforelsen av testpakken inneholder kodedekningsrapporten endringen:

cmreport -m «$ QT5BASE / lib / libQtCore.so.5.0.0.csmes» -s ‘. *’ –html = «$ WORK / euro_sym.html» \

–toc –title = «Euro symbol stotte» \

–source = all –method = all – global = all \

-bargraph – source-sort = dekning – metode-sort = dekning \

-mr «$ QT5REF / libQtCore.so.5.0.0.csmes» –execution = all.

$ WORK / euro_sym.html er generert, og viser kodedekningsresultatet for endringen.

Modifikasjonens dekning er 94%:

Den eneste linjen som ikke er dekket, tilsvarer den manglende testen for a velge erstatningskarakter:

6 Konklusjon.

Ved hjelp av Squish Coco er det mulig a redusere kodedekningsanalysen til bare hva bidragsyteren og godkjenningen trenger:

Er patchen korrekt testet? Hva er mulige regresjoner? Hva er virkningen, nar det gjelder antall tester, for modifikasjonen?

Selvfolgelig bor slik analyse utfores av integrationsserveren og utfores pa alle Qt-moduler, integrert med kodevurderingsverktoyet; men dette er emnet for en annen dag & # X2026;

7 skriptfiler.

Folgende skript ble testet pa Debian og utforer trinnene beskrevet i denne artikkelen automatisk.