🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.ruby
Article #1132

Re: Który język pozostaje w tyle? (Było: zapis do pliku)

#1132
From: Jaroslaw Zabiello
Date: Wed, 13 Aug 2008 12:50
132 lines
6435 bytes
Dnia 11-08-2008 o 17:45:01 Seweryn Habdank-Wojewódzki <habdank@gmail.com>  
napisał(a):

"Beyond Test Driven Development: Behaviour Driven Development
"http://www.youtube.com/watch?v=oOFfHzrIDPk

Super pogadanka. Dowiedziałem się, że prelegent napisał książkę o TDD.
Za chwilę dowiedziałem się, że TDD to "Bullshit", czyli jego książka
jako podzbiór TDD również.

Masz jakieś problemy z logiką. Książka może być przecież, dobrym,  
kompetentnym opisem gównianej metodologii.

bo zamiast koncentrować się na meritum sprawy, trzeba wiedzieć
że I.should.use.the.framework (framework_1).

Albo tego w ogóle nie przesłuchałeś tego tekstu, albo masz ciężki problem  
z umiejętnością słuchania ze zrozumieniem, albo jesteś tak uprzedzony, że  
nic ci nie pomoże.

Po pierwsze, składnia DSL'a używanego w BDD jest drugorzędna. BDD można  
uprawiać nawet za pomocą klasycznych assertów (vide Shoulda). Więc się nie  
błaźnij.

Po drugie, zasadnicza różnica między TDD a BDD dotyczy metodologii,  
określenia tego co właściwie ma być testowane. No bo jak ktoś sam nie wie,  
CO testuje, to nie świadczy o jego mądrości. Czym jest np. owa "jednostka"  
w "testowaniu jednostkowym"? Kawałkiem klasy, funkcji, skryptu? Wszystkim  
i niczym? TDD testuje jakieś fragmenty kodu. BDD proponuje natomiast aby  
testować to, czy aplikacja nasze względem niej oczekiwania. Testera nie  
powinno obchodzić, czy dany algorytm działa tak czy inaczej. Powinno go  
tylko obchodzić to, czy kod realizuje pokładane w nim oczekiwania. BDD  
nazywa specyfikacjami (specs). No dobrze. Ktoś powie, że asserty to też  
takie same oczekiwania jak te should w RSpec tylko, że wyrażone inną  
składnią. Otóż podobieństwo znika, gdy sięgnie się po historie  
użytkownika, User Stories. Stały się one podstawą do rozwiniętej części  
BDD jako Story Driven Development. W SDD definiuje się listę oczekiwań  
wobec aplikacji. Oczekiwania są wyrażane w formie scenariuszy  a  
scenariusze mogą być gromadzone razem w historie. Innymi słowy, w SDD  
testuję to, czy aplikacja spełnia moję, określone oczekiwania. Proste i  
logiczne. I także łatwe do wyjaśnienia dla osób nietechnicznych. DSL  
używany w RSpec w tym wypadku wygląda tak:

Story: Krótki opis tego co będziemy sprawdzać
   As ...
   I want to ...
   So that ...

   Scenario: krótki opis pierwszego scenariusza
     Given ...
     When ...
     Then ...

   Scenario: tytuł drugiego scenariusza
     Given ...
     When ...
     Then ...

To, co wpiszemy jako tytuł historii i scenariusza jest zupełnie dowolne,  
byle było krótkie i opisowe.  Treść szablonu "As, I want to, So that" nie  
będzie przetwarzana, więc w zasadzie jest też dowolna.  To, co w tym  
najciekawsze i czego nie uświadczysz w TDD, to możliwość wielokrotnego  
wykorzystania tych samych części zdań.

Aby trochę otworzyć zasklepione umysły (u co niektórych), podam może  
konkretny przykład jak wygląda kod takich testów w praktyce. Załóżmy, że  
chcę sprawdzić czy działa mi formularz kontaktowy. Na początek stworzę 3  
proste scenariusze.

