SlideShare uma empresa Scribd logo
1 de 37
Baixar para ler offline
Testowanie
testów
Testy mutacyjne
Kamil
Ruczyński
Senior Backend Developer
Twitter: @sarvendev
Blog PL: sarvendev.com
Blog EN: sarvendev.com/en/
Jakość kodu
● Clean code
● SOLID
● GRASP
● DRY
● KISS
● itp.
Zaniedbana jakość testów
● Rzadko odpalane
● Nieprzechodzące testy
● Niedeterministyczne testy
● Brak testów
● Niedokładne testy
● “Kruche testy”
Piramida testów
Niedokładne testy
● Czy wystarczy
wysoki code
coverage?
100% code coverage
Testy mutacyjne
● Tworzenie “mutantów”
● Zabicie mutantów - jeśli zmutowany kod
powoduje załamanie testów
● Mutanty, które przetrwały definiują jakość
testów
Tworzenie mutanta
Nazwa Zmiana z Zmiana na
Plus + -
TrueValue true false
GreaterThan > >=
Equal == !=
Przykładowe mutacje
PHP - Infection framework
● PHP 7.1+
● PHPUnit
● PhpSpec
● Codeception
● Xdebug/phpdbg/pco
Uruchomienie i konfiguracja
Playground
https://infection-php.dev/
Prosty przykład
PHPUnit
Infection
Mutators
Bardziej skomplikowany kod
Wynik z Infection
infection.log
Poprawa testów
Brak pokrycia testami
Metryki
Jak to działa?
● AST (Abstract Syntax Tree) | php-parser
● Aplikacja odpowiednich mutatorów
● Utworzenie zmutowanego kodu na podstawie nowego AST
● Wykonanie testów dla zmutowanego kodu
Rodzaje mutacji
● Function Signature
● Unwrap Function
● Binary Arithmetic
● Round Family
● Boolean Substitution
● Conditional Boundaries
● Equal or Identical Checks
● Negated Conditionals
● Operator
● Increments
● Return Values
● Removal Mutators
● Loop
● Sorting
● Literal Numbers
● Exceptions
● Type Casting
● Regex
● Extensions
Mutator “Plus”
False positives
Przydatne opcje
● Wykonywanie tylko dla zdefiniowanych plików
● Wykonywanie równoległe
● Uruchamianie podczas CI
Zmienione pliki
Przykład Open Source
- Aeon Calendar
https://github.com/aeon-php/calendar
Aeon calendar - PHPUnit
Aeon calendar - Infection
Aeon calendar - Infection
Przetwarzanie równoległe, czyli z opcją -j${nproc}
Inne języki
● Java - Pitest
● Python - cosmic-ray
● Javascript - Stryker
● C++ - Mull
● Ruby - Mutant
● ...
Podsumowanie
● Code coverage nie jest dobrym miernikiem jakości testów
● Testy mutacyjne:
○ niewielkim kosztem dają użyteczny feedback na temat
jakości testów
○ są automatyczne
○ pomagają wykryć “martwy kod”
○ pomagają w refaktoryzacji testów
Dzięki

Mais conteúdo relacionado

Mais de PHPstokPHPstok

Zarządzanie złożonością
Zarządzanie złożonościąZarządzanie złożonością
Zarządzanie złożonościąPHPstokPHPstok
 
Najczęstsze błędy początkujących programistów PHP
Najczęstsze błędy początkujących programistów PHPNajczęstsze błędy początkujących programistów PHP
Najczęstsze błędy początkujących programistów PHPPHPstokPHPstok
 
Bezpieczeństwo aplikacji webowych
Bezpieczeństwo aplikacji webowychBezpieczeństwo aplikacji webowych
Bezpieczeństwo aplikacji webowychPHPstokPHPstok
 
Wzorce projektowe w praktyce
Wzorce projektowe w praktyceWzorce projektowe w praktyce
Wzorce projektowe w praktycePHPstokPHPstok
 
Sztuka samodoskonalenia programisty
Sztuka samodoskonalenia programistySztuka samodoskonalenia programisty
Sztuka samodoskonalenia programistyPHPstokPHPstok
 
Testy jednostkowe - PHPUnit
Testy jednostkowe - PHPUnitTesty jednostkowe - PHPUnit
Testy jednostkowe - PHPUnitPHPstokPHPstok
 
PSR czyli dobre praktyki programistyczne
PSR czyli dobre praktyki programistycznePSR czyli dobre praktyki programistyczne
PSR czyli dobre praktyki programistycznePHPstokPHPstok
 

Mais de PHPstokPHPstok (10)

Zarządzanie złożonością
Zarządzanie złożonościąZarządzanie złożonością
Zarządzanie złożonością
 
Clean Code
Clean CodeClean Code
Clean Code
 
Najczęstsze błędy początkujących programistów PHP
Najczęstsze błędy początkujących programistów PHPNajczęstsze błędy początkujących programistów PHP
Najczęstsze błędy początkujących programistów PHP
 
Bezpieczeństwo aplikacji webowych
Bezpieczeństwo aplikacji webowychBezpieczeństwo aplikacji webowych
Bezpieczeństwo aplikacji webowych
 
Wzorce projektowe w praktyce
Wzorce projektowe w praktyceWzorce projektowe w praktyce
Wzorce projektowe w praktyce
 
Sztuka samodoskonalenia programisty
Sztuka samodoskonalenia programistySztuka samodoskonalenia programisty
Sztuka samodoskonalenia programisty
 
Testy jednostkowe - PHPUnit
Testy jednostkowe - PHPUnitTesty jednostkowe - PHPUnit
Testy jednostkowe - PHPUnit
 
Docker
DockerDocker
Docker
 
SOLID
SOLIDSOLID
SOLID
 
PSR czyli dobre praktyki programistyczne
PSR czyli dobre praktyki programistycznePSR czyli dobre praktyki programistyczne
PSR czyli dobre praktyki programistyczne
 

Testy mutacyjne