Testing and TDD - Laravel and Express Examples

Preview:

Citation preview

TEST-DRIVEN DEVELOPMENT – TEORIJA I PRIMJERIDRAGOŠ STRUGAR

O MENI

Dragoš Strugar

još u srednjoj

najviše istražujem iOS i backend development

Osvojio Hackathon 2016 Banjaluka

idem na takmičenja inovacija u ZG, BL i NS

O ČEMU OVA PREZENTACIJA NIJE

vrste testiranja

potpun tutorijal kako koristiti TDD u Laravelu i Expressu

nije za developere koji su već radili dosta sa TDDom, mada i oni možda nešto nauče

PRIJE NEGO ŠTO KAŽEM O ČEMU JE ZAPRAVO OVA PREZENTACIJA..

Šta je Unit testing?

Kako se ta vrsta testiranja razlikuje od ostalih vrsta testova?

Zašto ovo pominjem?

O ČEMU JE OVA PREZENTACIJA

UNIT testing, programerski testovi

Automatizovano testiranje

Razumijevanje TDD i Unit testing osnovnih pojmova

Par primjera ovoga u Express.js i Laravel frameworcima

PAR PITANJA

Koliko vas misli da je pisanje testova manje ili veće gubljenje vremena?

Koliko vas piše testove u svojim aplikacijama?

Koliko vas to radi TDD/BDD pristupom?

SVI TESTIRAJU…

Uđi na browser, posjeti localhost/posts, vidi jesu li svi postovi izlistani

Uđi u konzolu, vidi jesi li uspješno sačuvao/la novi post?

itd..

…SAMO NEKI TO AUTOMATIZUJU

napišu kod koji to provjeri za njih

razmislite koliko bi vam to vremena uštedjelo

dodamo novi feature za postove, samo izvrtimo testove da vidimo da li i dalje prolaze

ne moramo tokom noći se pitati da li naš kod radi, ili ima neki bug, samo testiramo prije spavanja, easy..

ZA NEKE SLUČAJEVE OVO JE SASVIM DOVOLJNO

recimo, hoćete dodati novi feature u vašu app koji ima baš mnogo slučajeva koji se trebaju provjeriti

vaša app nije prevelika, niste testirali ništa u njoj, ali ovaj feature baš liči na nešto što bi se trebalo testirati

napišete testove samo za tu funkcionalnost

ALI, ZA VEĆINU NIJE..

imate app koja je poprilično velika ima mnogo koda i mnogo slučajeva koji se trebaju testirati kad dodate novu funkcionalnost, ona možda sruši neki feature rađen prije.. Full code coverage!

ŠTA TESTIRANJEM DOBIJATE?

software koji nema bugova aplikaciju koja je spremna za produkciju developersku sreću jer znate da ste odradili

software kako treba DEVOPS

OVDJE STVARI POČINJU DA BUDU ZANIMLJIVE :D

hajdemo zamisliti scenario u kojem bismo napisali prvo testove, a tek onda naš kod? Čekaj, mali, jesi ti normalan?

Zar to ne bi značilo da naši testovi uvijek prvo padaju?

I ODGOVOR JE..

DA!- pravićemo objekat, čak ako nemamo još napisanu klasu

- zvaćemo metodu koja ne postojii kad testove izvršimo, oni trebaju PASTI

AKO STE SHVATILI POGREŠNO…

pisanje čitavog test koda prije pisanja jedne linije ”pravog” koda mart – pisanje testova april – pisanje koda koji prolazi testiranje

POGREŠNO!

HAJDEMO PROMISLITI I NA DRUGI NAČIN

test-driven znamo smjer u kojem trebamo razvijati našu aplikaciju u procesu razvoja, znamo TAČNO gdje se pojavljuju greške RED Green možda ovaj pristup i nije toliko loš..

RED-GREEN-REFACTOR

DOSTA TEORIJE, LET’S GET OUR HANDS DIRTY!

koristimo frameworke za testiranje: PHPUnit – PHP JS – Mocha (Backend JavaScript here, folks) JUnit - Java NUnit - .NET PyUnit – Python CppUnit – C++

LARAVEL TDD UVOD

nisam ekspert, ako neko vidi neku grešku u Laravel kodu, neka me slobodno prekine sve vam je built-in Hajdemo uzeti primjer pravljenja klase Movie koristeći TDD

MOVIE TEST- LARAVEL

- pravimo Movie.php sa običnim <?php class Movie{}- u tests/ direktorijumu pravimo novi fajl, MovieTest.php

IZVRŠAVANJE TESTA - LARAVEL

u rootu projekta kucate phpunit i dodatni argument može biti path do samo jednog testa, ili direktorijuma u kom se nalazi više testova

Dobićemo Test failed - PHP Fatal Error: ’App\Movie’ not found Ako u Movie.php dodamo namespace App i izvršimo testove, dobijamo drugi error: Call to undefined method App\Movie::name()

LARAVEL MOVIE CLASS

Ako dodamo metodu name, pomoću public function name(){} Dobijamo sljedeći error:

Failed asserting that null matches expected ’Star Wars’

VRIJEME ZA PITANJA - LARAVEL

kako biste dodali pored imena filma, njegovog režisera (bonus poeni ako znate ko je to)?

zapažate li problem koji će nam se desiti?

setUp method! DRY, guys

public function setUp() {$this->movie = new Movie(‘Star Wars’ , ‘George Lucas’);}

LARAVEL - WEB

za request/response je sve built in, pogledajmo primjer

PRIMJER NOVI U LARAVELU

Posjetiti home page $this->visit(‘/’);

Klikni na Click Me link $this->click(‘Click Me’); Dodati <a href=”#”>Click Me</a>

Vidi ima li poruka ”Clicked” $this->see(‘Clicked’); Prepraviti link da bude href=“/feedback” -> dobijamo 404 Dodati rutu /feeback koja vraća poruku “Clicked”

Vidi da li je trenutni url /feedback $this->seePageIs(‘feedback’);

EXPRESS SADA…

mochajs.org – asynchronous testing assertion library expect – eror poruke i mnoge druge pogodnosti supertest – za requeste (GET, POST, …) – ne moramo manualno provjeravati headere,

status codove i sl.

TEST DRIVE IN EXPRESS

Za ovaj primjer će nam trebati express, mocha, supertest i expect od NPM paketa Jedan fajl za server i jedan za test server.js i server.test.js napravimo u package.json alias

"scripts": {        "test": "mocha **/*.test.js"    },

TEST FAJL PRVO

NAKON

ako odradimo npm test, dobijamo

AKO DODAMO SERVER.JS STVARI

PASS!

RESURSI ZA UČENJE

Laravel - PHPUnit: https://phpunit.de/ Express – Supertest/Mocha/Expect su na NPM, svi open-source https://github.com/visionmedia/supertest

Za Laravel preporučujem od Laracasts Testing sekciju Za Express ne znam takav kurs, ali ima mnogo blog postova..

HVALA NA PAŽNJIKONTAKT: FB.COM/DRAGIFY, ITSDRAGOS@GMAIL.COM