Testarea RSPE pentru începători, Partea 1

Ești nou la Rails? Nou pentru codificare? Curios despre RSpec și cum puteți începe testarea? În caz afirmativ, acest articol ar trebui să fie un bun punct de pornire pentru ca dvs. să ajungeți în dezvoltarea bazată pe teste. Acesta vă va explica de ce și cum, și vă va oferi un kit de supraviețuire pentru a merge la primul dvs. sondaj de testare.

Subiecte

  • Care-i rostul?
  • RSpec?
  • Noțiuni de bază
  • Exerciții de testare
  • Sintaxă de bază
  • Patru faze de teste
  • Lucru greu despre testare

Care-i rostul?

Pentru ce este RSpec bun pentru? RSpec este foarte util la nivel de test de unitate, testarea detaliilor mai fine și logica de afaceri a aplicației. Aceasta înseamnă testarea internelor, cum ar fi modelele și controlorii aplicației dvs. Testele care acoperă vizionările dvs. sau testele caracteristice care simulează fluxuri mai complete de utilizatori, cum ar fi achiziționarea unui element, nu vor fi focalizarea pentru care este creat RSpec. RSPE nu utilizează un driver web - cum face Capybara - care simulează interacțiunile unui utilizator cu un site real sau o reprezentare a acestuia.

Dezvoltarea bazată pe dezvoltare (TDD), care este punctul? Ei bine, nu este atât de ușor să răspund fără să vă dați niște clișeuri. Sper că acest lucru nu pare a fi evaziv. Aș putea oferi un răspuns rapid, dar vreau să evit să te trimit acasă după o gustare mică. Rezultatul acestei mici serii despre RSpec și testarea nu ar trebui să vă ofere doar toate informațiile necesare pentru a răspunde la această întrebare, ci și pentru a vă oferi mijloacele și înțelegerea pentru a începe testarea, simțindu-vă un pic de încredere deja în ceea ce privește testarea.

Începătorii par să aibă un timp mai dificil de a intra în RSpec și fluxul de lucru TDD decât să înceapă să devină periculoși cu Ruby sau Rails. De ce este asta? Nu pot decât să ghicesc în acest moment, dar, pe de o parte, literatura pare să se concentreze mai mult pe oameni care au deja anumite abilități de programare sub centură, iar pe de altă parte, învățarea tuturor lucrurilor implicate pentru a avea o înțelegere clară este un pic cam descurajator. Curba de învățare poate fi destul de abruptă, presupun. Pentru testarea eficienta, sunt implicate multe parti mobile. Este o mulțime de întrebare pentru începătorii care tocmai au început să înțeleagă un cadru ca Rails să privească procesul de construire a unei aplicații din perspectiva opusă și să învețe un API complet nou pentru a scrie codul pentru codul dvs..

M-am gândit cum să abordăm această "dilemă" pentru următoarea generație de coderi care caută doar o pornire mai ușoară în acest lucru. Cu asta am venit. Voi rupe sintaxa cea mai esențială pentru tine, fără a-mi lua mai mult decât cunoștințele de bază despre Ruby și puțină Rails. În loc să acoperiți fiecare unghi posibil și să vă confundați cu moartea, vom trece peste setul dvs. de bază de supraviețuire și vom încerca să picteze imaginea mai mare. Vom discuta "Cum?" Mai degrabă în mod serios, pentru a nu pierde noi coderi de-a lungul drumului. A doua parte a ecuației va explica "De ce?" 

Dacă am noroc, veți părăsi o bază bună pentru cărți mai avansate, în timp ce vă simțiți încrezători în imaginea de ansamblu. Ok, hai să mergem pe jos! 

Beneficiile și astfel

Să revenim la scopul testării. Testarea este utilă pentru scrierea de aplicații de calitate mai bună? Ei bine, acest lucru poate fi dezbătut hotărât, dar, în momentul de față, aș răspunde la această întrebare cu un "da" în tabăra de la Hipster TDD, cred. Să vedem de ce testele oferă aplicațiilor dvs. câteva beneficii greu de ignorat:

Ei verifică dacă lucrarea ta funcționează conform destinației. Validarea constantă a faptului că scrieți un cod care funcționează este esențial pentru sănătatea aplicației dvs. și a sănătății echipei.

