• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    KOJAProgramovani 40+
    Diskuze o obzive programovanim pro starsi a pokrocile.
    rozbalit záhlaví
    JANFROG
    JANFROG --- ---
    ALMAD: K te korektnosti - na te stejne konferenci byl i typek z Google (Michael cosi) co dela na sandboxu ve V8. Ten rikal, ze pres 90% vsech security issues co maji je ve skutecnosti "correctness issue" a tedy ze security <=> correctnes.

    Samozrejme, vsichni vime, jak zakazniky zajima security :-) takze mas pravdu, neni to protiargument k tomu co rika ten clovek z rethinkdb.
    ALMAD
    ALMAD --- ---
    JANFROG: Moc ne, je to spis anekdotalni/osobni zkusenost.

    Protipriklad ve smyslu ze projekty co se prilis soustredily na korektnost testu misto delivery dost casto neusoely proti konkurenci co to delala naopak.

    Mluvi o tom treba rethinkdb tady https://gist.github.com/ramalho/93b87e961b6e019be8e1f6f82864b6f9#wrong-metrics-of-goodness

    Ale samozrejme na podporu NOHOUS, tak nejak zalezi jestli se bavime o databazi, kompilatoru, kernelu, webovym frontendu a nebo beznym SaaSu :)
    JANFROG
    JANFROG --- ---
    ALMAD: Mas po ruce nejaky prehledny text ktery o tom pojednava?

    A s tema protiprikladama - nejak nechapu cos tim myslel. Protipriklady k cemu?
    NOHOUS
    NOHOUS --- ---
    v cislicovych navrzich se jede constrained random a to je taky peklo sveho druhu, ale tam nastesti jakmile design splni specifikaci, uz do nej nikdo nema moc tendenci hrabat. Kazdopadne korporaty jedou v teto oblasti tezky waterfall s oddelenym verifikacnim a implementacnim tymem; priserne je, ze se neda moc testovat inkrementalne, verifikacni tym jede typicky black box integracni test.
    ALMAD
    ALMAD --- ---
    JANFROG: Ono jde taky o to jaky testy. On se v podstate zazil jeden typ testu a to regression testy, ale je toho mnohem vic a s jinejma pristupama, jenom se to nikdy nedostalo do mainstreamu.

    Jediny co me na tom trapi je, ze ty showcasy co to moc pekne popsaly jsou software projekty co se jaksi neprosadily, myslim ze tam muze byt urcita kauzalita :)

    IMHO dva hlavni protipriklady jsou AWS sluzby a TLA+ (ale to uz je spis formalni verifikace nez testy) a SQLite, co to ma imho udelany i popsany moc hezky.

    How SQLite Is Tested
    https://www.sqlite.org/testing.html
    AXTHEB
    AXTHEB --- ---
    SULTHAN: Neznám jazyk/framework, kde by ten můj přístup nefungoval. Ale těžko ti to vysvětlím, když ho považuješ za damage.
    SATAI
    SATAI --- ---
    SULTHAN: pak nechápu, proč jsi jmenoval Javu, kde to fakt nemusíš řešit jako příklad něčeho, kde to dělat musíš
    SATAI
    SATAI --- ---
    AXTHEB: většinou mi nejlépe vycházelo mockovat věci na rozhraní systémů...
    SULTHAN
    SULTHAN --- ---
    AXTHEB:
    SATAI:

    Budu se opakovat: Hodně záleží na tom, v jakém jazyku a frameworku pracuješ.
    AXTHEB
    AXTHEB --- ---
    SULTHAN: Vidíš, moje zkušenost je přesně opačná. Jakmile dynamicky mockuješ metody, velmi svižně se dostaneš do situace, kdy tě testy táhnou k zemi, naprosto znemožňují jakýkoliv refaktoring a stane se přesně to, co se tu píše dole - máš kupu náhodně failujicích testů a si v háji. Na druhou stranu, pokud to rozhraní abstrahuješ a uděláš nějakou smysluplnou třídu co tu službu používá, tak se v tom snadno udržuje pořádek a přehled. A když se ta služba změní, stačí opravit ten interface a třídu, která tu službu používá.
    SATAI
    SATAI --- ---
    SULTHAN: nic takového v Javě dělat nemusíš
    VOY
    VOY --- ---
    SULTHAN: jsou i codebase v typescriptu kde bys tenhle damage našel :-)
    SULTHAN
    SULTHAN --- ---
    SATAI: Hodně záleží na tom, v jakém jazyku a frameworku pracuješ.

    Třeba v javascriptu se mockuje krásně - tam si vezmeš implementaci služby a dynamicky na ní nějakou funkci změníš na mock a použiješ to v testu. To ale ve většině jazyků udělat nemůžeš, takže abys nějakou službu mohl namockovat, tak její rozhraní musíš abstrahovat (např. Java interface) a mít separátní "reálnou" a "mock" implementaci (některé test frameworky samozřejmě ten "mock" vygenerují z rozhraní samy).
    Ale právě ta existence single-use rozhraní ti zbytečně komplikuje kód a je to jedna z nejtypičtějších "test induced design damage".
    SATAI
    SATAI --- ---
    SULTHAN: netvrdím, že se to neděje, ale přijde mi, že tak 80 procent změn kvůli testovatelnosti bylo k lepšímu
    SULTHAN
    SULTHAN --- ---
    JANFROG: Já mám rád termín "test induced design damage". Obecně jsou to všechny změny architektury, které musíte udělat, aby Váš kód byl testovatelný, například různé dependency injections.
    V minulosti jsem nucen psát kód v naprosto nepřehledné a otřesné architektuře, jejíž jediným smyslem bylo to, aby některé normálně neoddělitelné části kódu byly testovatelné samostatně.
    JANFROG
    JANFROG --- ---
    ANT_39: Ja myslim, ze nejsme ve pri. Testy pisu, dokonce je pise i kolega co testy v zasade neuznava :-) Sitovej stack je rekl bych stejne peklo jen s jinou prichuti.

    Proc o tom mluvim je, ze - alespon co si pamatuji - jsem nikde v zadnem textu / prednasce vysvetlujicim dulezitost testu, TDD apod, nevidel zminen fakt, ze od jiste komplexity toho systemu testy neskaluji.

    Jinak to cislo 5% jsem si vycucal z prstu, zadne konkretni cislo nepadlo, mozna je to min, nevim. Spis jsem chtel rici, ze proste nejaka mira failujich testu se proste toleruje. Neco podobneho jak jsi popisoval (flaky vs. non-flaky failures) delaji, ale neni to snadne a uz mas zase nejaky system nad tim, co sbira historicke data a z toho dela statisticke modely co jeste je ok a co uz ne. A to stoji dost energie a co ja vim, neni na to zadna standardni literatura co si prectes a vis jak na to (na rozdil od treba register alokatoru nebo refinements).
    ANT_39
    ANT_39 --- ---
    JANFROG: Jo, noise u testu je problem. Napsal jsem robustni a spolehlive, ale treba v mym pripade konkretne jde o testy sitovych zarizeni a linuxovyho sitovyho stacku, a ty sitovy veci proste jsou spis noisy. Je tam kupa ruznych timeoutu, je to slozitej dynamickej system. Ted ty testy se pousti na milionu ruznych typu HW, ve virtualkach ruznych konfiguraci, na HW switchich, s offloadama... Cili je tezky udelat skutecne robustni test. A kazdej test je v dusledku proste kod, kterej je treba maintainovat, kterej bitrotuje, a jehoz samostatna existence tim padem neco stoji.

    I tak se velice vyplati kazdou featuru mit testama pokrytou, pokud mozno. Aspon v Linuxu se ten sitovej stack furt hejbe, a zaroven je tam dost vzajemnych zavislosti, a zpusobu jak to nakonfigurovat, a ktery casti v tom kernelu mit a ktery nemit, a pak do toho jeste vstupuje jakou trafiku na tom poustis. Tam se nejde s zadnou mirou jistoty podivat na patch a vedet, tohle bude fungovat a nikoho to nerozbije. Potrebujes testy.

    Plus ty testy funguji jako navod, jak tu featuru pripadne nakonfigurovat, implicitni dokumentace!

    Ty delas myslim dost toolchain, prekladace, VMka, tenhle druh veci, tam si dovedu predstavit, ze je to podobna cerna magie napsat robustni test, protoze z verze na verzi bude prekladac prekladat mirne jinak, a jde o to, jestli se tim trefi do tolerancniho okna toho testu. Nemluve pak o vecech jako testovani, co ja vim, instruction schedulingu. Vlad Makarov delaval (a mozna porad dela, ale uz nejsem v RH) perf testy GCC, a zminoval, ze dosadnout reproducibility je velkej problem.

    Takze ad tech 5 %... hele, mas notoricky flaky testy, ty by pochopitelne bylo dobry fixnout, aby prestaly byt flaky, ale kdyz ti v mergi popadaji tyhle, asi se nad tim da pokrcit rameny. Pokud mas byt 2 % failu v "cistejch" testech... ehh, asi bych spis nemergoval :) Ale neznam podrobnosti. Jsem si jistej, ze to je nejakej kompromis mezi tim, aby se maintainer nezblaznil a koza zustala cela.
    SUCHRE
    SUCHRE --- ---
    Vetsina z nas stejne dela na softwaru nebo systemu, kterej je zbytnej a jestli funguje dobre nebo spatne, je ve finale uplne jedno, protoze nejde o zdravi ani zivot.

    Mimochodem GraalVM je skvela vec, nechapu, proc ho u jednoho z minulejch projektu porad ignorovali, kdyz to zlepsovalo vykon bez nutnosti optimalizovat jejich prumernej kod v jave.
    TMA
    TMA --- ---
    Testy jsou užitečné, ale...
    The first moral of the story is that program testing can be used very effectively to show the presence of bugs but never to show their absence.
    --Edsger W. Dijkstra, EWD303

    E.W. Dijkstra Archive: On the reliability of programs. (EWD303)
    https://www.cs.utexas.edu/~EWD/transcriptions/EWD03xx/EWD303.html

    Dijkstra: Testing shows the presence, not the absence of bugs.

    http://homepages.cs.ncl.ac.uk/brian.randell/NATO/nato1969.PDF

    strana 16
    JANFROG
    JANFROG --- ---
    ANT_39: S tema testama je to takove zradne. Zrovna minuly tyden jsem mluvil s Thomasem Wuerthingerem (GraalVM) a ten rikal, ze jen *provoz* HW na testy je velmi vyrazna cast rozpoctu celeho projektu. A to jeste nepousti testy vsechny, protoze sjet vsechny testy ve vsech konfiguracich by trvalo roky. Navic v tom mnozstvi proste vzdycky nejakej test selze a nikdo nevi proc takze to konci tak ze si reknes "do 5% failures je to good-enough pro merge" :-)

    U svych projektu vidim presne tenhle trend taky (byt samozrejme v mnohem mensim meritku). Pridas ficuru a cas na testu se zdvojnasobi.

    Proste od nejakeho bodu jsou testy solidni bolehlav sam o sobe.
    ANT_39
    ANT_39 --- ---
    DARK_ONE: Dík, kouknu. Jsem mírně skeptickej, protože často mám X commitů, který postupně mění jednu část kódu, a netuším jak dobře je schopný to dělat tu disambiguaci, ale v průměru by to mělo být užitečný.
    Kliknutím sem můžete změnit nastavení reklam