Test Driven Development opiera się na tworzeniu oprogramowania w sposób iteracyjny, gdzie test jest kluczowym elementem procesu. Tworzenie oprogramowania w tej metodyce podnosi naszą pewność odnośnie jakości kodu oraz tego, że testy go lepiej pokrywają.
Niestety ta technika przerzuca odpowiedzialność za jakość kodu na testy. Jedną z odpowiedzi na ten problem mogą być techniki testowania mutacyjnego. Proponujemy zatem usprawnienie techniki TDD o testowanie mutacyjne (TDD+M).
Wykażemy na podstawie eksperymentu porównującego TDD z TDD+M wpływ testów mutacyjnych na technikę Test Driven Development oraz pokażemy ogólne wrażenia zespołu programistów biorących udział w eksperymencie.
Pokażemy także na konkretnych przykładach, że testowanie mutacyjne to nie tylko poprawa jakości testów, ale także dobre narzędzie do wychwytywania błędów czy słabości projektowych (numerycznych, algorytmicznych oraz ideowych), co może dawać nam pewnego rodzaju zautomatyzowaną alternatywę dla code review.
6. T.D.D. - Test Driven Development + Mutacje
Run Mutations
7. T.D.D. + M Eksperyment
● Jeden projekt.
● Jeden Java Doc.
● Dwa zespoły.
● Jeden zespół pracuje w technice TDD.
● Drugi zespół pracuje w technice TDD+M.
● Na koniec naprzemienne testy weryfikacyjne*.
*(Kod zespołu w samym TDD poddajemy mutacji następnie sprawdzamy jak radzą sobie ich testy. Przenosimy testy na
krzyż z TDD do TDD+M i sprawdzamy czy przechodzą. Sami piszemy testy i sprawdzamy czy nasze będą lepsze).
8. T.D.D. + M Eksperyment Wyniki
TDD
Reales CodeCoverage % MutationCoverage % Tests Mutants Methods Info
1 0 0 0 4 6 Puste metody
2 79,31034483 39,13043478 2 23 8
3 79,48717949 82,69230769 5 52 10
4 79,48717949 82,69230769 5 52 10 Poprawki w projekcie nie w kodzie
5 89,74358974 82,69230769 7 52 10 Agregacja żywych mutantów od wersji 3
6 66,66666667 63,23529412 8 68 16
Nowa niedokończona klasa brak testów stara bez
zmian
7 41,86046512 41,34615385 8 104 16
Klasa Matrix bez zmian, Math bez testów nowe
implementacje metod
8 60,46511628 64,42307692 11 104 16
Nowy test testMatrixSubtracting ubijamy dodatkowe
2 mutanty w Matrix. 2 nowe testy w math ubijają 22
mutanty
CROS
TEESTY z
TDDM
86,76470588 75,96153846 16 104 16
W matrix zabija 48 mutantów o 3 więcej w math zabija
31 o 9 więcej mamy 1 test na metodę. Wymagane było
komentowanie 2 testów które nie przechodziły wcale
więcej info w doc.
9. T.D.D. + M Eksperyment Wyniki
TDDM
Reales CodeCoverage MutationCoverage Tests Mutants Methods Info
1 43,90243902 30,3030303 3 33 16 Matrix zaimplementowana częściowo math wcale
2 36,11111111 34,32835821 4 134 16
Math zaimplementowana ale bez testów matrix pokrycie wzrosło o
35% Pokrycie mutantów o 41%
3 39,81481481 38,05970149 6 134 16 Math bez testów rośnie pokrycie Matrix
4 39,81481481 39,55223881 6 134 16 Matrix 1 mutant ubity (poprawiony test) Math bez zmian
5 39,81481481 38,80597015 6 134 16
Matrix 1 mutant ubity (poprawiony test dążą do 100% w klasie
matrix) Math bez zmian
6 47,22222222 44,02985075 7 134 16
Klasa matrix nowy test pokryta testami 96% mutanty ubite 100%.
Jedyna niepokryta metoda robi set na ( data[row][column] = value)
komurce w tablicy double Math brak testow nadal
7 49,07407407 44,02985075 8 134 16
Klasa matrix pokrycie 100% Mutacyjne 100% nowy test dla tego
seta doubla. Klasa Math nie ruszona
8 93,51851852 87,31343284 12 134 16 Implementacja testów dla Math 4 nowe testy
9 81,4516129 73,58490566 12 134 16
Implementacja 2 metod w math matrixSubtracting,
matrixTransposition brak nowych testów brak testów do nowych
nowych mutantów Koniec projektu z względów na Deadline dlatego
spadł scro nie pełny cykl w trakcie Development.
10. T.D.D. + M Eksperyment Wyniki
TDDM
Reales CodeCoverage % MutationCoverage %
Test
s Mutants Methods Info
CROSS TESTY z
TDD
39,51612903 40,25157233 12 134 16 Score dużo gorszy
Testy Piotra W. 90,32258065 82,38993711 18 134 16
Wniosek nawet doświadczony programista
nie był w stanie zrobić 100%
11. T.D.D. + M Wnioski
1. Łatwość popełniania błędów numerycznych
a. Mutacje są dobrym narzędziem do weryfikacji poprawności numerycznej
algorytmu.
b. Nawet najbardziej doświadczony programista popełnia błędy
c. Pisanie testów jednostkowych dla numeryki jest trudne i mało efektywne
12. T.D.D. + M Wnioski
1. Narzędzie do testowania dokumentacji.
2. Narzędzie do testowania spójności idei.
3. Wychwytywanie słabości projektowych.
4. Testowanie przepływów algorytmów.
13. T.D.D. + M Wnioski
1. Ubijanie mutantów dla samego ubijanie mutantów jest złe:
Uczestnicy eksperymentu jako słabo doświadczeni programiści mieli tendencję
do ubijanie mutantów nie patrząc czy dany mutant jest sensowny. Czasem
dawało to odwrotny efekt od zamierzonego czasem naprawiano test tak żeby
przechodził mimo że błąd nie był w teście a w kodzie.
14. T.D.D. + M Wnioski
2. Code review powinno analizować mutacje pod względem
kodu programu jak i kodu testu.
15. T.D.D. + M Wnioski
3. Same mutacje są wstępem do review.