Ele testează lucruri pe care nu le dorești să le testezi manual, controale plictisitoare pe care ai putea să le faci manual - mai ales când trebuie să verifici asta tot timpul. Vreți să fiți la fel de siguri că noua dvs. funcție sau noua dvs. clasă sau orice altceva nu generează efecte secundare în zone complet aparent neprevăzute ale aplicației dvs. Automatizarea unui astfel de lucru nu numai că vă salvează tonă de timp, dar va face ca scenariile de testare să fie coerente și reproductibile. Acest lucru le face mult mai mult decât testele predispuse la erori de mână.

Vrem să ne asigurăm că aplicația se comportă într-un anumit mod, într-un mod așteptat. Testele vă pot asigura într-o măsură destul de mare că modul în care utilizatorii interacționează cu aplicația dvs. funcționează și evitați scenariile de eroare pe care ați putut să le previzionați. Testele verifică dacă aplicația dvs. funcționează așa cum ați proiectat-o ​​și că aceasta continuă să funcționeze după introducerea modificărilor. Acest lucru este deosebit de important atunci când suita dvs. de testare vă informează despre scenariile care nu reușesc să vină cu privire la implementările aplicației dvs., care ar putea fi vechi și, prin urmare, nu se află exact în spatele creierului dvs. și nu au fost luate în considerare în timp ce ați introdus unele funcționalități noi. Pe scurt, ajută la menținerea aplicației dvs. sănătoasă și evită introducerea de tone de bug-uri.

Testele de automatizare te fac să testezi mai frecvent. Imaginați-vă dacă trebuie să testați ceva pentru a 40-a oară pentru un motiv oarecare. Dacă este doar puțin consumatoare de timp, cât de ușor va fi să vă plictisiți și să omiteți complet procesul? Aceste fel de lucruri sunt primul pas pe o pantă alunecoasă în care puteți să vă sărutați un procent decent de acoperire de cod la revedere.

Testele funcționează ca documentație. Nu-i asa? Specificațiile pe care le scrieți dau celorlalți oameni în echipele dvs. un punct de intrare rapid pentru a afla o nouă bază de cod și pentru a înțelege ce ar trebui să facă. Scrierea codului în RSpec, de exemplu, este foarte expresivă și formează blocuri de cod extrem de ușor de citit, care spun o poveste dacă este făcută corect. Deoarece poate fi scris foarte descriptiv în timp ce este un limbaj specific domeniului (DSL) foarte concis, RSpec lovește două păsări cu o singură piatră: nu este verbose în API și vă oferă toate mijloacele necesare pentru a scrie scenarii de testare extrem de ușor de înțeles. Asta mi-a plăcut mereu și de ce nu m-am apucat niciodată cu Cucumber, care rezolvă aceeași problemă într-un mod prea prietenos cu clienții, cred că.

Ele pot reduce la minimum cantitatea de cod pe care o scrieți. În loc să vă împovărați ca un nebun, încercând lucruri mai freestyle, practica testării codului vă permite să scrieți doar codul necesar pentru a trece testele. Nu există cod excedentar. Un lucru pe care îl veți auzi adesea în cariera viitoare este că cel mai bun cod este codul pe care nu trebuie să-l scrieți sau ceva. De ce? Ei bine, de cele mai multe ori, soluțiile mai elegante implică cantități mai mici de cod și, de asemenea, codul pe care nu-l scrieți - ceea ce ar putea fi inutil - nu va provoca bug-uri viitoare și nu trebuie să fie întreținut. Deci, scriind mai întâi testele, înainte de a scrie implementarea, vă oferă o atenție deosebită asupra problemei pe care trebuie să o rezolvați în continuare. Scriind doar codul care este necesar, și nu în mod accidental mai mult, este poate un efect secundar subevaluat pe care TDD vă poate oferi. 

