Archive for the 'Tutorials' category

Mala šola testiranja z PHPUnit in Selenium

jun. 16 2010 Published by alesl under Modrüvanje, Tehnologija, Tutorials

Debugging Sucks! Testing Rocks!

Tale članek sem se spravil pisat že dobro leto nazaj. Vmes sem tudi sformatiral disk in so šle stvari v tri … Kljub temu da je članek še vedno nedokončan sem se odločil da ga objavim, saj bo marsikomu v pomoč pri prvih korakih TDD-ja.

Prvi odziv programerjev ob omembi Test-Driven Developmenta je ponavadi negativen, saj pomislijo le na eno: “Tole mi bo pa vzelo dodatnih 50% več časa pri razvoju aplikacij.” Podoben odziv sem pred kratkim doživel pri “naših” programerjih, ko sem jim kazal kako naredimo “Acceptance Test” z uporabo Selenium RC-ja.[1]
Zgornja trditev bi načeloma veljala samo če bi se življenski cikel aplikacije zaključil z prvo produkcijsko verzijo, ter ob klasičnem razvoju Dizajn-Implementacija-Testiranje[2]. To zgodbo najverjetneje vsi poznamo:
“Imamo dva programerja, ki vsak zase nadgrajujeta svoj del že žive aplikacije. Ob združitvi kode, zgleda kot, da je vse ok. Čez čas dobita klic[3], da določene stvari ne delajo, čeprav so prej delale. Vsak posebej za iskanje in razhroščevanje kode porabita polovico dneva.”
Take in podobne zgodbe so lahko preteklost. Rešitev je TDD.

Kaj je TDD

Test-Triven Development (TDD) je razvojna tehnika za softver. Z TDD tehniko stvari postavimo malce na “glavo”. Teste pišemo preden začnemo pisat implementacijsko kodo!. Test pelje oziroma diktira kodo ki se razvija.[4]
TDD cikel pri razvoju aplikacij izgleda nekako takole:

  • Dizajn: Pogruntamo kaj želimo narediti
  • Test: Napišemo test, ki izraža naš dizajn.
    • Test ne bi smel uspeti – FAIL
  • Implementacija: Napišemo kodo
  • Test: ponovno
    • Test bi moral uspeti – PASS
  • Refactoring po potrebi
  • Ponavljaj

Še vedno vas je strah da bo več dela. Malce pa res. :)
Tri različne študije (Microsoft, IBM, John Deere / Ericsson) so pokazale:

  • TDD projekti imajo dva krat večjo kvaliteto kode.
  • Pisanje testov vzame le 15% več časa – dolgoročno gledano.
  • Število hroščev in defektov je manjše za 40%.
  • Skupinska produktivnost se poveča za 16%.

Testiranje

Kaj potrebuje testiranje?
- Backend: programska logika in ponovno uporabljene komponente
- Frontend: procesiranje form, templatov, bogata vsebina z uporabo “AJAX-a#, JSON, RSS Feed, Web Servisi

Kako testiramo?
- Backend: test funkcionalnosti programske logike z Unit Testi
- Frontend: “Acceptance” in Sistemski testi, ki se izvajajo na brskalniku, Testiranje RSS Feedov, Web servisov z Unit Testi, Kompatibilnostni testi …

Acceptance testing

je testiranje na določenem sistemu po principu “črne škatle“. Acceptance test zagotavlja da koda počna to kar želi “stranka”[5], ne pa pričakovanj razvijalca! Temu testiranja bi lahko preprosto rekli tudi testiranje funkcionalnosti. Pa poglejmo kako implementirati Acceptance Test z “ubijalsko kombinacijo” PHPUnit in Selenium.

Priprave na testiranje

Zahteve:

V tem članku uporabljamo PHPUnit, kateri od verzije 3.0 naprej, vsebuje PHPUnit_Extensions_SeleniumTestCase razred, katerega lahko uporabljamo za definicijo Acceptance testov. Sam razred pa za opravljanje testov potrebuje Selenium Core. Zelo pomembno je, da ne pozabimo da to NI Unit testiranje. PHPUnit je knjižnica za “Unit Testing”, med drugim pa je framework prav tako uporaben za integracijske ter acceptance teste.

