Det här är troligt inte den första handledningen om testning som du någonsin har sett. Men kanske har du haft tvivel om att testa, och tog aldrig tid att läsa dem. Det kan trots allt tyckas som extra arbete utan anledning.
Denna handledning avser att ändra dina åsikter. Vi ska börja i början: Vad är testning och varför ska du göra det? Då ska vi prata kort om att skriva testbar kod, innan du vet, gör några test! Låt oss ta itu med det!
Helt enkelt, testning är tanken på att ha en uppsättning krav som en viss kod måste passera för att vara robust nog för att kunna användas i den verkliga världen. Ofta skriver vi lite JavaScript och öppnar det i webbläsaren och klickar lite om att allt fungerar som vi skulle förvänta oss. Även om det ibland är nödvändigt, det är inte typen av testning vi pratar om här. Faktum är att jag hoppas att denna handledning kommer att övertyga dig om att snabb och smutsig självprovning borde komplettera ett mer styvt provningsförfarande: självtestning är bra, men en grundlig lista över krav är avgörande.
Som du kan gissa är problemet med uppdatering och klickning av JavaScript-testning dubbelt:
Genom att skriva tester som kontrollerar allt vad din kod ska göra kan du verifiera att din kod är i bästa form innan du använder den på en webbplats. När det är dags att någonting faktiskt körs i en webbläsare finns det förmodligen flera felpunkter. Skrivprov gör att du kan fokusera på varje testbar del individuellt; om varje bit gör sitt jobb rätt ska sakerna fungera tillsammans utan problem (testa enskilda delar som detta kallas enhetstestning).
Om du är en programmeringspolyglot) har du kanske gjort test på andra språk. Men jag har hittat test i JavaScript ett annat djur att döda. När allt kommer omkring bygger du inte för många användargränssnitt i, säger PHP eller Ruby. Ofta gör vi DOM-arbete i JavaScript, och hur exakt testar du det?
Jo, DOM-arbetet är inte det du vill skriva tester för; det är logiken. Självklart, då är nyckeln här att skilja din logik och din UI-kod. Detta är inte alltid lätt; Jag har skrivit min rättvisa del av jQuery-powered gränssnitt, och det kan bli ganska rörigt ganska snabbt. Det gör inte bara det svårt att testa, men sammanflätad logik och användarkoderkod kan också vara svåra att modifiera när det önskade beteendet ändras. Jag har funnit att använda metoder som mallar (även mallar) och pub / sub (även pub / sub) gör skrivning bättre, mer testbar kod lättare.
En sak innan vi börjar kodning: hur skriver vi våra test? Det finns många testbibliotek som du kan använda (och många bra handledning för att lära dig att använda dem, se länkarna som slutet). Vi ska dock bygga ett litet testbibliotek från början. Det kommer inte vara så fint som vissa bibliotek, men du får se exakt vad som händer.
Med det här i åtanke, låt oss komma igång!
Vi ska bygga ett mikrofotogalleri: en enkel lista med miniatyrer, med en bild som visar full storlek ovanför dem. Men först, låt oss bygga ut testfunktionen.
När du lär dig mer om att testa och testa bibliotek, hittar du många testmetoder för att testa alla typer av specifikationer. Det kan emellertid alla kokas ner om två saker är lika eller inte: till exempel,
Så här är vår metod att testa för jämlikhet:
var TEST = areEqual: funktion (a, b, msg) var result = (a === b); console.log ((resultat? "PASS:": "FAIL:") + msg); returresultat; ;
Det är ganska enkelt: metoden tar tre parametrar. De två första jämförs, och om de är lika passerar testen. Den tredje parametern är ett meddelande som beskriver testet. I det här enkla testbiblioteket lägger vi bara ut våra tester på konsolen, men du kan skapa HTML-utdata med lämplig CSS-styling om du vill.
Här är areNotEqual
metod (inom samma TESTA
objekt):
areNotEqual: funktion (a, b, msg) var result = (a! == b); console.log ((resultat? "PASS:": "FAIL:") + msg); returresultat;
Du kommer att märka de två sista raderna av är jämlika
och areNotEqual
det samma. Så vi kan dra ut dem så här:
var TEST = areEqual: funktion (a, b, msg) returnera this.output (a === b, msg), areNotEqual: funktion (a, b, msg) returnera this._output (a! == b, msg); , _output: funktion (resultat, msg) konsol [resultat? "logg": "varna"] ((resultat? "PASS:": "FEL:") + msg); returresultat; ;
Bra! Snygg sak här är att vi kan lägga till andra "socker" metoder med de metoder vi redan har skrivit:
TEST.isTypeOf = funktion (obj, typ, msg) returnera this.areEqual (typof obj, typ, msg); ; TEST.isAnInstanceOf = funktion (obj, typ, msg) returnera this._output (obj instanceof type, msg); TEST.isGreaterThan = funktion (val, min, msg) returnera this.output (val> min, msg);
Du kan själv experimentera med det här; efter att ha gått igenom den här handledningen har du en bra bild av hur du använder den.
Så, låt oss skapa ett superklart fotogalleri med vår mini TESTA
ram för att skapa några test. Jag kommer att nämna här att medan testdriven utveckling är en bra övning, kommer vi inte att använda den i den här handledningen, främst eftersom det inte är något du kan lära dig i en enda handledning. det krävs mycket träning för att verkligen grok. När du börjar är det lättare att skriva lite kod och sedan testa den.
Så, låt oss börja. Självklart behöver vi lite HTML för vårt galleri. Vi kommer att behålla det här ganska grundläggande:
Testa i JavaScript
Det finns två viktiga saker att märka här: Först har vi en Det innehåller den mycket enkla markeringen för vårt bildgalleri. Nej, det är nog inte mycket robust, men det ger oss något att arbeta med. Lägg märke till att vi hakar upp tre
>