Ele au un efect pozitiv asupra designului. Pentru mine, înțelegerea acestei părți a pornit un bec și mi-a făcut să apreciez cu adevărat întregul lucru de testare. Când vă scrieți implementările în jurul scenariilor de testare foarte bine centrate, codul dvs. se va dovedi cel mai probabil mult mai compartmentat și modular. Din moment ce suntem cu toții prietenii lui DRY - "Nu vă repetați!" - și cât mai puține cuplări între componentele din aplicația dvs., este o disciplină simplă, dar eficientă pentru a realiza sisteme proiectate bine de la început. Acest aspect este cel mai important beneficiu, cred. Da, celelalte sunt chiar minunate, dar când testele au ca rezultat și aplicații a căror calitate este mai bună datorită unui design rafinat, aș spune că Jackpot! 

Se reduce și la bani. Când aveți o aplicație stabilă ușor de întreținut și ușor de schimbat, veți economisi destul bani pe termen lung. Complexitatea inutilă poate bântui proiectele cu ușurință, iar motivația nu va fi la un nivel maxim atunci când echipa dvs. trebuie să lupte cu codul dvs., deoarece este fragilă și prost concepută. Designul bun al aplicațiilor poate să vă sprijine în mod absolut obiectivele de afaceri - și viceversa. Vreți să introduceți câteva noi caracteristici care sunt esențiale pentru afacerea dvs., dar vă luptați constant arhitectura pentru că a fost construită pe nisip? Bineînțeles că nu, și am văzut cu toții o mulțime de exemple de afaceri care au dispărut repede pentru acest motiv exact. Obiceiurile bune de testare pot fi o linie eficientă de apărare pentru astfel de situații. 

Un alt obiectiv important este în ceea ce privește calitatea codului însuși. Software-ul pe care îl scrieți ar trebui să fie ușor de înțeles pentru alți dezvoltatori - cât mai mult posibil, cel puțin. Testele dvs. pot ajuta într-adevăr să transmită funcționalitatea și intenția aplicației dvs. - și nu numai celorlalți membri ai unei echipe, ci și viitorului dvs. de sine. Dacă nu atingeți o anumită secțiune a codului dvs. pentru o perioadă lungă de timp, acesta va fi cu adevărat la îndemână pentru a vă reîmprospăta memoria cum și de ce ați scris o bucată de software cu documentația pe care un instrument cum ar fi RSpec le oferă și RSpec nu acest lucru foarte bine, în mod excepțional de fapt.

Deoarece codul dvs. se va schimba întotdeauna, refactorizarea codului dvs. va fi și ar trebui să fie întotdeauna o parte a dezvoltării software-ului. Și din moment ce schimbarea este atât de coaptă în acest proces, trebuie să vă asigurați că aceste schimbări nu generează efecte secundare neașteptate în locuri surprinzătoare. Suita de test vă oferă o plasă de securitate destul de strânsă, pentru a vă simți mai confortabilă și mai liberă să refaceți cu gusto. Acest aspect, alături de avantajele de design pe care le poate oferi TDD, este beneficiul meu preferat pe care îl poate oferi o suită de testare. Modificarea și extinderea codului dvs. este o componentă esențială a inovării pe produsul dvs. deja lansat, că aveți nevoie de un instrument care vă oferă cât mai multă libertate posibil cu acest proces. Nu sunt sigur dacă cei care critică scrierea unei suite de testare extinse sunt foarte preocupați de acest aspect.

Veți avea șanse bune să construiți mai repede lucruri noi în etapele ulterioare, deoarece feedback-ul de la suita de testare vă va oferi feedback despre eșecuri, bug-uri și limitări - mult mai repede decât un om poate testa, desigur. În plus, vă va oferi încrederea de a lucra cu o plasă de securitate care devine și mai valoroasă cu cât mai mult veți merge. 

În aplicațiile dvs., mai ales dacă au crescut semnificativ, doriți să aveți încredere în software-ul dvs. Acoperirea de cod 100% sună mult mai dulce când aveți un site care are câteva ani și a fost atins de sute de dezvoltatori. Fiind capabil să aveți încredere în noul cod pe care îl introduceți și construit pe deasupra este una dintre plăcerile dezvoltării software pe care banii nu o pot cumpăra mai târziu.

Noțiuni de bază

Terminal

șinele tale noi_app -T

-T vă permite să săriți unitatea de testare, cadrul de testare care vine împreună cu Rails.

Gemfile

grup: dezvoltare,: test to gem 'rspec-rails' end

Terminal

pachet