Inštalacija PHPUnit:
Priročnik PHPUnit-a priporoča inštalacijo frameworka z uporabo PEAR Installer-ja. PEAR kanal (pear.phpunit.de), kateri se uporablja za distribucijo PHPUnit-a bora biti registriran z lokalnim PEAR okoljem.[7] Ko to enkrat naredimo, uporabimo PEAR za inštalacijo paketa od PHPUnit kanala.
Inštalacija PHPUnita
Inštalacija PHPUnita
PHPUnit dokumentacijo za Selenium najdete na http://www.phpunit.de/pocket_guide/3.2/en/selenium.html. Sedaj nam preostane še da iz PEAR kanala inštaliramo Testing_Selenium paket, ki ga potrebuje PHPUnit Selenium podaljšek.


Inštalacija paketa Testing_Selenium
Inštalacija paketa Testing_Selenium

Selenium:
je paket orodij za avtomatsko testiranje spletnih aplikacij. Vsebuje kar nekaj paketov, med drugim Selenium Core, Selenium RC, Selenium IDE, … Selenium Core opravlja aktivnosti uporabnika, izvaja test in obvešča o rezultatih testa. Selenium RC je dodatni serverski proces, ki ga rabimo, če želimo izvajati teste z PHPUnit podaljškom za Selenium. Njegov glavni namen je da omogoča izbranemu programskemu jeziku interakcijo z Selenium Core ki laufa na brskalniku z uporabo preprostega HTTP GET klica do RC strežnika. Komplicirano?!
Najnovejši Selenium RC dobite na http://selenium-rc.openqa.org/download.html. Po tem ko raspakiramo paket v njem najdemo kar nekaj map. V eni izmed njih je Selenium server, ostali so client driverji za različne programske jezike. Mi smo ga za PHP že inštalirali preko PEAR instalerja. Selenium RC zaženemo preprosto iz command lina:

java -jar selenium-server.jar -interactive

Še prej pa smo seveda inštalirali Javo. :)

Inštalacija Xdebug-a:
Xdebug je podaljšek za PHP, ki primarno služi za “debugging” – razhroščevanje kode, pri čemer je sposoben navrčt celo paleto koristnih informacij. Zna pa še narediti profil – “profiling” skripte in analizo pokritosti kode – “code coverage analysis”. Prav slednjo zadevo bomo pokazali v našem članku. Velja si zapomniti, da Xdebug ni potreben za izvajanje testov in da ga ne morete imeti naloženega skupaj z Zend Debuggerjem.
Najlažje je Xdebug inštalirati preko PEAR/PECL kanala.

pecl install xdebug

V php.ini dodamo tole klobaso[8] za temeljit izpis informacij, remote debugging ter profiling na triger:

[Xdebug]
zend_extension="/opt/local/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"
;General
xdebug.default_enable=On
xdebug.show_exception_trace=Off
xdebug.show_local_vars=1
xdebug.max_nesting_level=50
xdebug.var_display_max_data=3072
xdebug.var_display_max_depth=12
xdebug.dump_once=On
xdebug.dump_globals=On
xdebug.dump_undefined=On
xdebug.dump.REQUEST=*
xdebug.dump.SERVER=REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
xdebug.collect_params=4
xdebug.collect_includes=On
xdebug.collect_return=On
xdebug.show_mem_delta=On

;Remote debugging
xdebug.remote_enable=On
xdebug.remote_host="localhost"
xdebug.remote_port=9000
xdebug.remote_handler="dbgp"

;Profiling
; Turns it off by default
xdebug.profiler_enable=0
; Turns xdebug on when ?XDEBUG_PROFILE=true is in GET or POST
xdebug.profiler_enable_trigger=1
; Your output directory - you'll eventually point webgrind at this
xdebug.profiler_output_dir="/tmp"

O samem orodju podrobno kdaj drugič. Gremo nazaj na testiranje.

Pisanje in zagon acceptance testov

