C++ och dess framtid att programmera minnessäkert - Hur går utvecklingen?

Permalänk
Medlem
Skrivet av Dimman:

Jag tror vi behöver vända på steken här; hur gör du för att verifiera att olika scenarion fungerar med dina lösningar?

Om du ger en bra förklaring hur du kan testa den här koden utan att behöva skriva testkod i två veckor så skall jag berätta

#20955298

enhetstester har troligen blivit poppis för det är lätt att förstå för chefer som inte kan programmera

använder tester men inte för att testa kod, de är bra för annat. exempelvis att låsa kod

Permalänk
Medlem
Skrivet av Dimman:

Jag tror vi behöver vända på steken här; hur gör du för att verifiera att olika scenarion fungerar med dina lösningar?

Vi har ställt den frågan och då gick dialogen ungefär så här:
- klk testar genom asserts -> lång diskussion om asserts.
- någon frågade om unit testning -> klk redogör en hel lista med missförstånd om unit testning.
- klk kör HN istället för testning -> lång diskussion om HN och varför HN inte ersätter testning.
- klk slänger ur sig att han återanvänder kod och kör applikationen istället för testning.
- någon frågade om vad klk menar med återanvändbar kod -> klk svara överlagring och lång diskussion om överlagring och klk svara tänk på en telefonbok istället för att svar "ja, det är function overloading jag syftar på".

@klk kör HN, asserts, återanvändbarkod ihop med att testköra det på sin dator, sedan sätter han sin stämpel på det och säger "trust me, bro".

Han har nämn regressionstestning men aldrig redogjort för hur han implementerar eller när han kör sina regressionstester.

Kort och gått så går @klk i cirklar och trollar...

Permalänk
Medlem
Skrivet av orp:

Vi har ställt den frågan och då gick dialogen ungefär så här:
- klk testar genom asserts -> lång diskussion om asserts.
- någon frågade om unit testning -> klk redogör en hel lista med missförstånd om unit testning.
- klk kör HN istället för testning -> lång diskussion om HN och varför HN inte ersätter testning.
- klk slänger ur sig att han återanvänder kod och kör applikationen istället för testning.
- någon frågade om vad klk menar med återanvändbar kod -> klk svara överlagring och lång diskussion om överlagring och klk svara tänk på en telefonbok istället för att svar "ja, det är function overloading jag syftar på".

@klk kör HN, asserts, återanvändbarkod ihop med att testköra det på sin dator, sedan sätter han sin stämpel på det och säger "trust me, bro".

Han har nämn regressionstestning men aldrig redogjort för hur han implementerar eller när han kör sina regressionstester.

Kort och gått så går @klk i cirklar och trollar...

tack för hjälpen

Permalänk
Medlem
Skrivet av klk:

Om du ger en bra förklaring hur du kan testa den här koden utan att behöva skriva testkod i två veckor så skall jag berätta

#20955298
...

Du beskriver att metoden gör följande:

* This method processes a list of regex patterns and applies them to the files stored in the cache. * It generates a list of lines in each file where the patterns are found and stores the results * in the "file-linelist" cache table.

Det låter väl som ett utmärkt tillfälle att plocka fram ett blandat set av input-data tillsammans med förväntad output-data, och sedan köra din metod på alltihop. Diffa output med expected output. Släng in några scenarior där input-data är felformaterad, eller annat som är fel och kolla så att din metod hanterar det som förväntat? Om du inte 100% happy-hackar så testar du ju precis på detta sättet manuellt redan.

Skrivet av klk:

...
enhetstester har troligen blivit poppis för det är lätt att förstå för chefer som inte kan programmera

använder tester men inte för att testa kod, de är bra för annat. exempelvis att låsa kod

Så du använder tester men inte för att testa kod, men för att låsa kod; den där får du nog utveckla för det makes no sense.

Skrivet av klk:

tack för hjälpen

Om du instämmer i beskrivningen av situationen som @orp la fram så finns det nog inte mycket mer att diskutera, i något ämne

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem
Skrivet av Dimman:

Du beskriver att metoden gör följande:

* This method processes a list of regex patterns and applies them to the files stored in the cache. * It generates a list of lines in each file where the patterns are found and stores the results * in the "file-linelist" cache table.

Det låter väl som ett utmärkt tillfälle att plocka fram ett blandat set av input-data tillsammans med förväntad output-data, och sedan köra din metod på alltihop. Diffa output med expected output. Släng in några scenarior där input-data är felformaterad, eller annat som är fel och kolla så att din metod hanterar det som förväntat? Om du inte 100% happy-hackar så testar du ju precis på detta sättet manuellt redan.

Om jag skall skriva test för det så är jag uppe i två veckor eller i alla fall väldigt mycket extra tid, metoden tog en kväll och skriva och testa i debug. Föredrar att bli klar någon gång

Min teknik för att testa domänkod är vanligen att skripta upp applikationen, kan lägga in LUA kod men i aktuell kod jag visade har jag funderingar på att använda python, mest för att lära och testa nu när python har möjlighet att köra utan GIL'en.

Skripta applikationen gör det enklare att skriva test, kan till och med vara helt andra eller om man vill introducera nya utvecklare i något så kan sådant passa bra.

Skrivet av Dimman:

Så du använder tester men inte för att testa kod, men för att låsa kod; den där får du nog utveckla för det makes no sense.

För med enhetstest skapar du teknisk skuld och coupling, det låser kod.

Permalänk
Medlem
Skrivet av klk:

Om jag skall skriva test för det så är jag uppe i två veckar eller i alla fall väldigt mycket extra tid, metoden tog en kväll och skriva och testa i debug. Föredrar att bli klar någon gång