După aceea, trebuie să rulați un generator care vine cu RSpec:

Terminal

șinele generează rspec: install

producție

creați .rspec crea spec. crea spec. / spec_helper.rb crea spec / rails_helper.rb

Ceea ce face acest lucru este stabilirea structurii de bază pentru testele RSpec în cadrul Rails. Așa cum puteți vedea din ieșirea de mai sus, acest generator a inițializat a spec directorul cu câteva fișiere de care veți avea nevoie ulterior. .rspec fișierul este un fișier de configurare pe care nu trebuie să îl manipulăm pentru moment. Am vrut doar să vă informez ce aveți în fața dvs. Celelalte dosare sunt explicite, dar am vrut să menționez diferențele dintre ele.

  • spec_helper.rb este pentru specificații care nu depind de Rails.
  • rails_helper.rb, pe de altă parte, este pentru specificațiile care depind de ea.

Ceea ce nu este evident este faptul că unul dintre aceste fișiere trebuie să fie solicitat în partea de sus a fișierelor dvs. de spec (fișiere de testare) pentru a rula testele. Să aruncăm o privire rapidă! Când generați un model prin: 

Terminal

șinele generează numele modelului dummy_model: șir

producție

invoca active_record crea db / migrate / 20160521004127_create_dummy_models.rb crea aplicatii / dummy_model.rb invoke rspec creare spec / models / dummy_model_spec.rb

Nu numai că Rails va crea asociatul _spec.rb fișierele pentru dvs., specificațiile dvs. vor avea automat automat cereți "rails_helper" implicit în partea de sus a fișierelor dvs. de spec. Asta înseamnă că ești gata să pleci imediat. 

spec / modele / dummy_model_spec.rb

cereți "rails_helper" ... 

Deci, cu această configurație, puteți testa aplicația Rails, modelele dvs. de exemplu, iar RSpec nu se va confunda cu clasele de model folosite în Rails. Acest lucru este necesar pentru a cere ori de câte ori aveți nevoie de chestii ca ActiveRecord, ApplicationController si asa mai departe. Deci, acesta este scenariul dvs. normal și, prin urmare, ar trebui să fie prima dvs. alegere logică ca începător.

Necesită spec_helper.rb, pe de altă parte, va arunca o eroare dacă scrieți teste care includ logica de afaceri din aplicația Rails. În acest scenariu, RSpec nu știa despre ce vorbești atunci când vrei să testezi un model Rails, de exemplu. 

Atât de lungă poveste super scurtă, spec_helper nu încarcă Rails - asta e! Bineînțeles, puteți săniți cu configurații, dar nu vreau să vă preocupați acum. Să ne concentrăm asupra elementelor de bază, a testelor și a sintaxelor. Asta ar fi suficient pentru începători. Sa trecem peste!

Exerciții de testare

Sunteți pregătiți să efectuați testele. RSPE cere ca fișierele dvs. de testare să aibă un sufix specific _spec pentru a înțelege ce fișiere să fie difuzate. Dacă utilizați un generator, aceasta nu este o preocupare, dar dacă doriți să scrieți fișiere de testare pe cont propriu, acesta este modul în care trebuie să se încheie. Deci, va trebui să puneți un fișier cum ar fi your_first_test_spec.rb în tine spec director. 

Folosind generatorul pentru a crea un model fictiv deja furnizat cu noi spec / modele / dummy_model_spec.rb. Nu-i rău! Un lucru trebuie lăsat înainte ca testele să fie pregătite: 

Terminal

rake db: migrați rake db: test: pregătiți

Aceste comenzi rulează migrarea pentru modelul falsificat pe care l-am generat mai sus și am creat baza de date de testare și cu acel model. Acum conducem testul:

Terminal

greblă

greblă comanda va rula toate testele dvs., suita de testare completă. De obicei, ar trebui să utilizați această comandă când ați terminat unele caracteristici și doriți să exersați întreaga suită de testare.

producție

* În așteptare: (Failurile enumerate aici sunt așteptate și nu afectează starea suitei dvs.) 1) DummyModel adaugă câteva exemple pentru (sau șterge) / Users / vis_kid / projects / rspec-test-app / rspec-dummy / spec / models / dummy_model_spec .rb # Nu este încă implementat # ./spec/models/dummy_model_spec.rb:4 Terminat în 0.00083 secunde (fișierele au luat 1.94 secunde pentru încărcare) 1 exemplu, 0 eșecuri, 1 în așteptare