Osnovna forma za acceptance test z PHPUnit in Selenium RC je zelo preprosta.

/** PHPUnit_Extensions_SeleniumTestCase */
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class MonetaOrderTest extends PHPUnit_Extensions_SeleniumTestCase
{
    protected function setUp()
    {
        /**
         * '*firefox' => Firefox 1 or 2
         * '*iexplore' => Internet Explorer (all)
         * '*custom /path/to/browser/binary => Other browsers (incl. Firefox on Linux)
         * '*iehta' => Experimental Embedded IE
         * '*chrome' => Experimental Firefox profile
         */
        $this->setBrowser(*firefox /Applications/Firefox2.app/Contents/MacOS/firefox-bin);
        $this->setBrowserUrl(http://gateway.home.internet-solutions.si);
    }

    /**
     * Test if
     * label First Name exists
     * element firstName exists
     *
     */
    public function testFirstNameExists()
    {
        //open test/moneta
  	$this->open(http://gateway.home.internet-solutions.si/test/moneta');
  	/** First Name */
  	//label exist
        try {
            $this->assertEquals("First Name", $this->getText("//form[@id='moneta']/dl/dt[1]/label"));
        } catch (PHPUnit_Framework_AssertionFailedError $e) {
            array_push($this->verificationErrors, $e->toString());
        }
        //element present
        $this->assertTrue($this->isElementPresent("firstName"));
    }
}

Metoda setUp() se uporablja za “zagon” testa. Tukaj definiramo kateri brskalnik se naj koristi. Firefox je le ena od možnih opcij. V primeru da Selenium RC ne vsebuje privzete reference za vaš priljubljeni brskalnik[9] lahko uporabite prefix “*custom” pri kateremu določite pot do vašega izbranega brskalnika. Metoda setBrowserUrl() nastavi URL iz katerega potekajo vsi testi.

http://www.internet-solutions.si/wp-content/uploads/2008/09/Order_Form_Acceptance_Tests.flv
http://www.internet-solutions.si/wp-content/uploads/2008/09/Order_Form_Acceptance_Tests_Code_Coverage.flv

Če vas zanima še kaj o test driven developmentu me kontaktirajte.

Happy blogging(coding)!

  1. podrobno bom predtavil testiranje z Selenium RC v današnjem članku []
  2. če je sploh kaj testiranja pred produkcijo []
  3. ponavadi od stranke, katero pa opozorijo uporabniki []
  4. Sedaj vemo od kod ime Test-Driven Development []
  5. uporabnik, brskalnik []
  6. opcijsko – ni pogoj za izvajanje testov []
  7. predvidevajmo da imate PEAR že inštaliran []
  8. v njej prilagodite pot do podaljška []
  9. v kar dvomim ;) []

Sorodni zapisi:

No responses yet

Dobra vila za SQL

jun. 25 2008 Published by alesl under Modrüvanje, Tanači, Tutorials

Naključje …

Perl module z imenom SQLFairy (SQL::Translator) sem odkril čisto po naključju med tem ko sem se spoznaval z Doctrine. Ta ORM za PHP do verzije 0.11 ne omogoča da bi mu preprečili avtomatsko “singularizacijo” “podatkovnih modelov” ki jih generiramo iz trenutne baze. Da ponazorim: če imamo tabelo z imenom “files”, bo Doctrine generiral model z imenom “File” in ne “Files”. Čeprav mi ni ravno jasno kako[1], določeni modeli dobijo kar čudna imena ;)[2] .
Da ne bi vedno znova popravljal YAML datoteko, ki opisuje shemo podatkovne baze, sem se lotil malega raziskovanja. Naletel sem na …

Continue Reading »

  1. Nisem se poglabljal v kodo ki generira imena modelov []
  2. moneta je postala “Monetum” []

Sorodni zapisi:

  • Ni sorodnih zapisov

One response so far

Ločevanje Apache log datotek z uporabo vlogger-ja

jun. 12 2008 Published by alesl under Tanači, Tehnologija, Tutorials

Long time no see

