Napravih skriptu za testiranje stranice...pa kako vam se čini pristup

Znači, zaglavio sam u razvoju jednog projekta zbog velike isprepletenosti i neznanja kako da brzo i efikasno testiram kompatibilnost noviteta s postojećim značajkama.
Onda su mi forumaši ovdje sugerirali da proučim unitTest-ove što mi je dalo odličnu ideju što meni treba. E sad, meni je oduvijek tlaka proučavati tuđe stvari… a istovremeno uživam radeći svoje. (probably glup pristup xd) Tako je nastala moja skripta za testiranje stranice. Vjerujem da je to primitivni oblik nekog možda specijaliziranog i usavršenog unitTesta, no tko se kuži u unitTestove može iskomentirati i moj pristup i kako mu se sviđa.

Stavit ću relativno kratke upute za korištenje testova …i baš me zanima hoće li vam biti intuitivne i shvatljive ili suprotno tomu??
Evo uputa:

-pozivom funkcije startUnitTest('testName_1;testName_2;testName_3'); …pokrenut ce se navedeni testovi definirani kao:
UnitTest={}; UnitTest.testName_1=function(){} ; UnitTest.testName_2=function(){} ;UnitTest.testName_3=function(){}

…tako pozvani testovi su otporni na refresh i promjenu pod stranica.

-za kreiranje testova se mora koristiti sljedeća šablona:

UnitTest.testName=function()
	{
	setSection('ime sekcije')
		unitAddStep({...})
		unitAddStep({...})
		unitAddStep({...})
		setSection('ime sekcije 2');
			unitAddStep({...})
			unitAddStep({...})
			unitAddStep({...})
		sectionOver();
	sectionOver();
	} 

UPRAVLJANJE UNIT LOG-om kroz SET SECTION:
definiranje setSection() služi za hijerahijski prikaz izvršavanja procesa u Unit log-u.
-setSection('ime sekcije') je otvaranje zaglavlja, sectionOver() je zatvaranje zaglavlja. Radi pojednostavljenog pisanja, mogu se koristiti sljedeći načini zadavanja zaglavlja:
-umjesto: sectionOver();setSection('ime sekcije'); …moze se napisati: newSection('ime sekcije');
-umjesto sectionOver() se može i pisati setSection(), ali bez parametra!
-umjesto sectionOver();sectionOver();sectionOver() se može pisati sectionOver(3) ;parametar navodi broj koraka unazad

KAKO DEFINIRATI ODREĐENI KORAK TESTIRANJA
unitAddStep() omogućava pisanje funkcija za testiranje koje će raditi sinhronizirano sa izvršavanjem stranice. Znači, funkcije će čekati ajax response, provjeravati response dali odgovara očekivanju…i tek tad nastavljati sa radom.
Svaki unitAddStep() dodaje jedan korak za testiranje. Po jednom ajax requestu koji se kontrolira, mora se dodati jedan unitAddStep() sa sljedećim parametrima:

unitAddStep(
	{
	title:'Ime koraka izvršavanja',
	test:function()
		{
		funkcija_1();
		funkcija_2();
		funkcija_n();  //dodajemo svojevoljne funkcije
		addUnitLog('Ovdje moze bilo koja random obavijest koja ce biti zapisana u log');
		registracija();
		get('registracija_button').onclick();  //ova radnja radi ajax request
		funkcija_n2();  //nakon ajax requesta mozemo dalje pisati funkcije..ali one neće čekati da se ajax response vrati.
		},
	expectAjax:'ajax/registracija.php',
	expectResponse:{status:'ok'},
	passOnDifferentResponse:1,
	passOnMissAjax:1,
	onResponse:function(response)
		{
		if(response.status!='ok')unitDie('Iako sam stavio da se test ne prekidana kod ne poklapanja expectResponse-a, mogu i na ovaj način prekinuti test ako želim');
		}
	});