Felicitări! Tocmai ai fugit primul test RSpec. Nu atât de rău, nu-i așa? Bineînțeles, a fost un test fals pentru acum - cu codul de test fals generat de Rails. Versiunea mai concentrată a rularea testelor dvs. - de fapt, aveți mai multe opțiuni decât numai aceea - este de a rula un fișier individual, de exemplu. Asa:

Terminal

pachetul exec rspec spec / models / dummy_model_spec.rb

Acesta va rula doar un singur fișier de testare în loc de întreaga suită de testare. Cu aplicații mai mari, care depind de o cantitate mare de fișiere de testare, acest lucru va deveni un economizor de timp real. Dar în ceea ce privește economisirea timpului și specificitatea testului, aceasta este doar zgârierea suprafeței, pentru a fi sinceră. Cred ca vom acoperi mai multe despre cum sa rasim o perioada semnificativa de timp in timpul testelor in al treilea articol din aceasta serie. Să vedem cât de departe ajungem!

Cealaltă modalitate de a exersa întreaga suită de test este prin simpla alergare rspec-cu sau fără pachet exec, în funcție de configurația dvs..

Terminal

bundle exec rspec

Un lucru pe care ar trebui să-l menționez înainte de a merge mai departe, de asemenea, puteți rula doar un anumit subset de teste. Spuneți că doriți doar să executați toate testele pentru codul dvs. de model:

Terminal

bundle exec rspec spec / modele

Ușor ca asta!

Sintaxă de bază

Vă recomandăm să începem cu noțiunile de bază și să analizăm câteva opțiuni pe care RSpec le oferă în următoarele două articole. Să aruncăm o privire asupra structurii de bază a unui test și să ne aruncăm în ape mai avansate, atunci când l-am scos din cale.

  • descrie

Aceasta va fi pâinea și untul, deoarece vă organizează specificațiile. Puteți să vă referiți la șiruri sau clase:

Unele Spec

descrieți Utilizatorul finalizează descrierea "Unele șir" se termină

descrie secțiunile sunt elementele de bază pentru a vă organiza testele în grupuri logice și coerente de testat. Practic, un domeniu de aplicare pentru diferite părți ale aplicației pe care doriți să le testați.

Unele Spec

descrie Utilizatorul nu ... descrie sfârșitul Oaspeții fac ... sfârșit descrie Atacatorul nu ... sfârșit

Un sfat bun este să vă strângeți și mai mult domeniul de aplicare. Deoarece unele clase vor crește destul de semnificativ, nu este o idee bună să aveți toate metodele pe care doriți să le testați pentru o clasă într-o singură clasă descrie bloc. Puteți crea mai multe dintre aceste blocuri, desigur, și le puteți concentra în jurul metodelor instanței sau clasei. Pentru a vă îmbunătăți intenția, tot ce aveți nevoie este să furnizați numele clasei cu un șir suplimentar care face referire la metoda pe care doriți să o testați.

Unele Spec

descrie agentul, "#favorite_gadget" nu ... termină descrierea agentului, "#favorite_gun" nu ... descrie agentul final, ".gambler" nu ... sfârșitul

În acest fel veți obține cele mai bune din ambele lumi. Încapsulați testele aferente în grupurile lor reprezentative, păstrând în același timp lucrurile concentrate și la o dimensiune decentă. Pentru utilizatorii foarte noi pe terenul Ruby, ar trebui să menționez acest lucru # trimite doar o metodă instanță în timp ce punct . este rezervat pentru metodele de clasă. Deoarece sunt în interiorul șirurilor, nu au implicații tehnice aici, dar semnalează intenția dvs. altor dezvoltatori și viitorului vostru. Nu uitați virgula după numele clasei - nu va funcționa fără ea! Într-un minut, când ajungem aştepta, Vă voi arăta de ce această abordare este foarte convenabilă.

  • aceasta