Po dolgem času spet nekaj za narodov blagor. Od zadnje objave je minilo kar nekaj časa. Delavniki so še vedno enaki: sestanki, ideje, realizacija, skratka ena velika “gužva” :)
Doma in v službi sem dokončno prešaltal na linux. Svojemu profilu na LinkedIn lahko počasi dodam napredno znanje in administracija Debian/Ubuntu based linux distribucij.
Še vedno veliko raziskujem in testiram. Med zadnjimi uspešnimi eksperimenti je inštalacija Leoparda (Mac Os X 10.5.2) na zunanjem USB disku na dve leti starem PC-ju z AMD Athlon 64 procesorjem. Kako mi je to uspelo, vam ne morem razkriti, saj je celotna stvar namenjena testiranju in ni ravno legalna ;) Koga zanima kaj več si naj ogleda OSx86 Project. Vsekakor je Mac Pro moj developer dream machine, saj mi kljub n-odprtim aplikacijam:

  • Firefox z cca 50 odprtimi tabi
  • Opera z cca 20 odprtimi tabi
  • Safari z cca 10 odprtimi tabi
  • Zend Studio for Eclipse
  • Aptana Studio
  • in še eno 20 raznoraznih programčkov

na PC-ju ni uspelo preobremenit procesor in s tem OS X, da bi ta vsaj malo počepnil. Kako celotna zadeva deluje na originalnem Macu pa si lahko le zamišljam.

Continue Reading »

Sorodni zapisi:

No responses yet

Kako iz nule inštalirati Apache 2.2.8, MySQL 5.0.51 in PHP 5.2.5 na Ubuntu Dapper (6.06)

jan. 28 2008 Published by alesl under Code snippets, Tutorials

Pred dobrim tednom sem si omislil VPS (virtual private server). Potreba po VPS-ju izhaja predvsem po želji izboljšati znanje Linux-a in administracije strežnikov.
Izbira ponudnika spletnega gostovanja je kar teška odločitev, saj jih je kot gob po dežju. Izbral sem Host Europe, prvensteveno zaradi nizke cene 20 EUR.
V drugem planu pa me je pritegnila dodatna ponudba: Hardware, lastna izbira operacijskega sistema (Debian, Ubuntu, SUSE). Do sedaj sem imel opravka z Debianom in Ubuntujem.
Ker sem slednjega malenkost več uporabljal, sem se odločil za Ubuntu brez Pleska. Prvotno veselje je malce popustilo, ko sem pogruntal da je distribucija Ubuntuja, ki je inštalirana na VPS-ju trenutno še verzija 6.06 iz junija 2006, kar dejansko pomeni da so softverski paketi že malce zastareli. Next time read FAQ! :)
Continue Reading »

Sorodni zapisi:

4 responses so far

Skrivnost večih IIS virtualnih serverjev na Windows XP Pro

sept. 29 2007 Published by alesl under Tutorials

Virtual server, Virtual Host??
Apache[1], je kot web strežnik odigral ključno vlogo v razvoju World Wide Web-a. Deset let nazaj je bil najbolj popularen HTTP server na svetu. Pred dobrim letom, dve pa je počasi začel izgubljati delež trga, predvsem zaradi IIS[2] ter .NET platforme. Trenutno Apache servira 50% vseh spletnih strani, IIS pa 34%. Dost je statistike, preidimo na stvar.
Da na eni “mašini” laufa več spletnih strani[3] je nekaj samoumevnega. Pri razvoju “web aplikacij” želimo, da objava spletne strani na “produkcijskem” strežniku poteka s čim manj zapleti. To najlažje dosežemo tako, da razvojno okolje čimbolj približamo produkcijskemu. Ta korak od nas zahteva zagon večih spletnih aplikacij na lokalni “mašini”. Praksa ki to omogoča se v Apache-ju imenuje “Virtual Host“. Kako konfiguriramo Apache za podporo virtual hostingu bom razložil kdaj drugič ;)
Continue Reading »

  1. upam da mi ni treba na drobo razlagat kaj to je ;) []
  2. Microsoft Internet Information Services []
  3. npr. www.podjetje1.com in www.podjetje2.com []

Sorodni zapisi:

No responses yet