Objašnjenje parametara:
title->Ime koraka izvršavanja za prikaz u unit logu.
test-> je funkcija koja će biti izvršena u tom koraku unit testiranja. Unutar test funkcije se smije pozvati neka funkcija koja radi ajax request, bez brige da će se sljedeći korak odvijati prije nego završi ta ajax radnja
…no, svejedno treba objasniti sustavu koja ajax funkcija je pozvana sa “expectAjax” parametrom
expectAjax-> objašnjava unit testiranju koji ajax proces je u tijeku. Sljedeći korak unit testiranja započinje tek nakon ajax responsa. No test unutar kojeg je pozvan taj ajax, će biti izvršen do kraja. Nebitno je u kojem djelu testa (početak ili kraj) …se poziva ajax
Globalno vrijeme čekanja ajax responsa se definira globalnom varijablom UnitMaxWaitAjax=3000; // 3000 (3sekunde) je default
expectResponse-> objašnjava koji response se očekuje. Očekivani response se može zadati kao string ili kao objekt. Test može biti prekinut kod neodgovarajućeg responsa, ali i ne mora. Prekid testa ovisi o sljedećem parametru
passOnDifferentResponse-> defaultno je false, ali ako se uključi onda omogućava da se test ne prekine kod ne poklapanja ajax responsa s expectResponse
passOnMissAjax-> defaultno je false, ali ako se uključi onda omogućava da se test ne prekine ukoliko izostane očekivani ajax response unutar zadanog vremena definiranog varijablom (UnitMaxWaitAjax)
onResponse-> je funkcija koja će se izvršiti nakon očekivanog ajax responsa

Ponekad želimo unutar samog testa odlučiti hoćemo li zvati ajax ili nećemo, u tom slučaju ne možemo koristiti parametar “expectAjax”, jer kad njega koristimo program će uvijek očekivati taj ajax poziv.
U tom slučaju moramo objasniti sustavu kroz test funkciju da se očekuje ajax response. To ćemo učiniti na sljedeći način:

unitAddStep(
	{
	title:'...',
	test:function()
		{
		registracija();
		if(zeljeniUvjet)
			{
			unitExpectAjax(
				{
				expectAjax:'ajax/registracija.php',
				expectResponse:{status:'ok'},
				passOnDifferentResponse:1,
				passOnMissAjax:1,
				onResponse:function(response){}
				});
			}
		},

	});

OSTALE FUNKCIJE koje se mogu izvršiti unutar željenog koraka testiranja:
addUnitLog('napomena') – može se koristiti za pisanje napomena u unitLog u određenom trenutku izvršavanja testiranja
unitDie('napomena') --može se koristiti za prisilan prekid testa
unitAlert('napomena') --može se koristiti umjesto alert('napomena'). unitAlert() se koristi iz razloga da proces testiranja napravi unutarnji delay…tj. da se test ne prekine zbog predugog čekanja ajax responsa, što bi obični alert uzrokovao…

NAPOMENA: sve spomenute funkcije, isto kao bilo koje druge funkcije koje korisnik sam napravi…moraju se koristiti unutar unitAddStep(), pod test() ili onResponse().

OPĆENITE FUNKCIJE za upravljanje testovima:
-za omogućavanje testova potrebno je napraviti sljedeće:
-svaka podstranica mora inkludati skriptu unitTest.js
-na onload skripte “unitTest.js” mora biti postavljena funkcija: restoreActiveUnitTest();
-unutar funkcije koja prihvaća ajax response mora biti postavljena funkcija: checkUnitTestOnAjax(script,response,post);

-za nastavak zadnjeg aktivnog testa se poziva: unitNastaviTest(korak) //Dobro dođe za debugiranje. Ukoliko je test npr. zapeo na 1521 koraku zbog određenog buga, nije nužno vrtiti cijeli test ispočetka. Nakon ispravka greške je dovoljno nastaviti test od željenog koraka.
-za prikaz unit log-a se poziva: showUnitLog(); …koji se inače sam otvara pri završetku testa, no može se pozvati i ručno ukoliko zatreba i nakon refresha stranice
-pozivom funkcije seeAllUnitFunction() izlistat ce se svi testovi koji su definirani unutar UnitParts objekta. Vidi primjer:

var UnitParts={}; 
UnitParts.uspjesna_registracija=function(){startUnitTest('registracija;registracijaFail');}
UnitParts.testPrijava=function(){startUnitTest('registracija;prijava');}

Evo malo i kako izgleda Unit log:

collapsed:

:

neki koraci uncollapsed:

Radi većeg prikaza napravite: desni klik na image -> open link in new tab

-žuto su napomene dodane sa addUnitLog()
-sve je prilično klikabilno
-različite radnje se prikazuju različitim bojama
-dugački response ili post statusi su također klikabilni (show/hide) …defaultno skraćeni…
-unitLog prikazuje i ajaxe koji se ne prate…nazvani kao neutralAjax
controledAjax su oni koji su naznačeni sa expectAjax i expectResponse parametrom.
proccesAjax su oni koji su naznačeni samo sa expectAjax

-u zaglavlju je moguće kvačicama definirati koji statusi će se prikazivati a koji ne
-sve se pamti ofline, i ostaje nakon refresha

-mjesta za razvoj ima još jako puno…no meni je ovo za sad čisto zadovoljavajuće. :smile:

2 Likeova