Seznamování s Nette Testerem

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kleinpetr
Člen | 480
+
0
-

Ahoj,

vím, že se to tu párkrát řešilo, ale i tak se zeptám znovu. Mám konečně chuť začít testovat, ale zkrátka nevím čím začít. Zatím jediné co mě zaujalo je testovaní DOMu, což je fajn, ale jak například testovat nějaký proccessForm(), který je v presenteru a např. registruje uživatele, apod. Přeci když si tu funkci napíšu v testu, tak už to není test. Další věc je ta, že asi větší část aplikaci pracuje s databází, vím že se to tu řešilo pomocí mocků, atp, mě napadlo třeba v testu zapnout transakci a projet test a ve finále jí rollbacknout, ale nevím jestli je to úplně šťastné řešení.

Doufal jsem, že v nette testeru, jelikož má config stejný jako aplikace, si budu moct předávat zavíslosti přes DI, stejně jako v aplikaci, např. v konstruktoru, ale končí chybou.

Mám například nějaký StepForm, ale zaboha nevím jak nasimulovat test, který by vypadal stejně, jako když si jdu formulář proklikat do prohlížeče a je vůbec možné simulovat takovou situaci ?

Díky za rady a případné připomínky :)

jiri.pudil
Nette Blogger | 1028
+
+1
-

Chtěl jsem ti tu něco napsat, ale pak jsem si řekl, že se vlastně vůbec nemusím namáhat, když už to všechno řekl @FilipProcházka :) https://www.youtube.com/watch?…

kleinpetr
Člen | 480
+
0
-

Díky za video :) tak to vypadá, že testování zase na chvíly odložím než vstřebám všechny informace, které dokázal Filip říci ve 40ti minutách :D

Jiří Nápravník
Člen | 710
+
0
-

Doporucuji mrknout na codeception, ja tam teda zatim delam jen akceptacni testy, coz v podstate skript naklikava to co bych klikal ja rucne, ale muzes tam mit samo i integracni a unit testy. A pracuje se s tim celkem pohodlne

jiri.pudil
Nette Blogger | 1028
+
0
-

Tím se ale nemusíš hned zahltit ;) doporučoval bych se zatím nezabývat těmi vyššími úrovněmi a začít odspodu, od unit testů: poctivě mockovat všechny závislosti a testovat doménové třídy (model), že na správné vstupy vracejí správné výsledky a na nesprávné vstupy reagují očekávaným způsobem. Tady je vstupní bariéra poměrně nízká a zároveň si to tím osaháš, zjistíš, kde jsou limity tohohle přístupu a pomalu začneš psát i integrační testy, kde některé mocky nahradíš reálnými objekty a budeš testovat větší celky. A až tohle pojmeš, můžeš k tomu přilepit „skutečnou“ databázi a další věci.

Akceptační/selenium testy si při tom můžeš vyzkoušet taky, protože testují věci z trošku jiného pohledu a ten přístup je jiný; místo kódu a výstupu funkčních jednotek testuješ výstup pro uživatele. Akorát tam už musíš mít zprovozněnou nějakou testovací databázi…

kleinpetr
Člen | 480
+
0
-

Jojo, díky :) určitě bych chtěl začít pozvolna a když jsem už jsem si říkal jo začínám to chápat tak koukám a všude se řeší „a ještě travis, a ještě selenium, a ještě tohle a tamto“ takže to momentálně vypouštím a jdu hezky pomalu, co jsem pochopil tak unit testy testují spíše funkce nebo metody, které nějakým způsobem zpracovávají nějaká data a následně asertuji správný nebo špatný výstup, k tomu asi není co dodat, jen že takových funkcí zrovna moc nemám, jediné co k tomu bych rád věděl je to předávání závislotí, dejme tomu, že mám nějakou classu, která má metodu co upravuje nějaký vstup, jenže samozřejmě ta classa přebírá již nějaké závislosti, proto když si v testu vytvořím instanci pomocí new SomeObject(..) tak mu je musím předat ručně, proto jsem doufal, že si do testu mohu taktéž předat závislost např. v konstruktoru, ale to mi neprošlo.

Co jsem pochopil a čím začnu, tak je testování DOMu, jelikož to dává asi největší smysl co se týče reálné aplikace a toho, že se opravdu něco dozvím.

Mám na projektu nějaké hotové řešení a snažím se zjistit jak na to napsat test, ale zkrátka mi asi nedochází jakým způsobem toho docílit. Zkusím dát stručný příklad.

Třída Offer, která v sobě udržuje nějaké položky typu ActiveRow a má metody getItems() addItems() atp
Třída Order, která příjímá vytvořenou Offer a dále má metody jako třeba proceedOrder() kde se zpracují položky, uloží do databáze, kontaktuje další službu, v mém případě fakturoid a odešle maily, samozřejmě v tom celém je nějaká session a další komponenty, takže třída Offer zároveň ví o tříde Order a také s ní může eventuelně manipulovat nebo zjišťovat stav apod.

a třeba u tohohle případu si říkám, že udělat takový test asi nebude jen tak a zabere to dost času. Takže asi opravdu začnu u testování DOMu a jednoduchých unit testů a postupně to třeba přijde samo :)

@jiri.pudil díky za rady :)
@JiříNápravník díky určitě mám v plánu na to taky kouknout

Editoval kleinpetr (20. 4. 2016 20:03)