Story: Contact via form

   As a potential customer
   I want to send a message
   So that I could know the message was delivered

   Scenario: Send required fields without email
     Given 'name' field as 'Joe Doe'
       And 'subject' field as 'Feedback'
       And 'message' field as 'Hello!'
     When I send the form
     Then I should see 'thanx'
       And fields should be saved in the database

   Scenario: Send required fields with invalid email
     Given 'name' field as 'Joe Doe'
       And 'subject' field as 'Feedback'
       And 'message' field as 'Hello!'
       And 'email' field as 'joe.doe@gmail'
     When I send the form
     Then I should see 'invalid email'

   Scenario: Send missing fields
     Given missing 'name' field
       Or missing 'subject' field
       Or missing 'message' field
     When I send the form
       Then I should see 'missing name or subject or message'

Główny kod który przemieli te scenarusze (tu dla Rails) będzie wyglądał  
mniej więcej tak:

steps_for(:contact) do
   Given "'$what' field as '$value'" do |what, value|
     @fields = {} unless @fields
     @fields[what] = value
   end

   Given "missing '$what' field" do |what|
     @fields = {} unless @fields
     @fields[what] = ""
   end

   When "I send the form" do
     post "/contact", :contact => @fields
   end

   Then "I should see '$text'" do |text|
     flash[:notice].should == text
   end

   Then "fields should be saved in the database" do
     Contact.create @fields
   end
end

Oczywiście pomijam tu szczegóły dotyczące kodu szablonu HTML formularza  
itp. bo nie chcę się bardziej rozpisywać. Dokładniejszy opis będzie mojej  
książce.

--
Jarosław Zabiełło
http://blog.zabiello.com
Technical Details
Message-ID: <op.uftslxmgyvsyti@vantify_ec>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
References: <0kke845ibufm2jqmh3i50a280nnr72l8qj@4ax.com> <g6968o$1cgj$1@news2.ipartners.pl> <g69f0n$ism$1@atlantis.news.neostrada.pl> <g69noq$1mem$1@news2.ipartners.pl> <sdpg849b3pr01r22d17q42jv4v9icj9so7@4ax.com> <g69qa7$mu9$1@news.lublin.pl> <pdug841rd12sbuhm88480k3bud24c2tnuh@4ax.com> <g69uma$q97$1@news.lublin.pl> <lf2h84hsee6r2ekdh8ol7u8su4dl8dddk4@4ax.com> <op.uex2xjtmyvsyti@zbiru-at-home.local> <l3oom5-9i4.ln1@bozon.softax.pl> <op.ufkxviisyvsyti@zbiru-at-home.local> <712c7a19-cab5-441b-8718-ed0e5b641d37@34g2000hsh.googlegroups.com> <op.ufsh1nj1yvsyti@zbiru-at-home.local>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: "Jaroslaw Zabiello" <hipertracker@gmail.com>
Newsgroups: pl.comp.lang.ruby
Subject: Re: Który język pozostaje w tyle?
 (Było: zapis do pliku)
Date: Wed, 13 Aug 2008 13:50:11 +0100
Organization: http://zabiello.com
Lines: 132
Message-ID: <op.uftslxmgyvsyti@vantify_ec>
References: <0kke845ibufm2jqmh3i50a280nnr72l8qj@4ax.com> <g6968o$1cgj$1@news2.ipartners.pl> <g69f0n$ism$1@atlantis.news.neostrada.pl> <g69noq$1mem$1@news2.ipartners.pl> <sdpg849b3pr01r22d17q42jv4v9icj9so7@4ax.com> <g69qa7$mu9$1@news.lublin.pl> <pdug841rd12sbuhm88480k3bud24c2tnuh@4ax.com> <g69uma$q97$1@news.lublin.pl> <lf2h84hsee6r2ekdh8ol7u8su4dl8dddk4@4ax.com> <op.uex2xjtmyvsyti@zbiru-at-home.local> <l3oom5-9i4.ln1@bozon.softax.pl> <op.ufkxviisyvsyti@zbiru-at-home.local> <712c7a19-cab5-441b-8718-ed0e5b641d37@34g2000hsh.googlegroups.com> <op.ufsh1nj1yvsyti@zbiru-at-home.local>
NNTP-Posting-Host: 62.77.187.21
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1218631811 2975 62.77.187.21 (13 Aug 2008 12:50:11 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Wed, 13 Aug 2008 12:50:11 +0000 (UTC)
To: "Jaroslaw Zabiello" <hipertracker@gmail.com>
X-User: hipertracker
User-Agent: Opera Mail/9.51 (MacIntel)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit