Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Selektor-Free Cucumber scenariji

Koristim Cucumber takoreći od prvog dana kada sam čuo za njega. Radio sam na mnogo projekata koji su se oslanjali na njegovu prisutnost radi pouzdanog razvoja. Prema tome, uložio sam mnogo truda u usavršavanje svoje Cucumber infrastrukture da bih učinio ovaj fantastični alat još boljim. Podeliću jedan takav zalogajčić koda koji čini programiranje sa Cucumber-om još boljim.

Problem

Radio sam na mnogo web aplikacija i, kao što sam siguran da mnogi od vas znaju, često se programiranje web aplikacije fokusira pre svega na funkcionalnost, a interfejs i stil kasnije se inkorporiraju. Može biti da klijent još uvek ne zna koji osećaj želi za svoj projekat ili da hoće da fokusira svoj budžet najpre na prototipizaciju aplikacije.

To je u redu, osim činjenice da je menjanje HTML-a i CSS-a web aplikacije nakon što je mnogo funkcionalnosti već programirano fantastičan način da se upropaste svi vaši integracioni testovi.

Ovo je posebno tačno ako imate scenarije poput sledećeg izmišljenog:

When I fill in "Username" with "bjeanes" within ".main-panel form#signup-form" And I press "Sign up!" within ".main-panel form#signup-form" Then I should see "You have successfully signed up" within ".flash.notice"

Problem je, naravno, što programeri mogu promeniti HTML koji je nekada bio .main-panel form#signup-form u nešto više seksi i semantičko.

Rešenje

Ovaj problem ne razlikuje se mnogo od jednog već rešenog; svi smo završili sa hardkodiranjima URL-ova poput "/users/new" u naše preglede i Cucumber scenarija i zamenili ih sa new_user_path i the signup page, zasebno.

Pa zašto onda ne primeniti istu formulu koju paths.rb koristi za uklanjanje URL-ova iz scenarija na našu situaciju sa selektorima?

Evo šta dodajem svim novim projektima:

# I'm in features/step_definitions/web_ext_steps.rb When /^(.*) within ([^:"]+)$/ do |step, scope| with_scope(selector_for(scope)) do When step end end Multi-line version of above When /^(.*) within ([^:"]+):$/ do |step, scope, table_or_string| with_scope(selector_for(scope)) do When "#{step}:", table_or_string end end

I:

# I'm in features/support/selectors.rb module HtmlSelectorsHelper def selector_for(scope) case scope when /the body/ "html > body" else raise "Can't find mapping from \"#{scope}\" to a selector.\n" + "Now, go and add a mapping in #{__FILE__}" end end end World(HtmlSelectorsHelper)

Primena rešenja

Moj prethodni primer neispravnog Cucumber scenarija sada postaje:

When I fill in "Username" with "bjeanes" within the sign up form And I press "Sign up!" within the sign up form Then I should see "You have successfully signed up" within the notice flash

A case naredba selectors.rb dobija sledeće dodatke:

case # ... when /the sign up form/ ".main-panel form#signup-form" when /the (notice|error|info) flash/ ".flash.#{$1}" # ... end

Obratite pažnju kako scenario sada identifikuje stvari na našoj stranici prema njihovim semantičkim identifikatorima, a ne prema krhkim CSS ili XPath lokacijama koje su sklone promenama . Kao bonus, sad ako i kada se menjaju, putanje treba da se ažuriraju samo na jednom mestu u našoj Cucumber skupini testova!

Patching Cucumber-a

Prilično snažno smatram da CSS i XPath nemaju mesta u našim feature fajlovima, jer ne samo što podstiču krhke testove (kao što je prikazano gore), nego i zato što su ti selektori potpuno nebitni krajnjim korisnicima, a to je čitava poenta korišćenja prirodnog jezika DSL da se opišu naši integracioni testovi, tačnije da se stavimo na mesto korisnika.

Zaista bih voleo da patch ovo nazad u Cucumber, a potpuno planiram da to uradim, pod uslovom da nađem dovoljno vremena.

Našao sam vremena, i evo mog pull zahteva da se oni sjedine.

Proširenje rešenja

Primetićete da moj HtmlSelectorsHelper akomodira samo CSS selektore. To je samo zbog toga što mi nikad nije trebao XPath u tom kontekstu. Međutim, bilo bi vrlo jednostavno da izmenite moje primere da biste to uradili, s kombinacijom više povratnih vrednosti i splat-om. To je vežba za čitaoca (ili za mene ako na kraju sam budem radio patching za Cucumber).

Završna reč

Izvinjavam se zbog dužine ovog članka, ali čestitam vam što ste izdržali skroz do kraja!

Sada imam toliko mnogo ideja za blog da sam morao da kreiram novu kategoriju u Things.app samo da bih ih sve sačuvao. To znači da ću se truditi da završim i okačim još nekoliko postova u narednim nedeljama, uključujući poređenje performansi različitih enkapsulacija podataka za API-je web aplikacije na iPhone-u (tj. da li je bolje koristiti Plists, JSON ili XML) i post o tome zašto mislim da bi trebalo da bude 8 RESTful akcija, a ne 7 koliko Rails propisuje po defaultu.





Published (Last edited): 06-03-2013 , source: http://bjeanes.com/2010/09/selector-free-cucumber-scenarios