În cadrul domeniului descrie grupuri, vom folosi un alt domeniu de aplicare aceasta blocuri. Acestea sunt făcute pentru exemplele actuale testate. Dacă doriți să testați metoda instanței #favorite_gadget pe Agent clasa, ar arata astfel:

Unele Spec

descrie agentul, '#favorite_gadget' face 'returnează un element, gadgetul preferat al agentului' nu ... sfârșitul final

Șirul pe care îl oferiți aceasta blocul funcționează ca documentație principală pentru testul dvs. În cadrul acestuia, specificați exact ce fel de comportament doriți sau așteptați de la metoda în cauză. Recomandarea mea nu este să mă duc peste bord și să fiu prea amănunțită despre asta, dar în același timp să nu fiu prea criptică și să confund pe alții cu descrieri prea inteligente. 

Gândiți-vă la ce poate și ar trebui să realizați cea mai mică și mai simplă implementare a acestei părți a puzzle-ului. Cu cât scrieți mai bine această parte, cu atât va fi mai bună documentația generală pentru aplicația dvs. Nu grăbiți această parte pentru că este doar un șir care nu poate face nici un fel de deteriorare - cel puțin nu pe suprafață.

  • aştepta()

Acum ajungem mai mult la inima lucrurilor. Această metodă vă permite să verificați sau să falsificați partea sistemului pe care doriți să îl testați. Să ne întoarcem la exemplul nostru precedent și să îl vedem în acțiune (limitată):

Unele Spec

descrie agent, "#favorite_gadget" o face "returnează un element, gadget-ul favorit al agentului" așteptați (agent.favorite_gadget) .pentru sfârșitul sfârșitului lui Walther PPK

aştepta() este sintaxa de afirmație "nouă" a RSpec. Anterior am folosit ar trebui să in schimb. O poveste diferită, dar am vrut să o menționez în cazul în care o să fugi în ea. aştepta() se așteaptă să-i oferiți un obiect și să exersați orice metodă testată pe ea. În cele din urmă, scrieți rezultatul afirmat în partea dreaptă. 

Aveți opțiunea de a merge cu rută pozitivă sau negativă .pentru a echiv sau .not_to eq de exemplu (eq fiind scurt pentru egalitate, desigur). Puteți întoarce întotdeauna logica în jurul valorii de - ceea ce se potrivește cel mai bine nevoilor dumneavoastră. Să facem acest test absurd și să ne concentrăm asupra rezultatelor pe care le-am obținut ca rezultat al testării noastre:

Terminal

rspec spec / models / agent_spec.rb

producție

Efectele: 1) Agentul # favorite_gadget returnează un element, obiectul gadget preferat al agentului Eșec / Eroare: așteptați (agent.favorite_gadget) .pentru a 'Walther PPK'

Citește destul de frumos, nu-i așa?? ** "Agent # favorite_gadget returnează un element și obiectul gadget preferat al agent"** vă spune tot ce trebuie să știți:

  • clasa implicată
  • metoda testată
  • rezultatul așteptat

Dacă am fi părăsit șirul care descrie metoda în descrie bloc, atunci producția ar fi fost mult mai puțin clară și lizibilă:

Unele Spec

descrie agentul ca "returnează un element, gadget-ul preferat al agentului" (agent.favorite_gadget) .pentru sfârșitul final al lui Walther PPK

producție

Eșecurile: 1) Agentul returnează un element, gadget-ul preferat al agentului Eșec / Eroare: așteptați (agent.favorite_gadget) .pentru a 'Walther PPK'

Sigur, există și alte modalități de a ocoli și de a face față acestei transmiteri prin intermediul dvs. aceasta bloc, de exemplu, dar cealaltă abordare este simplă și funcționează. Orice ar face fluxul sanguin, desigur!

Patru faze ale unui test

Cele mai bune practici în testare recomandă compunerea testelor noastre în patru faze distincte:

  • setarea testelor
  • exercițiu de testare
  • verificarea testului
  • testul teardown

Aceste patru faze sunt în mare parte pentru citire și pentru a da testelor dvs. o structură convențională. Este un așa-zis model de testare, practic, o practică pe care comunitatea a fost de acord să fie utilă și recomandată. Acest subiect cu modele întregi este o gaură de iepure profundă, așa că știți că voi lăsa o grămadă pentru a nu confunda începătorii dintre voi cu moartea. 

