A teszttel nem a belso mukodest kell tesztelni, ha elindulsz a privat dolgok tesztelesenek az utjan es refaktoralni akarsz...mert hat a privatot miert ne irhatnam at csak azaz osztaly hasznalja...you gonna have a bad time. Meg alapvetoen semmibe veszi az egysegbezarast.
Ha nagyon kellene valami privatot tesztelni, ott lehet egy masik osztaly stb bujik meg es jobb kiemelni es kulon tesztelni.
Ezt sokat hallani. Ehhez képest mindenki, akit eddig láttam az implementációt figyelembe véve írja a teszteket, elágazások, ciklusok és kivétel-blokkok mentén, és általában ezt lefedettségi metrikákkal ellenőrzi is.
Ha valóban csak a felületet tesztelnéd, akkor a függvényed teljes értelmezési tartományát bejárnád, az összes paramétered összes kombinációját végigpróbálva. Gyanítom, hogy te sem így csinálod.
akit eddig láttam az implementációt figyelembe véve írja a teszteket, elágazások, ciklusok és kivétel-blokkok mentén
De hát akkor még meg sincs a kód, amikor a tesztet írod ;)
A viccet félretéve azt tudod, hogy az adott implementáció milyen inputra milyen outputot kell adjon. Ehhez semmit nem kell tudni a belső működéséről. És butaság is a tesztet bármilyen belső működéshez, változóhoz stb kötni. Csak a refaktor költségét növelik, és ha a teszt nem tudja ezt nélkülözni, akkor az inkább valami tervezési hibára utal.
Én egyetértek vbencével és blacksonic-kal. Soha nem csináltam ilyet és nem is szeretnék.
De, de miért kéne ehhez private változót elérnem a tesztből? Annak semmi köze a branch coverage-hez (ha erre akarsz kilyukadni).
Nyilván ahhoz, hogy letesztelj valamit, ismerned kell az elvárt funkcionalitást. De senki nem ezt vonta kétségbe, hanem azt, hogy ehhez belső változókat kell elérni. Amikor manuálisan tesztelsz egy rendszert, akkor sem debuggerrel nézed, hogy mik a különböző változók értékei. Az eredményre vagy kíváncsi, amit a végén kiköp pl egy clickre.
Pusztán logikailag: nem fordulhat elő olyan eset, amiben a funkcionalitás, az eredmény minden esetben egy belső változótól függ, amelynek a tesztelése sokat segíthet a hibafelderítésben?
A debugolást, meg a tesztelést ne mossuk össze. Akkor se, ha tesztekkel lehet jól debugolni. Arról beszéltünk, hogy jó-e az ha tesztek belső változón függnek. Nem arról, hogy lehet-e indokolt belső változót elérni.
De, de miért kéne ehhez private változót elérnem a tesztből? Annak semmi köze a branch coverage-hez (ha erre akarsz kilyukadni).
Arra akarok kilyukadni, hogy a tesztjeid írásakor az implementáció ismeretére támaszkodsz, mert a tesztjeid lényege, hogy megerősítsd magad abban a hitedben, hogy amit leírtál, az úgy működik, ahogy gondolod (ezért fogsz néhány tudatosan kiválasztott paraméterkombinációt kipróbálni, amivel minden vezérlési utat bejársz), nem pedig az, hogy a specifikáció ismeretében validáld az implementációt (ebben az esetben minden paraméterkombinációt ki kellene próbálj).
Ha ebben megállapodtunk, akkor innentől hibás érv a privát változók vizsgálata ellen, hogy az implementációs részlet, mert az optimalizálás is az, és egy refaktorálás esetén ugyanúgy kell mindkét esetben a kód után igazítani a tesztet (csak míg ha felszámolsz egy változót, akkor el fog törni a teszt, addig ha mondjuk nagyobb tartományra kezdesz cache-elni, a tesztjeid szép csendben nem fogják lefedni azt az ágat).
Annyit kell tudnod a belso implementaciorol hogy azok a reszek amik kulso eroforrasokhoz nyulnak pl adatbazis, halozat milyen az interfeszuk, hogyan tudod oket mockolni.
Tobbi esetben szerintem nem kell tudnod belso mukodesrol.
Attól függ, hogy az éles kódomban akarom-e cserélni. Ha nem, akkor csak a tesztelhetőség kedvéért nem fogom kiemelni.
Ez a baj ezzel a megközelítésével a unit tesztelésnek. Gondolj bele, mi is történik itt: csak azért, hogy elmondhassam, hogy én nem foglalkozom az implementációval – mert akkor a refaktoráláskor követnem kell a tesztjeimmel – az implementáció egy részét a kiemeléssel a specifikáció részévé teszem – és innentől egy refaktoráláskor még több munkám lesz a tesztek hozzáigazításával. Nyerni nem nyertem semmit, viszont ennyivel is komplexebbé tettem az interfészem.
Véleményem szerint a tesztelésnek, hibakeresésnek nem volna szabad befolyással lennie az architektúrára. Azt nem mondom, hogy az elérhető eszközök ezt minden esetben lehetővé teszik ma, de a mostani megközelítés mellett nincs is különösebb nyomás az ilyen irányú innováción.
Tegyük fel, hogy használok egy akármilyen keretrendszert, amiben csinálok egy akármilyen egyedi dolgot (model, controller, action akármi). Csakhogy az akármilyen keretrendszer használ egy tonna private/protected változót, amihez nem ad gettet/setter funkciókat (amiket ugye lehetne mockolni) csak szimplán írja/olvassa azt a bizonyos `$this->_screwPsr2` tulajdonságot, amit sok esetben nem közvetlenül te szabályzol, hanem configok, initek, preDispatchek, helperek hadán keresztülverekedve a rendszer egy teljesen másik részén valahol egy olyan környezeti változó által lett befolyásolva, ami CLI-ben nem létezik, vagy más az értéke.
Én elég gyakran belefutok ilyenbe. Nem én döntöm el, milyen keretrendszert használunk, így az a lehetőség, hogymást használok kilőve. Sőt, jelenleg egy ismert keretrendszerre épülő licenszelt e-commerce szörnyetegbe kell új dolgokat fejleszteni. Vagyis se a keretrendszert, se a szörnyeteget nem módosíthatjuk, csak a saját kiterjesztéseinket babrálhatjuk.
Vagyis én a munkám során kétlehetőség közül választhatok:
1. szétbarmolom a keretrendszert és a szörnyeteget mindenféle öröklésekkel és kiterjesztésekkel, bevezetve egy sor fölösleges getter/setter funkciót (magyarán elérhetővé téve a rejtett tulajdonságokat), hogy egyszerű legyen tesztet írni.
2. a fenti módszerrel simán felülvágom azt a nyamvadt változót, hogy a funkcióm tesztelésére tudjak fókuszálni anélkül, hogy a komplett rendszert be kellene izzítani hozzá.
Bár szinte bizonyos, hogy most sokan nyomtak egy facepalmot, és elkönyveltek Zs-kategóriás web-kontárnak, de én akkor is a 2. megoldást választom.
Miért hagynám itt?? Jó a hely, jó a munka, jók a kollégák, jó a fizu is. Nincs semmi bajom a hellyel vagy a munkával. Az hogy a RocketInternet által promótált kóddal kell dolgozni az egy dolog. Ez van. Még mindig jobb, mintha Drupal lenne, hahaha :D
De ha ezt csak azért mondtad, mert esetleg szerinted csak az a jó munkahely, ahol a fejlesztés a legüberkúlabb trendekhez igazodik, hogy habosra verhesse a brét, hogy milyen istenkirályos megmondóemberes piacvezetős... És emiatt nem nyúl a privát dolgokhoz, mert hogy azt nem szabad? Az ilyen hozzáállás annyira piti már...
Itt errefelé ez a rákot se érdekli. Az ilyesmi nem mércéje a minőségnek. Ha jó, hasznos és működik, akkor nem vetjük el azért, mert valami divatos hiszti miatt boszorkányságnak lett kikiáltva.
És nekem személyszerint nagyon tetszik a fenti megoldás, itt elfogadják az ilyet, nem démonizálnak bele nem létező problémákat.
Bocsánat, hogy félreérthetően fogalmaztam (megint).
Nem minden feltétlenül rossz, ami szörnyeteg. Szörnyeteg, mert néhol túlbonyolított azért, hogy általánosan megfeleljen a legtöbb e-commerce követelménynek. Sok esetben nekünk nem kell belőle minden, nem a mi cégünkre lett kihegyezve. Szörnyeteg, mert PHP 5.1-re íródott, így akadnak néha javítani való dolgok. Szörnyeteg, mert sok helyen nincs dokumentáció. Szörnyeteg, mert csúnyán bele kell mock-olni a unit tesztek során. De ettől még tökéletesen jó arra a célra, amire a cégünk használja.
Olyan, mint egy 1971 Dodge Charger. Nem új, nem kicsi, nem optimalizált, de ha fel kell tépni az aszfaltot, arra tökéletesen alkalmas :D
És örülök, hogy nem a trendiség hajt, ezért is indult a mondat feltételes móddal :P
Nekem azért a fenti beszélgetés alapján úgy tűnik, hogy márpedig vannak itt le nem tisztázott alapelvek, és egy készen kapott elmélet áll szemben a valódi gyakorlattal. Persze lehet, hogy én látom rosszul.
Deeee..
Normál esetben nem
Ott sem szabadna elerni
Ezt sokan mondják, miközben
A teszttel nem a belso
Ha nagyon kellene valami privatot tesztelni, ott lehet egy masik osztaly stb bujik meg es jobb kiemelni es kulon tesztelni.
Ezt sokat hallani. Ehhez
Ha valóban csak a felületet tesztelnéd, akkor a függvényed teljes értelmezési tartományát bejárnád, az összes paramétered összes kombinációját végigpróbálva. Gyanítom, hogy te sem így csinálod.
akit eddig láttam az
A viccet félretéve azt tudod, hogy az adott implementáció milyen inputra milyen outputot kell adjon. Ehhez semmit nem kell tudni a belső működéséről. És butaság is a tesztet bármilyen belső működéshez, változóhoz stb kötni. Csak a refaktor költségét növelik, és ha a teszt nem tudja ezt nélkülözni, akkor az inkább valami tervezési hibára utal.
Én egyetértek vbencével és blacksonic-kal. Soha nem csináltam ilyet és nem is szeretnék.
Tehát hogyha például a
De, de miért kéne ehhez
Nyilván ahhoz, hogy letesztelj valamit, ismerned kell az elvárt funkcionalitást. De senki nem ezt vonta kétségbe, hanem azt, hogy ehhez belső változókat kell elérni. Amikor manuálisan tesztelsz egy rendszert, akkor sem debuggerrel nézed, hogy mik a különböző változók értékei. Az eredményre vagy kíváncsi, amit a végén kiköp pl egy clickre.
Pusztán logikailag
A debugolást, meg a
De, de miért kéne ehhez
Arra akarok kilyukadni, hogy a tesztjeid írásakor az implementáció ismeretére támaszkodsz, mert a tesztjeid lényege, hogy megerősítsd magad abban a hitedben, hogy amit leírtál, az úgy működik, ahogy gondolod (ezért fogsz néhány tudatosan kiválasztott paraméterkombinációt kipróbálni, amivel minden vezérlési utat bejársz), nem pedig az, hogy a specifikáció ismeretében validáld az implementációt (ebben az esetben minden paraméterkombinációt ki kellene próbálj).
Ha ebben megállapodtunk, akkor innentől hibás érv a privát változók vizsgálata ellen, hogy az implementációs részlet, mert az optimalizálás is az, és egy refaktorálás esetén ugyanúgy kell mindkét esetben a kód után igazítani a tesztet (csak míg ha felszámolsz egy változót, akkor el fog törni a teszt, addig ha mondjuk nagyobb tartományra kezdesz cache-elni, a tesztjeid szép csendben nem fogják lefedni azt az ágat).
Annyit kell tudnod a belso
Tobbi esetben szerintem nem kell tudnod belso mukodesrol.
function f(i) {
De ez tipikusan dependency
Attól függ, hogy az éles
Ez a baj ezzel a megközelítésével a unit tesztelésnek. Gondolj bele, mi is történik itt: csak azért, hogy elmondhassam, hogy én nem foglalkozom az implementációval – mert akkor a refaktoráláskor követnem kell a tesztjeimmel – az implementáció egy részét a kiemeléssel a specifikáció részévé teszem – és innentől egy refaktoráláskor még több munkám lesz a tesztek hozzáigazításával. Nyerni nem nyertem semmit, viszont ennyivel is komplexebbé tettem az interfészem.
Véleményem szerint a tesztelésnek, hibakeresésnek nem volna szabad befolyással lennie az architektúrára. Azt nem mondom, hogy az elérhető eszközök ezt minden esetben lehetővé teszik ma, de a mostani megközelítés mellett nincs is különösebb nyomás az ilyen irányú innováción.
Tegyük fel
Én elég gyakran belefutok ilyenbe. Nem én döntöm el, milyen keretrendszert használunk, így az a lehetőség, hogymást használok kilőve. Sőt, jelenleg egy ismert keretrendszerre épülő licenszelt e-commerce szörnyetegbe kell új dolgokat fejleszteni. Vagyis se a keretrendszert, se a szörnyeteget nem módosíthatjuk, csak a saját kiterjesztéseinket babrálhatjuk.
Vagyis én a munkám során kétlehetőség közül választhatok:
1. szétbarmolom a keretrendszert és a szörnyeteget mindenféle öröklésekkel és kiterjesztésekkel, bevezetve egy sor fölösleges getter/setter funkciót (magyarán elérhetővé téve a rejtett tulajdonságokat), hogy egyszerű legyen tesztet írni.
2. a fenti módszerrel simán felülvágom azt a nyamvadt változót, hogy a funkcióm tesztelésére tudjak fókuszálni anélkül, hogy a komplett rendszert be kellene izzítani hozzá.
Bár szinte bizonyos, hogy most sokan nyomtak egy facepalmot, és elkönyveltek Zs-kategóriás web-kontárnak, de én akkor is a 2. megoldást választom.
Miért nem hagyod ott a céget?
Dehogy hagyom itt
De ha ezt csak azért mondtad, mert esetleg szerinted csak az a jó munkahely, ahol a fejlesztés a legüberkúlabb trendekhez igazodik, hogy habosra verhesse a brét, hogy milyen istenkirályos megmondóemberes piacvezetős... És emiatt nem nyúl a privát dolgokhoz, mert hogy azt nem szabad? Az ilyen hozzáállás annyira piti már...
Itt errefelé ez a rákot se érdekli. Az ilyesmi nem mércéje a minőségnek. Ha jó, hasznos és működik, akkor nem vetjük el azért, mert valami divatos hiszti miatt boszorkányságnak lett kikiáltva.
És nekem személyszerint nagyon tetszik a fenti megoldás, itt elfogadják az ilyet, nem démonizálnak bele nem létező problémákat.
Te fogalmaztál így:jelenleg
Nem probléma
Nem minden feltétlenül rossz, ami szörnyeteg. Szörnyeteg, mert néhol túlbonyolított azért, hogy általánosan megfeleljen a legtöbb e-commerce követelménynek. Sok esetben nekünk nem kell belőle minden, nem a mi cégünkre lett kihegyezve. Szörnyeteg, mert PHP 5.1-re íródott, így akadnak néha javítani való dolgok. Szörnyeteg, mert sok helyen nincs dokumentáció. Szörnyeteg, mert csúnyán bele kell mock-olni a unit tesztek során. De ettől még tökéletesen jó arra a célra, amire a cégünk használja.
Olyan, mint egy 1971 Dodge Charger. Nem új, nem kicsi, nem optimalizált, de ha fel kell tépni az aszfaltot, arra tökéletesen alkalmas :D
És örülök, hogy nem a trendiség hajt, ezért is indult a mondat feltételes móddal :P
Azért az elhangzott érvelések
Nekem azért a fenti
Már sok ilyen vitát láttam,
Mindkét oldalnak vannak jó