Pisanje i provođenje automatiziranih testova programskog koda i web aplikacija
doc. dr. sc. Vedran Miletić, vmiletic@inf.uniri.hr, vedran.miletic.net
Fakultet informatike i digitalnih tehnologija Sveučilišta u Rijeci, akademska 2021./2022. godina
Motivacija
U procesu razvoja aplikacije primijetite kvar (engl. fault, kolokvijalno pogreška, engl. bug), pronađete u kojem je dijelu koda i popravite ga. Pokrenete aplikaciju i nakon malo klikanja imate dojam da sve radi kako treba.
Na koji način ćete osigurati:
- da aplikacija zaista radi kako treba,
- da vaš popravak tog kvara nije izazvao druge kvarove i
- da se kvar ne vrati u kasnijoj verziji?
Testiranje softvera (1/3)
Prema Wikipediji:
Testiranje softvera je proces koji se provodi kako bi se dionicima pružile informacije o kvaliteti testiranog softverskog proizvoda ili usluge. Može pružiti objektivan, neovisan pogled na softver kako bi omogućio tvrtki da uzme u obzir i razumije rizike implementacije softvera. Tehnike ispitivanja uključuju postupak izvršavanja programa ili aplikacije s namjerom pronalaženja kvarova i provjere je li softverski proizvod prikladan za upotrebu.
Testiranje softvera (2/3)
Testiranje softvera uključuje izvršavanje softverske ili sustavske komponente za procjenu jednog ili više svojstava koja nas zanimaju. Općenito, ova svojstva pokazuju u kojoj mjeri komponenta ili sustav koji se ispituje:
- udovoljava zahtjevima koji su vodili njegov dizajn i razvoj,
- ispravno reagira na sve vrste ulaza,
- obavlja svoje funkcije u prihvatljivom roku,
- je dovoljno upotrebljiv,
- može se instalirati i pokretati u predviđenim okruženjima te
- ostvaruje ciljeve koje imaju njegovi dionici.
Testiranje softvera (3/3)
Kako je broj mogućih testova čak i za jednostavne softverske komponente praktički beskonačan, sva testiranja softvera koriste neku strategiju za odabir testova koji su izvedivi za raspoloživo vrijeme i resurse. Kao rezultat toga, testiranje softvera obično izvršava aplikaciju ili neki njen dio s namjerom pronalaska kvarova. Testiranje je iterativni postupak: kada jedan je kvar otklonjen, može osvijetliti druge kvarove koji postoje zbog dubljih problema ili čak stvoriti nove.
Dovršen razvoj značajki softvera
Izvor: Feature Complete (MonkeyUser, 20th November 2020)
Jednostavan primjer testa u pytestu
# sadržaj datoteke test_sample.py
def inc(x):
return x + 1
def test_inc_3():
assert inc(3) == 4
$ pytest
============================= test session starts =============================
platform linux -- Python 3.9.2, pytest-6.0.2, py-1.10.0, pluggy-0.13.0
rootdir: /home/vedranmiletic
collected 1 item
test_sample.py . [100%]
============================== 1 passed in 0.03s ==============================
Primjer testa u Djangu
from django.test import TestCase
from myapp.models import Animal
class AnimalTestCase(TestCase):
def setUp(self):
Animal.objects.create(name="lion", sound="roar")
Animal.objects.create(name="cat", sound="meow")
def test_animals_can_speak(self):
"""Animals that can speak are correctly identified"""
lion = Animal.objects.get(name="lion")
cat = Animal.objects.get(name="cat")
self.assertEqual(lion.speak(), 'The lion says "roar"')
self.assertEqual(cat.speak(), 'The cat says "meow"')
Testiranje metodom bijele kutije
Prema Wikipediji: Testiranjem metodom bijele (prozirne, staklene) kutije (engl. white-box testing) verificira se interna struktura programa. Testovi se implementiraju programiranjem ulaza i očekivanih izlaza.
Uglavnom se primjenjuje na nivou jedinice izvornog koda (engl. source code unit), ali može se primijeniti i na nivoima integracije i sustava.
Tehnike testiranja metodom bijele kutije
- testiranje aplikacijskih programskih sučelja (API-ja): testiranje aplikacije pomoću javnih i privatnih API-ja
- primjerice, kod korištenja API-ja može se raditi o pozivu funkcije programskog jezika u obliku
get_persons(5)
, korištenju objektno-orijentiranog pristupa ili slanju zahtjeva HTTP metodom GET na URI/persons/5
- primjerice, kod korištenja API-ja može se raditi o pozivu funkcije programskog jezika u obliku
- analiza pokrivenosti koda testovima (engl. code coverage): izrada testova kako bi se udovoljilo nekim kriterijima pokrivenosti koda
- primjerice, dizajner testa može stvoriti testove kako bi barem jednom izvršili sve ispise koje aplikacija vrši
- metode ubrizgavanja kvarova: namjerno uvode greške kako bi se procijenila učinkovitost strategija ispitivanja
Alati za testiranje softvera
Primjeri alata za testiranje softvera na opisan način su:
- pytest (Python)
- Mocha i Jest (JavaScript)
- Mocha je inače fina kava, a Jester je dvorska luda i smije se kao Joker
- NUnit (C#)
- PHPUnit (PHP)
- GoogleTest i CppUnit (C++)
- za C/C++ Gcov vrši analizu pokrivenosti koda testovima
- Test::More (Perl)
- JUnit (Java)
- ugrađeni sustavi za testiranje u Ruby on Railsu, Elixiru, Rustu itd.
Primjeri testova u web aplikacijama
🙋 Pitanje: Što testiraju ovi testovi?
- WordPressovi (koristi PHPUnit)
- Collabora Online (koristi CppUnit)
- PeerTube (koristi Mochu)
- Trac (koristi Pythonov modul unittest)
- Redmine (koristi Railsov sustav za testiranje)
- Mattermost (koristi Golangov modul testing)
- pump.io (koristi vows)
Testiranje metodom crne kutije
Prema Wikipediji: Testiranje metodom crne kutije (engl. black-box testing) ili funkcionalno testiranje je proces testiranja bez poznavanja interne strukture softvera. Testeri samo znaju što softver treba raditi, ali ne i kako. Metode koje se koriste su:
- raspodjela ekvivalencije, analiza graničnih vrijednosti, ispitivanje svih parova,
- tablice prijelaza stanja, ispitivanje korištenjem tablice odluka,
- fuzz testiranje (vrlo važna metoda, najčešće služi za pronalaženje sigurnosnih propusta u web aplikacijama),
- testiranje na temelju modela, ispitivanje slučajeva korištenja,
- ispitivanje istraživanjem i ispitivanje na temelju specifikacije.
Fuzz testiranje (engl. fuzz testing, fuzzing)
Fuzzing is a powerful strategy to find bugs in software. The idea is quite simple: Generate a large number of randomly malformed inputs for a software to parse and see what happens. If the program crashes then something is likely wrong. While fuzzing is a well-known strategy, it is surprisingly easy to find bugs, often with security implications, in widely used software.
Primjeri alata za fuzz testiranje: american fuzzy lop, Radamsa i APIFuzzer
Testiranje s kraja na kraj
Testiranje s kraja na kraj (engl. end-to-end testing) je suvremeni naziv za proces testiranja metodom crne kutije koji spaja više navedenih metoda. Primjeri alata koji se koriste za takvo testiranje su:
- Cypress
- Nightwatch.js
- Selenium (nije samo za testiranje, često se koristi i za struganje sadržaja s weba, engl. web scraping)
Kolokvijalno rečeno, ovi alati imitiraju korištenje web aplikacije od strane korisnika.
Dogfooding (1/2)
Prema Wikipediji:
- konzumiranje vlastite hrane za pse (engl. eating your own dog food, dogfooding) je praksa korištenja vlastitih proizvoda ili usluga
- može biti način na koji organizacija može testirati svoje proizvode u stvarnom svijetu koristeći tehnike upravljanja proizvodima, služi za kontrolu kvalitete i pokazuje povjerenje u vlastite softverske projekte ili proizvode
- naziv je dao Paul Maritz u Microsoftu 1988. godine pokušavajući nagovoriti da interno više koriste vlastite softverske proizvode
Dogfooding (2/2)
Dogfooding se može koristiti i kod projekata otvorenog koda, npr. developeri Mozille su kasnih 90-ih intenzivno koristili web preglednik, e-mail klijent i druge alate koje su razvijali pa prijavljivali probleme na koje su pritom naišli:
- [BETA][DOGFOOD]No proxy authentication
- [DOGFOOD]Form submission with post data no longer works
- [DOGFOOD][BLOCKER]Start Seamonkey with problems for running multiple profiles.
- [DOGFOOD][bugday] mail news buttons disappear on click and mouse-over
Zagonetka trolejbusa
Izvor: Trolley Condrum (MonkeyUser, 16th March 2021)
Author: Vedran Miletić