Înființat

În timpul configurării, pregătiți scenariul în care se presupune că testul se execută. În cele mai multe cazuri, acesta va include datele necesare pentru a fi pregătit pentru un exercițiu. Sfat mic: nu complicați lucrurile și configurați doar cantitatea minimă necesară pentru a efectua testul.

agent = Agent.create (nume: "James Bond") misiune = Mission.create (nume: 'Moonraker', statut: 'Briefed')

Exercițiu

Această parte rulează de fapt chestia pe care doriți să o testați în acest spec. Ar putea fi la fel de simplu ca:

status = mission.agent_status

Verifica

Acum, verificați dacă afirmația dvs. despre test este îndeplinită sau nu. Deci, testați sistemul împotriva propriilor așteptări.

așteptați (status) .not_to eq 'MIA')

Dărâma

Cadrul are grijă de probleme de memorie și de curățare a bazei de date - o resetare, practic. Nu trebuie să te ocupi de acest punct. Scopul este de a reveni la o stare curată pentru a rula noi teste fără surprize din partea celor care rulează în prezent. Să vedem ce ar însemna acest lucru într-un exemplu inactiv:

Unele Spec

descrie agent, '#favorite_gadget' face 'returnează un element, obiectul gadget preferat al agentului' do # Setup agent = Agent.create (nume: 'James Bond') q = Quartermaster.create q .exercițiu tehnic (agent) # Exercițiu favorit_gadget = agent.favorite_gadget # Verificați așteptați (favorite_gadget) .to eq 'Walther PPK' # Teardown este deocamdată gestionat de RSpec înainte de final

După cum puteți vedea, în acest exemplu am separat exercițiul și verificăm fazele în mod clar una de cealaltă, în timp ce în celelalte exemple de manechine de mai sus, așteptați (agent.favorite_gadget) la eq 'Walther PKK, am amestecat ambele faze împreună. Ambele sunt scenarii valabile și au locul lor. De asemenea, noile linii ajută la separarea vizuală a structurii testului.

Lucru greu despre testare

Acum vine partea dificila, ce sa testez si cum. În opinia mea, acesta este aspectul testării care este cel mai confuz pentru noii veniți - și, în mod evident, așa! Sunteți noi în limbaj și cadru și de multe ori nici măcar nu știți ce nu știți. Cum scrii teste pentru asta? Foarte bună întrebare. 

Voi fi foarte sincer, nu prea - și nu vei mai face ceva timp. A te simți confortabil cu chestiile astea. Când aveți un mentor sau participați la o tabără de boot și astfel, aveți ocazia de a învăța direct de la persoane cu experiență. În acest caz, progresul dvs. în acest departament va fi diferit, bineînțeles.

Pe de altă parte, dacă - ca mulți alții acolo - vă predați chestiile astea, răbdarea va fi cheia. Citirea tuturor cărților și a articolelor vă face cu siguranță în direcția corectă, dar cred că testarea necesită mult mai multe piese de puzzle avansate pentru ca dvs. să aveți un sens perfect și, poate chiar mai important, înainte de a vă simți confortabil. 

Vestea "bună" este că acest lucru nu este neobișnuit și că toți am fost acolo. Perseverența este importantă. Poți să faci asta, nu e știință de rachete, dar va dura ceva timp până când îți poți scrie o aplicație în mod efectiv din altă parte - din perspectiva testelor, vreau să spun. Deocamdată, continuați să împingeți, să vă distrați, să faceți greșeli, să scrieți aplicații, să copiați tutoriale și ce nu, până când becul se stinge.

Gândurile finale

Când vă scrieți testele individuale, doriți să faceți ca obiectele lor să facă cel mai simplu lucru posibil pentru a-ți atinge scopul - testele foarte concentrate sunt cu adevărat importante. Doriți să vă proiectați aplicația prin pași foarte simpli și apoi să urmați erorile pe care le oferă suita dvs. de testare. 

Doar implementați ceea ce este necesar pentru a obține aplicația verde. Nu mai mult, nu mai puțin! Aceasta este partea "condusă" în dezvoltarea bazată pe teste. Munca ta este ghidată de nevoile testelor tale.

Cod