No, já bych si přál, aby se objevilo i něco podobného, z čeho by si mohli vzít ponaučení lidi, kteří řídí lidi vyvíjející software.
Jinými slovy, můj hlas vývojáře „naše aplikace opravdu potřebuje aspoň nějaké testování“ je totiž poněkud... neslyšen. Resp. jsem vždy poučen o tom, že školní teorie (je potřeba identifikovat, jaký rozsah testů je vhodný pro daný sw a pak je implementovat) není reálnou praxí (na testy nejsou peníze a investice do testů negeneruje nic, co by investoři viděli).
Je to obvykle chyba managementu/procesu.
Protoze programatori pri nejlepsi vuli chyby (v ruznem mnozstvi a s ruznou zavaznistu) delaji, tak je potreba je obalit procesem, ktery omezuje moznost, ze se ta chyba dostane do produkce.
(Samozrejme jsou i situace, kdy to je chyba programatora, trebas pokud z nedbalosti oignoroval dohodnuty postup. Ale bohuzel i pokud programator je chytry a opatrny a nedela hloupe chyby, stale dela chyby.)
Presne tak,
trvalo nam cca 4 roky a zmenu nekolika devel manageru, nez jsme se dostali k procesu Development -> Testing -> UAT -> Pre-Production -> Production Release. A to jsme pouhe interni BI oddeleni o nekolika desitkach developeru a nekolika dedikovanych testerech. Dnes uz konecne mame unit testing nad DWH a MOLAP modely. Dashboardy a reporty se testuji bohuzel rucne, vse ostatni nam resi TestRail a Jenkins, ted uz mame celkem blizko k CI/CD, ale i tak to vidim jeste na nekolik let. Bohuzel snadno se rika jak to ma byt, ale cesta k cili je vetsinou dost trnita. Ono nakreslit to na papir je vetsinou celkem snadne, ale dostat to do praxe je v mnoha korporacich nemozne. Dodnes slysime, ze nas release cycle je 2-3x pomalejsi, nez byl predtim, nicmene pri tak striktnim procesu co jsem popsal vyse, se neni cemu divit.
Co vas v te skole uci? Projit zkouskami? Chyby na urcite urovni komplexity podporene lidskym faktorem jsou nevyhnutelne. Softwarove produkty jsou jedny z nejkomplexnejsich stroju ktere clovek kdy vyvinul. Kazdy zkuseny manazer akceptuje chybovost pri vyvoji jako bezny jev se kterym je treba pocitat.
Procesy testovani (oddelene od i od primarniho vyvoje) jsou zakladni praktiky inzenyrstvi. Pisi inzenyrstvi protoze je to vec ktera jde skrz mnoho oboru a netyka se jen software.
To slovo inzinirstvi je presne ten zakladny problem. Moja skusenost je ta, ze kedze sa to nemoze zrutit ako most tak naprosta vacsina manegerov pristupuje k testom ako niecomu co pokial mozno treba osekat ako sa da a kedze sa nenamahaju tomu rozumiet tak jedina metrika co poznaju je pokrytie kodu testami co je vyzera na prvy pohlad fajn ale o skutocnej kvalite testov to az tak moc nehovori. Keby aspon trocha uvazovali ako pises tak by kvalita skokovo vzrastla. Len by potrebovali miesto debilnych grafov obcas aj vzdelat a nielen 5 minut cez google
Nebudem sem davat url iba citujem:
Modern cars work, let’s say for the sake of argument, at 98% of what’s physically possible with the current engine design. Modern buildings use just enough material to fulfill their function and stay safe under the given conditions. All planes converged to the optimal size/form/load and basically look the same.
Only in software, it’s fine if a program runs at 1% or even 0.01% of the possible performance. Everybody just seems to be ok with it. People are often even proud about how much inefficient it is, as in “why should we worry, computers are fast enough”
Ano, az na to ze kolko rokov, desatroci, storoci sa vyvyjalo stavebnictvo, materialy. Pri montazi aut, v stavebnictve sa pouzivaju standardizovane dielce, maju standardne rozmery atd. Nikto pocas stavby nezmeni zrazu priemer odpadovych rur s tym ze ine sa uz nebudu dat zohnat. Pri vyrobe sa nezmenia zavity na skrutkach z noci na den, co je celkom bezny jav pri sw - rozne automaticke updaty. Nehovoriac o tom ze vecsina strojov, pristrojov sa daju rozobrat na relativne jednoduche zakladne suciastky alebo aspon moduly (vynimajuc digitalnu elektroniku ale to sme zasa pri IT). Pri SW to ide dost tazko.
Realita: Zakaznik kupuje burger z obrazku za 6eur. Cim skor ho ma tym menej ho trapi za co zaplatil.
To je bezny kontrakt b2b. To ze ludia ktory to vyvijaju maju nervy a ludia co to pouzivaju maju nervy nikoho nezaujima.
Predpokladajme ze nikde inde niesu chyby iba v aplikacii a ze zakaznik dodal uplne deterministicku specifikaciu na urovni pravdivostnych tabuliek a programator by kopiroval specifikaciu. Pekne db,b-e,f-e,vcs,bs,ds,ts,pps,ps.... naplanovane devops ako zo skatulky. Tak tam tie chyby ozaj robi iba programator.
Zvycajne projekt taha ten jeden programator. Robi uplne vsetko potyka sa s chybami ktore sa nedaju casto predpokladat. Ma 10% casu na vyvoj. Zvycajne caka na doplnenie specifikacie ci pridanie disk space niekam. Nic poriadne nemoze zmenit lebo vsade su neake zavislosti a nieje podla coho zistit ako to ma fungovat alebo nema prava.
Zadania uz maju matematicke/logicke chyby/nepresnosti. Priklad nieco neplati do 15teho roku je to 14.99, 15, 15.99? Zakazte platbu MC proste sa neratalo s tym ze niekto pouzije Amex a nie Visu. Dajte to na druhu az na to ze casom prisli na to ze to vracia iba kladne hodnoty....
Snad som v niecom vyjasnil ze kde su chyby. Snazil som sa pisat co najmenej a nejde mi to.
V texte su asi chyby nakolko som sa snazil to zosekat na co najmenej.
Chyby jsou všude.
Jako když jedna firma v v online šachách ukládala partie do DB naserveru a indexovala je typem uint. V aplikaci na klientovy uint bylo uint32_t, na serveru uint bylo uint64_t. Po 2^32 partiích začala být dobrá sranda... Testama to prošlo, nikoho nenapadlo poslat dost vysoký číslo partie během testování.
Nebo hloupý string. Widlí appka má CP1250, verze pro Linux UTF-8 (díky za to, Schroedingerova kočko) a server je nějaký bastl s UTF16. Testuje se to na datech výhradně z ASCII charsetu. A je krásně vymalováno...
Nebo latence serveru byla zaručena specifikací do 10ms, expert dal do klienta s UDPčkem timeout 10ms (podle specifikace přece server odpoví), ale vůbec ho nenapadlo, že klient bude od serveru 500km (rychlost šíření signálu) a zůstane to občas viset někde v buffer u na routeru... Většinou to jelo, ale při "blbým počasí" to mělo výpadky, data ze serveru přišla až na klienta, jenom klient je ignoroval. Po změně na 15ms všechno bez problémů (najít jim to trvalo tři týdny).
Tož asi tak...
Ano presne tak Seleniun IDE (skripty).
Web zahlasil ze heslo neresetol co bolo ucelom testu otestovat pravidla. Ale heslo nastavil aj ked nesplnalo kriteria.
Nema to nic so selenium. Proste prides na web zmenit heslo web zahlasi ze heslo nesplna kriteria. Ides sa lognut a zistis ze tam je nove heslo. Ktore vraj nenastavil.
Pointa je ze GUI testy nemaju uplne velku vypovednu hodnotu.
"No a kdo jiny? Kdo tam ty chyby nasekal? Uklizecka?"
Omlouvám se, vyjádřil jsem se nejasně. Myslel jsem to tak, že my, vývojáři, jsme obviňováni za to, že zákazník chce odejít. To, že sekáme chyby nijak nepopírám, problém je jiný: my vývojáři dostaneme určitý čas na implementaci a kvalita (logicky) odpovídá onomu času (tedy chybí prostor na dostatečné testování pro daný typ sw). Po té vyšší vedení sw prodává a kvalitu prezentuje na poněkud jiné úrovni, kterou zákazník tedy očekává. Jenže při setkání s realitou je (logicky) zklamán a odstupuje od smlouvy. A za to jsme pak my, vývojáři. A to je to, s čím mám problém.
Je zajímavé, že Q&A se normálně řeší i v klasickém průmyslu. Nejen v sériové výrobě, ale i při vývoji nových produktů se samozřejmě musí řešit, zda a jak moc splňují požadavky, takže to je běžná součást manažerské práce; netuším, proč si lidé myslí, že v SW to bude jinak a výrobek bude "by default" bezchybný.
Taky se často zapomíná, že kvalita je funkce mnoha proměnných a jednou z nich je i kvalita zadání...
Navíc pozor na chytáky. Pokud bude nejasný zadání, tak si zákazník vždycky najde důvod ke slevě. Třeba v věta v zadání "bude implementován TCP/IP":
- "A kde je IPv6? Nedodali jste to kompletní, je toho jenom půlka, zaplatím jenom půlku."
- "My ale nechtěli IPv6, polovinu práce jste dělali zadarmo, nikde o tom nebylo ani slovo."
A ty si, jako vývojář, vyber... Implementovat, nebo neimplementovat? :(
@Petr M
"Taky se často zapomíná, že kvalita je funkce mnoha proměnných a jednou z nich je i kvalita zadání..."
A zde hodně narážíme i na to, že zde hodně záleží i na kvalitě komunikace. Už dávno jsem se naučil, že zákazník neví co přesně chce a v podstatě to od něj ani nemůžeme chtít. Tedy vezmeme jeho zadání, nějak jej interpretujeme, z toho vygenerujeme specifikaci, kterou zákazník schválí - nebo přijde na to, že to není tak úplně ono.
Jenže toto je pěkná teorie, avšak v praxi tyto věci opět domlouvá vedení (nebo grafik -.-), kteří (logicky) pořádně ani neví, že je rozdíl, zda implementujeme IPv4, IPv6 nebo obojí.
A jestliže mi řekne šéf-programátor "máš tam null-reference exception" (tou dobou jsem dělal na dvou projektech zároveň) (to v uvozovkách je kompletní bug-report), tak jediné řešení, na které jsem přišel, je flegmatismus.
@ \neq
V předminulé práci jsme měli tým, který připravoval zadání. Já v něm měl na starost HW. Nabídka neodešla, dokud jsem neměl vypracovaný tři možnosti jak to řešit po stránce HW, odhad jejich ceny a rizik. Tam se dalo i něco dělat.
V předchozí práci šok. Se zákazníkem jednali jenom ti, co mají v titulu funkce sprostý slova na M - Markeťáci a Manažeři. Šéf s tím nebyl schopný nic udělat, jenom nám doporučil brát si 3x denně Fakitol...
Myslíte to, jak zákazník odchází? Jistě, ano, vidí, jenže chyba nikdy není na jejich straně, na tom, že nedali dostatečný prostor odladit aplikaci. Ve skutečnosti je chyba v nás, vývojářích, kteří jsme práci odflákli.
Jinými slovy, myslel jsem to tak, že testování je něco, co investoři nevidí přímo, tedy vloží X hodin a vypadne z toho Y featur. Místo toho vidí, že vloží X hodin a ... nevypadne z toho nic.
Právě protože tyto "stesky" vývojářů dobře znám, vznikla tato minisérie článků. Počkejte, prosím, na druhý a zejména třetí díl, kde budou uváděna konkrétní čísla a pak také něco jako "dobré rady", plynoucí z konkrétních zkušeností, a to i pro manažery projektů.
BTW: Samozřejmě, pokud někdo na testování nechce dát prostředky (čas a peníze), tak může mé zkušenosti snadno zpochybnit, protože pocházejí z akademické sféry a ne z reálného života ;-)
Prosim ak mate, tak tam dajte cisla aj proti opacnemu extremu, ktorym je 100% test coverage. Potom mame testy potvrdzujuce lubovolnu zmenu v kode, co prinasa iba mechanicke opravy.
Mam na mysli utrpenie ako
testErrorMessage() {
assert(Convertor.getErrorMessage() == "Konverze selhala!!! ");
}
spolu s pripadnou lokalizaciou retazcov alebo len upravou, ktora zrusi opakovane vykricniky.
Toto je unit test a za to su zodpovedni vyvojari. 100% pokrytie unit testami je fajn, ale je otazka, ci to nieco prinasa tak, ako uz bolo spomenute v clanku. Podla mna je lepsie pre kvalitu aplikacie si stanovit mieru pokrytia unit testami, napr. 90% a vyhnut sa takymto absurditam, ktore by mohli byt generovane automaticky. Usetreny cas, mozete venovat pisaniu integracnych alebo systemovych testov.
Pokial by vas sef namietal, ze potrebuje mat 100% pokrytie unit testami, tak by mu bolo dobre vysvetlit, ze zeleny(pripadne modry) vysledok unit testov este neznamena, ze tam nie je chyba a je efektivnejsie venovat tu pracu na ine testovanie, napr. CI/CD
Pokial by ste chceli ziskat argumenty pre svojho sefa, tak doporucujem sa ohanat nejakou normou, napr. ISTQB, kde su sylaby dostupne zdarma. IEEE ma nieco podobne, ale tam je pristup plateny.
Ja sa este skor stretavam s "manazerskym pohladom" v zmysle ako je mozne ze ten sw ma vobec chyby. Ved ked vam zadam sucet, a+b tak tam nieje co pokazit. A ak nahodou sa spravy preklep, tak vas na to predsa upozorni kompiler/editor/ide (z pohladu manazera proste word podciarkne zle slovo :-).
A druhy problem ktory byva je ze sa zacne nieco vyvijat v case t ked sa pouzije aktualny sw, prostredie, kniznice a skonci sa o par mesiacov/rokov, tak zrazu veci nefunguju ako by mali. Este sa da zmrazit vyvojove prostredie, pripadne test ale pride zakaznik ktory povie ze ma proste taketo prostredie a musi updatovat koli bezpecnosti a ma svojich klientov ktory pouzivaju uplne inu verziu browseru atd. A nie vzdy je mozne tlacit ze sw funguje len na specifickej verzii os/kniznic/aplikacii. Dnes aplikacie zavysia od obrovskeho mnozstva kniznic, prostredi atd. a je tazke odhadnut co ktora zmena/update prinesie respektive urobi s vyvijanou aplikaciou. Teda pokial niesu aspon nejake testy, aj ked vsetko sa obsiahnut asi neda.
"A druhy problem ktory byva je ze sa zacne nieco vyvijat v case t ked sa pouzije aktualny sw, prostredie, kniznice"
Zde jste naprosto přesně pojmenoval ten problém, který automatizované testy pomáhají alespoň detekovat. Možných změn u webové aplikace je spousta. Více o tom bude ve třetím díle této minisérie.
Osobne z praxe tomu moc neverim. V dnesnej dobe ked je popularne a in na vypisane jedneho riadku pouzit nejaky mega framework s x zavyslostami, ked web browser je uz pomaly samostany os mi to pride ako skoro nemozne. Bezne som sa stretol s bankovymi aplikaciami ale aj v medicnie kde sa to uzamkne na konkretnu verziu jvm a dalsich podpornych knizniciach inak to nebude fungovat. To je bezna prax a zakaznik to musi akceptovat. Pri podobnych projektoch to este ako tak ide, ide o vela penazi a komplexne systemy ale ak sa dodava nieco mensie a vela zakaznikom tak je dost tazke stanovit si striktne poziadavky. Nehovoriac ze potom staci ak nejaky admin zabudne pri konfiguracii vypnut automaticky update a je problem.
> Bezne som sa stretol s bankovymi aplikaciami ale aj v medicnie kde sa to uzamkne na konkretnu verziu jvm a dalsich podpornych knizniciach inak to nebude fungovat.
Ono je to logické. Tyhle aplikace potřebují mít vysokou míru spolehlivosti. Takže se pečlivě testují. Aby to testování bylo relevantní, tak provoz musí probíhat v prostředí co nejpodobnějším testům - jinak jsou testy pro kočku. Proto jsou jasně speficikovány podmínky, tedy verze knihoven, za kterých se aplikace testuje a pak provozuje.
Takovy manazer timto potvrzuje ze neni clovek na svem miste protoze chyby k vyvoji sw patri. Mel by se spise zajimat o to jake chyby a kde dochazi k chybovani. Jedna se o typo, zbytecna cyklomaticka komplexita, nejasna struktura ci spatny navrh architektury? Embedded vyvoj je uplne treba jina liga kde se nelze spolehat ani na signaly a typicky embedak pochybuje nekdy i o tom ze funguji fyzikalni zakony :-))) (specialne pro postizene : toto je sarkasmus).
Jak uvadis. Dnesni u jeje bejvy webovy sw neni staticka vec. Je to zivy ekosystem. To by opet manazer mel vedet a nechat si zpracovat vstupy na zaklade kterych se rozhodne zda-li updatovat komponentu /neupdatovat/patchovat/ placat to vsechno jak v Dedina systems. Po par cyklech zjisti naklady na manualni sjeti vsech testu a zacne prosazovat automaticke testovani. Protoze v strednedobem a dlouhodobem meritku usetri.
Nemuzeme vzit manazera ze sroubarny a posadit ho k vyvoji sw. Takhle to proste nefunguje. SW dev management je dosti specifickym odvetvim (to poznali uz blahe pameti v IBM a pri vyvoji sw pro lety apollo).
Hele, já jsem embeďák a řeknu ti, že fyzikální zákony opravdu leckdy nefungují. Jako když chtěl zákazník dát do zařízení PoE switch, do kterýho pustí veškerou šťávu pro zařízení i downlink porty po uplink portu :D Zákazníkovi jsme dali nabídku na normální switch bez PoE + PoE napájení nebo normální zdroj + PoE switch nebo bez switche. Dva měsíce se rozhodoval a pak se zeptal, jak teda dostaneme těch 100W do zařízení pro napájení PoE, když po PoE přitáhneme max. 15W. Je to marný.
Datasheetům taky nevěřím, dokud si to sám neoměřím. Beztak tam nejdůležitější věci ani nedávají. A knihovny od výrobců beru jenom jako velmi, velmi, velmi volnou inspiraci...
Testy jsou opravdu náročná věc, fixturu s automatikou na pět prototypů nikdo nezaplatí a až při přípravě výroby se řeší, jak to otestovat na lince... Standard
Na to odpoviem ze nemusim asi vsetkemu rozumiet :-). Poznam viacero projektakov, manazerov , ktory volekedy davno boli programatori, a dnes riadia projekty. A to co niekedy stvaraju, respektive aky maju pohlad je pre mna obcas nepochopitelne. Ono to bude asi tym ze prechodom na web aplikace (fuj) a zasadnym zvysenim koplexity dnesneho sw sa vsetko zrychlilo, skomplikovalo ? Bud si to neuvedomuju lebo to beru z pohladu svojej optiky z pred x rokov alebo to proste nechcu lebo su uz radi ze to nemusia drvit a studovat. Len to potom tak vyzera.
Číslo 2 až 3 krát jsem uvedl zhruba, protože (jak bude uvedeno v dalších dílech) je kódu testů (v mém případě!!!) zhruba tolikrát více, než kódu aplikace.
Pokud se bavíme o skutečných nákladech, platí Boehmův zákon: "čím dříve se na defekt přijde, tím je její oprava levnější"
Kvantifikován je ve:
McConnell, Steve: Code Complete (2nd ed.). Microsoft Press (2004); ISBN 0-7356-1967-0
Ale to je tabulka, kterou sem nedokáži vložit. :-(
Velmi zjednodušeně řečeno - pokud defekt vznikl ve fázi kódování a přišlo se na něj ve fázi používání, pak je jeho oprava 10 až 25 krát dražší, než kdyby se na něj přišlo např. jednotkovými testy.
Ale ještě jednou zdůrazňuji - berte tento komentář jen jako velmi stručnou a nepřesnou odpověď.
Náklady je nutné vidět v kontextu celého produktu a současně v dlouhodobějším horizontu.
Pokud teď investuji desítky hodin měsíčně do psaní regresních testů na objevené chyby, tak tím můžu ušetřit čas technické podpory v budoucnu, která bude se zákazníkem řešit méně chyb.
V důsledku toho bude potřeba méně servisních verzí s opravami chyb.
To zpětně sníží náklady na vývoj, který se může věnovat jiným úkolům.
Tady je nutné ještě říct, že každé testy je nutné kontrolovat, ladit a udržovat. Při pravidelném automatickém spouštění řádově ve stovkách spuštění za rok testy z různých důvodů občas "spadnou" i bez chyby v aplikaci nebo testu. Působí tady řada vnějších vlivů.
Z mých bohatých zkušeností vyplývá, že komplexní testy lze reálně prosadit pouze u dlouhodobého vývoje. To je typicky vývoj krabicového sw.
U zákaznického vývoje, kde se fakturují konkrétní malé úkoly to zákazník platit nechce. Zahrnout náklady ns testy do hodinové sazby programátora taky nejde protože pak by firma nebyla schopná konkurovat ostatním.
Jak už jsem psal výše, tak efekt vynaložených nákladů se často projeví až za dlouho dobu.
Dalo by se toho napsat ještě spoustu ale i tohle je hodně dlouhé. Tím by to zatím uzavřel.
Pochybuju, ze to byl sarkasmus, absolutne s tim nazorem souhlasim. Za poslednich 8 let sem vystridal 3 firmy - do te treti sem nastoupil cca pred 3 mesici. Nez sem nastoupil, chodil sem nekolik mesicu po pohovorech a potkal se s hroznou spoustou manazeru a sw architektu a podobnejch leaderu. A moje pohovory uz probihaj trosku jinak nez drive - spise nez by se oni ptali na me, tak se nejdriv ptam ja jak to funguje u nich a jakym zpusobem se testuje. A pokud me nepresvedeci, ze jejich procesy davaji smysl, tak podam ruku a odchazim. Poptavka po testerech je dneska enormni, kor kdyz ma clovek alespon zakladni zkusenosti s automatizovanym testovanim. Firmy uz si davno uvedomily, ze kvalitni testovaci tym je z dlouhodobyho hlediska neskutecnym prinosem a v zadnym pripade nesmi chybet na zadnym sw projektu. Hodne to tahnou zahranicni firmy, ktery si u nas (napr Praha) otevrely pobocky a ktery si jedou moderni zpusoby vyvoje (TDD apod). Ve firme kde sem ted je pomer testeru na vyvojare cca 2:1 (2 testeri na jednoho vyvojare), coz je velice prijemnej extrem, kterej neni uplne normalni, ale v kontextu nasi firmy (zdravotnictvi) je vyslovene nutnej. Takze ano, testeri maji v dnesni dobe na vyber a muzou si vybrat firmu, ve ktery uz davno pochopili, ze QA je nedilnou soucasti vyvoje sw a neda se na tom setrit.
Docela fajn clanek, ale rad bych podotknul nasledujici (mimo jine vzhledem k ambicioznimu titulku):
* chybeli mi v clanku nejake odkazy na prakticke ukazky a priklady vyuziti PageObjectModelu, JUnit a treba take TestNG ... pro lepsi predstatavu.
* clanek mohl byt vhodne doplnen take o sekci/odstavec popisujici oblast BDD
...tedy jakousi kombinaci s Gherkin/Cucumber (napriklad Cucumber-jvm.).
* postradal jsem principy prace ve stylu robot-framework = vyuziti keywords a odstineni testera od kodu testovaciho skriptu
* velmi dulezitou soucasti automatizovanych testu je DataDrivenTesting [DDT], bez ktereho se lze bavit spise o te variante polo-automatizovaneho testovani
* hodil by odstavec popisujici propojeni na CI/CD (napriklad Jenkins-CI/GitLab-CI) bez ktereho to take neni ono
[ = snaha testy poustet kdykoli se neco nasadi ]
Díky moc za náměty!
Vedlejším důvodem pro napsání této minisérie článků je totiž pro mne možnost zístat odezvu z _reálné_ praxe.
Takže ačkoliv Vy osobně se zřejmě z mých článků nic nového nedozvíte (to berte jako prosím výraz uznání!), dal jste mi důležitou zpětnou vazbu, co všechno se používá nebo používat může.
Není všem dnům konec - podle nashromážděných námětů plánuji v historicky krátké době provést další experimenty.
S Katalonem mám nějaké základní (a dobré) zkušenosti. Ale dosud jsem jej používal pouze pro skripty. Myslím si, že mnou použitý přístup "plnohodnotných programu" dává větší možnosti.
Vyčkejte, prosím, na další díly minisérie. A pokud zjistíte, že máte jiné zkušenosti, prosím, dejte mi o nich vědět.
Zkušenosti z praxe jsou pro mne velmi důležitá zpětná vazba.
Me by velmi zaujimala hlavne prakticke evaluace UI testovani. Dva roky zpet pri praci v jedne nadnarodni firme jsem mel tu cest s velmi masivnim nasazenim Selenium. Neuveritelne mnozstvi casu slo na vrub resnei problemu spojenych s nestabilitou a nespolehlivosti. Byly testy ktere proste byly takzvane "flaky", zcela nahodne Selenium Driver nefungoval jak mel, kazdy test bylo tedy nutno opakovat nejmene petkrat nez byl vyodnoceny jako spatny. Ctyrikrat predtim melo Selenium nekam kliknout a klik se proste neudelal, po pate to najednou slo. Atd.
Ve vysledku se podarilo odladit 90% testu tak aby fungovaly jakz takz spolehlive na firefoxu verze X.Y, pak vysla verze X.Z a mohli jsme zacit odznova. Nevim jestli se za posledni dobe neco z toho zlepsilo a jak je zo se spolehlivosti co se aktualnich verzi prohlizecu tyce.
Nedokáži souhrnně odpovědět a opět poprosím o trpělivost a přečtení dalších dílů této minisérie, kde možná najdete alespoň částečné odpovědi.
To, co mohu ze svých zkušeností říci je, že Selenium WebDriver udělal v posledním roce (dvou???) ohromný pokrok.
Druhá věc je verze prohlížečů a na ně navázané drivery pro Selenium WebDriver. Podle Vašeho příspěvku soudím, že jste Selenium WebDriver používal ještě v době, kdy byl Firefox defaultním prohlížečem (driver pro něj byl součástí Selenia). To již cca (???) dva roky není, Firefox má samostatný driver jako ostatní prohlížeče a dle mého to výrazně přispělo ke spolehlivosti spojení Firefox a Selenium.
Autor zmiňuje, že nekorektní uživatelský vstup lze omezit použitím vhodných vstupních elementů, takže pak není třeba tolik negativních testů na vstupy.
Tyto elementy ovšem nezabraňují odeslání nekorektních dat na server, takže bych podobné poučky radši nezmiňoval, aby nepoučení vývojáři nežili ve falešném pocitu, že je o vše postaráno...
Zde jsem to asi napsal špatně pochopitelně. Měl jsem tím na mysli situaci, kdy např. počet piv ;-) (viz následující příspěvek od lobo) se zadává pomocí výběrového seznamu nebo posuvníku. A z něj jde na server vždy jen kladné celé číslo v definovaném rozsahu (takže "ještěrku" skutečně nejde zadat :-) ). Nebo se pro zadání data místo tří vstupních polí (den, měsíc a rok), kam by šlo opravdu napsak jakoukoliv blbost, použije specializovaná komponenta, která nedovolí použít špatný formát a dokonce ani neexistující datum. Jasně, můžeme si splést 3. a 4. leden 2019, ale nemůžeme zadat ani formátově vyhovující 30.2.2019.
Z tohoto pohledu nerozumím větě: "Tyto elementy ovšem nezabraňují odeslání nekorektních dat na server..."
Chtěl jsem tím říci, že záškodník může do http requestu libovolně zasahovat a měnit ho, tedy místo data prostě může poslat třeba "ještěrku" a tedy to ověření správnosti dat musí být (také) na serveru a tedy si to zaslouží negativní testy stejné jako kdyby se žádná chytrá komponenta na straně klienta nepoužila.
Děkuji za jasné vysvětlení. Z tohoto pohledu bych chtěl říci, že máte naprostou pravdu o potřebě negativních testů na serveru. Ovšem musím kajícně přiznat, že tento typ testování (nazval bych jej už bezpečnostním, protože vyžaduje kvalifikovaného útočníka) jsem ve svých pokusech vůbec neprováděl.
Ale rozhodně děkuji za dobrý námět k přemýšlení.
Určitě se o této problematice prosím alespoň zmiňte, protože první věc, která někoho napadne, bude vyzkoušet si SQL injection a podobné srandičky. Taky ne vždy je dobré web komponentám věřit, že všechno ohlídají a že budou fungovat u všech uživatelů stejně (například počet znaků - znamená to počet bajtů, počet znaků, co se stane v případě right-to-left jazyků, v případě použití IME atd.).
ony jsou to možná spíš reakce na titulek článku :-), i když těžko říct, jak chápat ty uvozovky. Obecně platí, že to, co je na klientovi, nemůžeme jako develové moc ovlivnit ani uhlídat, takže kontrola vstupu na webové části je fajn a důležitá (asi to spadá do functionality a usability), ale kontrola na straně serveru je stejně nutná, možná ještě víc.
Jedna věc totiž je, že klientovi něco nepojede, když zapíše nevalidní údaje a druhá věc leak dat nebo nějaká ještě horší akce na serveru. Ale tam je toho ještě mega víc než jen prostá kontrola vstupů, samozřejmě záleží na kontextu, právech, skupinách, možná i na analyzované historii chování uživatele (to ale asi dělá málokdo, i když bych to uvítal) a ... je toho prostě moc...
Uvozovky u "pořádně" otestovat mají právě význam relativizace. Otestovat něco stoprocentně podle všech dimenzí kvality je nadlidský úkol. Já si ani netroufám říci, že jsem to _pořádně_ (tj. bez relativizujících uvozovek) otestoval funkcionálně. Přesto ten počet potřebných testů byl pro mne značným překvapením.
Bezpečnostní testování lze provádět i automaticky, jmenuje se to fuzz testing: https://en.wikipedia.org/wiki/Fuzzing.
A existuje na to spousta toolů jak pro konkrétní programovací jazyky (např. https://llvm.org/docs/LibFuzzer.html), tak i univerzální (http://lcamtuf.coredump.cx/afl/).
Kvalifikovaného útočníka to až tak nevyžaduje, protože existuje i spousta podobných toolů pro automatické útočení :).
jj fuzz testing je hodně zajímavej, hlavně ve chvíli, kdy se už začínáme tvářit, že je dotestováno a všechno vypadá v pohodě :-)
Právě si s tím hraju u našich REST API služeb (mám vlastní fuzzer, protože pro Python jsem nic pěkného nenašel) a je až neuvěřitelné, což všechno jsou ty služby schopné zkousnout za vstup :-) Samozřejmě to většinou zhavaruje někde dál, protože si to odchytne DB apod., ale někdy se podařilo zcela nesmyslná data "prohodit" právě až do databáze (grafové a dokumentové bez pořádného schématu)
Dobře, určitě se o tom dá napsat (doufejme že zajímavý) článek. Asi bych zmínil klasiku http://lcamtuf.coredump.cx/afl/ a asi zmínil ty REST API testy, protože s tím se asi setká hodně vývojářů Díky za tip!
Inu, toto mne opravdu zarazi. Autor pise o testovani WEBovych aplikaci a pri tom pise, ze je mozne omezit vstupy pouzitim spravne komponenty na klientu. Proboha, to je opravdu o webovych aplikacich? Toto ucite sve studenty?
Neni to zadny namet k premysleni. To je naprosty elementarni zaklad, ktery dneska musi znat kazdy student!!! Programator musi oddelovat weboveho klienta a serverovou cast. Nikdy se nesmi nikdo spolehat na data z weboveho klienta. Zarazi mne takto skolacka chyba u pana Herouta.
pred lety jsem pracoval v projektu, kde bylo mnoho rozhranni a subsystemu a pres ta rozhrani se posilala data. Jeden kolega, matematik prosadil presne to same co rikate, kazdy transfer dat byl neustale a znova verifikovan, jedno pres kolik to slo rozhrani.
To vse je sice teoreticky tak 'spravne', ale projekt zkrachoval, protoze zakaznik nebyl ochoten platit ty vicenaklady - pri navrhu toho software u toho ten matematik totiz jeste nebyl. Pamatuji si na ty diskuze jako dnes, jak se argumentovalo, ze jak prijdou data k sevru, tak je to treba zkontrolovat, protoze kdo vi, co se cestou zmenilo. :-)
Abych byl uprimny, s lidmi jako vy zasadne nepracuji, protoze ja rad zadanou praci dokoncuji v terminu.
Alespoň nějaká kontrola na serveru by proběhnout měla.
Já to řeším tak, že u klienta je podrobná kontrola s hezkým výpisem, co je zadané špatně a jak by to mělo být správně.
Na serveru je pak její zhuštěná verze, která při nekorektním vstupu jen vrátí odpověď, že data jsou chybná (žádné detailní pitvání, protože někdo nejspíš jen odeslal data nekorektním způsobem).
takze na tom servru ta data zkontrolujete, a kdyz bude vse vporadku, tak treba cast tech dat ulozite do DB a nejaka data poslete dal. Treba k nejakemu dalsimu servru. A tam ta data samozrejme zkontrolujete, protoze by se mohlo stat, ze se cestou neco zmenilo. A tak dale, a tak dale.
Ze zkusenosti vim, ze nakonec dojdete do situace, kdy se rozhodnete tem datum proste verit. A nebude to vubec nic neprofesionalniho nebo hloupeho. Uvedomite si, ze v urcitych situacich je ta pravdepodobnost, ze se v tech jednotlivych fazich zpracovani muze neco zmenit tak miziva, ze budete ta data povazovat za spravna -> proste se spolehnete na ty predchozi kontroly.
Autor clanku nikde presne nespecifikoval, jak bude jeho aplikace vypadat. Treba bude pouzivat komponenty, ktere jsou tak chytre udelane, ze bude jen s velkou namahou mozne ta data nejakym zpusobem modifikovat. (ten priklad s tim vyvojarskym panelem v browseru). Pak je mozno na servru povazovat ta data za validni, protoze to uz nekdo zkontroloval.
Samozrejme je ten vas postup rozumny a ja netvrdim, ze kontrola dat na servru je nesmysl a ztrata casu. Vadi mi ovsem, kdyz nekdo pronasi ty vyse uvedene 'absolutni' pravdy, ze kontrolovat je potreba !VZDY!
Vstupy je třeba kontrolovat !VŽDY!, když přichází z nedůvěryhodného zdroje - třeba když je tam cvaká člověk. Smysl nemá (nemusí mít) kontrola na každém důvěryhodném článku řetězce: když posílám zkontrolovaná data ze serveru na server a to zabezpečeným kanálem, má smysl jim věřit, protože už jednou zkontrolována byla.
Cokoliv z prohlížeče/electronu je třeba považovat za nedůvěryhodné a na serveru to zkontrolovat a případně nepustit dál, právě proto, aby takové požadavky nemohly nakazit ty části systému, které kontroly neprovádí. Nemusí to být žádná krása: "chyba v poli X - končím".
"Treba bude pouzivat komponenty, ktere jsou tak chytre udelane, ze bude jen s velkou namahou mozne ta data nejakym zpusobem modifikovat. (ten priklad s tim vyvojarskym panelem v browseru). Pak je mozno na servru povazovat ta data za validni, protoze to uz nekdo zkontroloval."
To může přijít těžké leda tobě.
Ve skutečnosti je svět plný lidí, co ti tam toho Bobbyho Tablese pošlou.
@honza
Jasně že je potřeba kontrlolovat vždy. Minimálně vůči uřité technologii, která má něco někam posunout odněkud někam. V tvém příkladu, když tedy obecném tak tedy obecně, zkotroluješ na frontendu to co zajímá uživatele (např. věk musí být int), zkontroluješ různé další druhy chyb a ůtoků na frontend, odešleš např. json na server a tam zkontroluješ co to má obsahovat a jak to má vypadat, co máš uložit ošetříš pro uložení, co máš přeposlat ošetříš pro přeposlání. Ano, není to tak jednoduché jako to prostě někam vrazit, protože už to kontroloval někdo jiný někde jinde ...
Re: honza (neregistrovaný) ---.dip0.t-ipconnect.de
Máte pravdu. Ta hranice, kdy už datům věřím, ale není jedna. Pro každý údaj je jiná. Je dána spíš tím, kde ještě se dá něco ověřit. Takže třebas to, zda zákazník existuje, se dá ověřovat až do úplného konce pomocí integritních omezení. Zda je částka v nějakém intervalu se také dá, byť tohle se moc nedělá. Ale třebas zda zákazník má dostatečný kredit na danou transkci, to už ověřit nejde a tam se vskutku musíte spolehnout na to, že to ověřil někdo výš. Už proto, že vlastně vůbec nemáte tušení o tom, co účtujete - je to prodej, storno, vratka, dobití kreditu, vratka zálohy, kurzový rozdíl, nebo co to vlastně je? Podobně při zápisu do hlavní knihy - úplně na konci je něco, co zapisuje řádek do účetnictví. A tohle něco se musí spolehnout na to, že ten, kdo to zavolal, to zavolá i podruhé a udělá tak správně zápis do podvojného účetnictví.
Tady ale někteří diskutují budou nesouhlasit. Bude to záležet na tom, kde oni mají nakreslené čáry a co považují za jeden celek. Já vyrostl na třívrstvé architektuře. Takže od databáze čekám jen integritní omezení. Kontrolu smysluplnosti dat pak očekávám od aplikačního serveru. V takové architektuře máte pravdu - databázový server věří tomu, že aplikační server již vše zkontroloval. Databáze sama nezná logiku aplikace, takže většinu kontrol ani nemá jak provést.
Zda s tvrzením "některé kontroly se nedají provádět až do konce a proto se na konci velké části dat musí věřit" bude konkrétní člověk souhlasit pak záleží na tom, zda vidí jen hranici mezi "klient" a "aplikační server", nebo zda vidí těch hranic víc, například právě tu mezi RDBMS a aplikačním serverem. Ti, co hranici databáze - aplikační server nevidí, vám těžko přiznají, že na téhle hranici už řadě věcí prostě věřit musíte.
K tomu jedna důležitá, ale obvykle zcela přehlížená věc: pokud chci, aby databáze mohla věřit datům z aplikačního serveru, tak si musím být jistý tím, s kým si povídám. Takže v databázi několik uživatelů, každý s pořádným heslem a velmi přesně omezenými přístupovými právy. Aplikační server prostě nemá důvod mít práva vytvářet nebo rušit tabulky, do řady tabulek není ani důvod aby měl práva DELETE. Pokud se do databáze hrabe více aplikací, tak každá má vlastního uživatele a vlastní práva. Docházka nemá co hrabat do kusovníků nebo si číst v účetnictví. Pokud chci mít jo jistotu, tak postavím čtvrtou vrstvu z vložených procedur přímo v databázi, která mi aspoň ty nejdůležitější věci typu změny hesla nebo plánování úloh ohlídá. Porovnejte to s typickou MySQL + PHP aplikací, kde je jediný uživatel, který má právo na úplně cokoliv.
Ja zase zasadne nepracuji s lidmi vaseho typu. Je krasne mit super komponenty v javascriptu, ktere uzivateli nedovoli zadat nevalidni data, ale vtip je v tom, ze zdrojem dat nemusi vubec byt webovy js klient. Muze to byt curl bot, api klient, hacker s telnetem, atd. To je uplne jedno. Funkcni backendovy celek proste musi resit validace svych vstupu. Spravny pristup je publikovat webove sluzby a pak je vam lhostejno, jestli k nim pristupuje webovy js klient, api klient, atd. O vice naklady se zpravidla nejedna. Naopak prinosem je lepsi skalovatelnost, testovatelnost a moznost prave vice klientu: zakaznicke api, webovy klient, mobilni aplikace, atd.
Ano, pokial sa nestane ze tvorca formularu objavil ze sa da cez js menit dom a spravy formular ktory sa v urcitom momente neda validne vyplnit lebo autor meni hodnoty. Potom ma clovek takeho "tvrocu" zabit. A ze to nieje nic vynimocne hlavne pri roznych statnych weboch kde tie formulare , respektive ich komplexnost je asi oknom do duse pomateneho uradnika.
Moc pěkný článek, ale jako vývojář bych opravdu ocenil server-side testy. Pokud nemáte nějakou full-JS nebo full-ajax aplikaci pak se business logika nachází na serveru a tam je to třeba testovat. Tím nechci podceňovat UX testy, ale přeci jen budu radši když se rozstreli GUI než když se rozstreli DB. Z praxe také vím že se nezle spoléhat vůbec na nic co Vám přijde z prohlížeče jak už tu kdosi psal. Veškeré vstupy se musí musí testovat a escapovat, v dnešní době kdy i děti na ZŠ znají vývojářský panel a celý selectbox si umí nahradit textovým polem prostě nelze nic z toho co přijde brát jako bezpečnou a správně formátovanou hodnotou.
Proto by server měl vědět co třeba poslal jako hodnoty v selectboxu a vstup z něj náležitě kontrolovat(jsou ale situace, kde to nejde nebo to zlé jen těžko provést). Ještě jednou díky :)
Asi bych nehazel flintu do zita. Preci jen je to seznameni s miniserialem a treba to doplni popr. je mozne ze udela dalsi miniserial. Osobne to beru spise jako nestastne vybrany nazev serialu(ale nechme se prekvapit).
Navic co jsem pochopil, tak to nevyucuje resp. testovani nevyucuje vubec(coz je samo o sobe chyba, za kterou ale on jako vyucujici uz nemuze). Nicmene chapu i Vasi frustraci, protoze v kontextu nazvu spolecne s obsahem je to prinejmensim zavadejici a lecktereho zacatecnika pro, ktere je clanek perfektne namiren muze zmast a vnuknout myslenku ze testovani frontendu je dulezitejsi nez backend.
Mohu tedy kritizovat pouze nazev, ale clanek/serial podobneho rozsahu a kvality jsem zde hodne dlouho nevidel, takze i tak jsem za nej rad.
@Seamonker
Nesouhlasím s tím, že když někdo použije termíny bílá a černá skříňka, tak bude u pohovoru vypadat jako debil. (Samozřejmě, pokud je použije u výhradně anglicky mluvící firmy, pak ano :-D )
Tyto termíny jsou používané termíny z CaSTB, což je organizace, která má v prostředí českého a slovenského testování určitý nezanedbatelný význam.
V zivote je spousta situaci, kdy je kazdy z nas (vcetne tebe i mne) za debila (rozumej lidi z nej maji srandu), to se nerovna, ze je debil.
Jsem silny v metodice testovani cerne skrinky, testovani bile skrinky neni moje silna stranka. Take mam zkusenost s nastroji pro testy extremni zateze a testy zatezovych profilu. Dale mne bavi testovani prenositelnosti, poravnavani po spusteni a testovani schopnosti zotaveni.
Viz http://castb.org/wp-content/uploads/2018/09/ISTQB_CZ_Glossary_20180831.pdf <-- takto budes za toho debila.
No já jsem to pochopil. Ale když vidím, jak lidi čím dál tím víc k*rví češtinu a jsou tak cool, že si v každé třetí větě nedokážou vzpomenout na běžné české sloveso (mmm a jak se to řekne česky, aha "obohatit") a namísto "domluvit" si lámou jazyk pitomostmi typu "vykomunikovat", přijde mi snaha tu češtinu kultivovat a hájit jako sympatická a ne směšná. Té tvojí "směšné větě" jsem bez problémů porozuměl (jo a neříkám "kryptovat", nýbrž "šifrovat").
@Seamonker
Odpověď na otázku - nemám za sebou žádnou praxi. Jsem z akademické sféry, což lze vyčíst i z informací zveřejněných současně s článkem.
Důvod uvedení odkazu na slovník CaSTB jsem nepochopil. CaSTB se mj. snaží o zavedení a sjednocení české terminologie. Nemyslím si, že je na používání české terminologie něco špatného a už vůbec ne na snahách o její sjednocení.
Myslím si, že nemá cenu v tomto vláknu pokračovat, společnou řeč asi nenalezneme, takže navrhuji si nekazit vzájemně náladu ;-)
Divej, rozdil mezi akademickou teorii a praxi je casto dost velkej, podle me delas akorat medvedi sluzbu sobe a zacatecnikum s prekladem terminu, ktery se v praxi proste nepouzivaji (at si jakakoliv komise mysli co chce).
Samozrejme pokud nestojis o komenty z praxe, tak se pod dalsima dilama budu drzet zpet.
PS - ten slovnik obsahuje vyrazy jako "firemní dashboard", "komise pro management
defektů" nebo "management testovacích dat" dal pro jistotu uz nic nepisu.
Re: Jakub Daněk (neregistrovaný) ---.net.upcbroadband.cz
Já se občas setkal s tím, že české termity naopak vymýšlely pracovnice z personálního a za debila měly uchazeče, který jim nerozumněl. Že se k tomu schyluje se poznalo tak, že holky kupříkladu začaly vyzvídat, co že vlastně MRB dělá a jak se "Material Review Board" řekne česky. Tuším že se tehdy dobraly k něčemu jako "tabule kontroly materiálu". Každopádně ten termit pak použily v inzerátu i při pohovorech. A samozřejmě stylem "Máte nějaké zkušenosti s tabulí kontroly materiálu? Ne? Hmm, body dolů."
Podme pekne od zaciatku. Je to nepresne ale predsa.
Pohlad obycajneho cloveka:
vlozil som na ucet 151.15eur
Pohlad programatora/databazy/systemu/cpu:
0 1000 0110 00101110010011001100110
0 - 0 kladne cislo
1000 0110 - 2^7 kladny exponent
0.00101110010011001100110b - 1.1808593273162842 mantisa
Vlozene cislo: 151.15
Ulozene Cislo: 151.149993896484375
Chyba: -0.000006103515625
V dnesnej dobe sa uz nebavime o programatoroch ale o developeroch o ludoch co neriesia low level veci.
Vývojář je placený mj. za to, že ví, jaký datový typ použít.
Každý vývojář* přece ví, že float je pro počítání peněz nevhodný, protože neoperuješ s 0,235E-7€ a je tam nepřesnost při ukládání. Takže použije k tomu přímo určený typ currency.
Pokud není k dispozici currency, jede se ve fixed pointu třeba na čtyři desetinný místa. (natvrdo třeba INT64 a exponent 0,0001)
*) Pokud nezná základní typy používanýho jazyka a jejich určení, není to vývojář, ale patla a měl by platit on zaměstnavateli za to, že mu dává možnost seberealizace a ne naopak.