Min teknik för att testa domänkod är vanligen att skripta upp applikationen, kan lägga in LUA kod men i aktuell kod jag visade har jag funderingar på att använda python, mest för att lära och testa nu när python har möjlighet att köra utan GIL'en.

Skripta applikationen gör det enklare att skriva test, kan till och med vara helt andra eller om man vill introducera nya utvecklare i något så kan sådant passa bra.

För med enhetstest skapar du teknisk skuld och coupling, det låser kod.

Jag vet inte varför du maniskt fastnat vid unit-testning och att allt skulle handla om det, men jag har förstått att du alltså testar lite manuellt när du skriver koden och sen är det färdigt där. Det funkar för dig, du är nöjd och du tycker alla borde jobba på det viset. Du anser att allt annat är slöseri med tid. Alla som tänker annorlunda är inte på samma intellektuella nivå som dig och besitter inte din kunskap; man har helt enkelt inte förstått saker på den nivån du förstår. Är det en ungefärligt korrekt sammanfattning?

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem
Skrivet av Dimman:

Jag vet inte varför du maniskt fastnat vid unit-testning och att allt skulle handla om det, men jag har förstått att du alltså testar lite manuellt när du skriver koden och sen är det färdigt där. Det funkar för dig, du är nöjd och du tycker alla borde jobba på det viset. Du anser att allt annat är slöseri med tid. Alla som tänker annorlunda är inte på samma intellektuella nivå som dig och besitter inte din kunskap; man har helt enkelt inte förstått saker på den nivån du förstår. Är det en ungefärligt korrekt sammanfattning?

Nej, och enhetstestning använder jag inte för att det är för dåligt. Det existerar inte utvecklare som kan skriva test så att koden är säker och priset för enhetstester är för högt, på tok för högt.

Enhetstester är alltså en dålig metod, spelar ingen roll vad du säger (eller någon annan). Skulle man anse det vara en bra metod beror det oftast på att man inte vet något annat.
Enhetstester är bra för annat men alltså inte för att testa koden.

Beskrev precis en annan metod (skripta) för givetvis testar jag koden.

Permalänk
Medlem
Skrivet av klk:

Om jag skall skriva test för det så är jag uppe i två veckor eller i alla fall väldigt mycket extra tid, metoden tog en kväll och skriva och testa i debug.

Då är du riktigt kass på att koda om det skulle ta 2 veckor. Det är som att säga "det kommer ta mig 2 veckor att skriva en funktion".

Skrivet av klk:

Nej, och enhetstestning använder jag inte för att det är för dåligt.

Låter som att du är för dålig

Skrivet av klk:

Det existerar inte utvecklare som kan skriva test så att koden är säker ...

Det finns. Du fattar verkligen inte att allt >0% är någon form av vinst. Som @Dimman var inne på, kör du bil utan bälte också?
Har du vaccinerat dig själv eller din son?
Tillagar du kyckling?
Har du försäkrat din bostad?

Skrivet av klk:

... och priset för enhetstester är för högt, på tok för högt.

Du sa precis att det skulle ta dig 2 veckor att skriva test för ditt kodexempel. Om man jobbar på ett riktigt företag så är det inte många fel hos kunden innan man har orsakat skador till ett högre värde. Om man jobbar på ett startup så kanske kunden har överseende med bristande kvalitet

Permalänk
Datavetare
Skrivet av klk:

Tror du att test plockar 100% av alla möjliga fel?

Det är fullt möjligt att skriva test som plockar 100 % av fallen. En hel klass av sådana är alla tester som verifiera alla tänkbara permutationer av funktioner där funktionerna saknar sidoeffekter.

I praktiken är de mer spännande funktionerna inte realistiskt testbara på den nivån. Vissa fuzzers kan dock analysera traces genom koden och lura ut vilka inputs som kommer leda till att man växlar mellan true-branch och false-branch i en funktion. Det kan då ge en uppsättning inputs som ger full eller i alla fall väldigt hög BC/DC (branch coverage / decision coverage).

Att göra sådant "för hand" kommer rätt snabbt bli så komplicerat att det tar till Ragnarök.

Skrivet av klk:

Har diskuterat test tidigare i tråden och kanske låter bli och repetera. Tipsar istället om den här videon https://www.youtube.com/watch?v=wo84LFzx5nI
Och att du läser om det Casey kallar för "discriminated unions" eller "Tagged unions".

Om du nu älskar unioner/variants så mycket, är verkligen C++ (ett rätt starkt typat och statiskt typat språk) rätt val?
Den säkerhet man får med "tagged unions" ger ju noll om man istället skriver sin kod så man redan har rätt statisk typ vid kompilering. Det går inte alltid, men i domäner jag jobbat med har det ändå varit normalfallet att man kan välja en statisk typ som är högst lämplig för uppgiften.

En statiskt typ lär vara minst lika snabb, även om det absolut går att göra "tagged unions" väldigt snabba.

Skrivet av klk:

För med enhetstest skapar du teknisk skuld och coupling, det låser kod.

Tar ett konkret fall som jag jobbat med idag.

Hade något som redan fungerade och där det fanns ett gäng tester. Koden "fungerade" men hade en del brister. Externa APIet (som inte är kundexternt på något sätt) var i stort sätt ok, men kunde göras lite bättre.

Totalt sett var det rätt stora interna förändringar, av de tester som fanns behövde en par stycken småjusteringar p.g.a. förändring av API.

Stora fördelen med unit-tester: efter detta gick alla tester åter igenom.

Hur skulle man få motsvarande kvitto på att nya koden inte hade sönder fall som tidigare fungerade utan testerna?

Går väl att köra manuellt, men givet vad som testades här skulle en manuell körning av allt vara något som tar en mänsklig testare dagar att genomföra (unit-testerna testar samma sak head-less med simulerad wall-clock time så man kan köra så fort CPUn orkar med)?

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer