Preskoči na sadržaj

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.


The ultimate inspiration is the deadline bg 95% left:55%

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.

White Box Testing Diagram

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
  • 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

Jest Fast and Safe


Jest Code Coverage


Alati za testiranje softvera

Primjeri alata za testiranje softvera na opisan način su:


Primjeri testova u web aplikacijama

🙋 Pitanje: Što testiraju ovi testovi?


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:


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.

-- The Fuzzing Project

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:

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:


Or the illusion of choice bg 95% left:70%

Zagonetka trolejbusa

Izvor: Trolley Condrum (MonkeyUser, 16th March 2021)

Author: Vedran Miletić