PHPSpec és un framework de tests BDD. If you were doing BDD you would describe the behaviour of your class prior to writing your class. If you did that way the relevant behaviour of your classes would all be properly covered with "tests".
Explicació de BDD. TODO f you were doing BDD you would describe the behaviour of your class prior to writing your class. If you did that way the relevant behaviour of your classes would all be properly covered with "tests".
https://laracasts.com/lessons/phpspec-is-so-good https://laracasts.com/lessons/phpspec-laravel-and-refactoring
https://laracasts.com/lessons/phpspec-laravel-and-refactoring)
Recursos:
Recursos:
S'utilitza el format YAML per definir la configuració de PHPspec. Vegem un exemple de fitxer com el que porta Laravel 5 per defecte:
suites: main: namespace: App psr4_prefix: App src_path: app
On definim la nostra test suite. Bàsicament estem definint on es troba el codi (src_path, en el cas de laravel carpeta app) i quin espai de noms i configuració de PSR-4 utilitzem. Laravel per defecte anomena App a l'aplicació i el seu namespace però el podeu canviar amb la comanda:
$ php artisan app:name nounom
Recursos
Feu un fork de:
https://github.com/laracasts/Gilded-Rose-Kata-in-PHP
I us baixeu el projecte amb clone. Un cop dins del projecte clonat
$ mv spec oldspec
Configureu phpspec per utilitzar PSR-4 creant un fitxer phpspec.yml:
suites: gildedrose_suite: namespace: App psr4_prefix: App src_path: src
Abans de rest inicialitzeu composer:
$ composer install $ composer dumpautoload
Ara creeu el test:
$ phpspec describe App/GildedRose
i L'executeu amb:
$ phpspec run
Us donarà el missatge:
App/GildedRose 11 - it is initializable warning: Missing argument 1 for App\GildedRose::__construct() in /home/sergi/Code/Gilded-Rose-Kata-in-PHP/src/GildedRose.php line 13 100% 1 1 specs 1 example (1 broken) 10ms
Cal inicialitzar la classe:
/** * Check it is initializable */ function it_is_initializable() { $this->beConstructedWith('normal',10,5); $this->shouldHaveType(GildedRose::class); }
Ara ja podeu executar test:
$ phpspec run
I tot verd. Vegem un primer exemple de test adaptant els testos de la carpeta oldspec, per exemple el test
it ('updates normal items before sell date', function () { $item = GildedRose::of('normal', 10, 5); // quality, sell in X days $item->tick(); expect($item->quality)->toBe(9); expect($item->sellIn)->toBe(4); });
en format phpspec sense kahlan:
/** * Check it is initializable */ function it_updates_normal_items_before_sell_date() { $this->beConstructedWith('normal',10,5); $this->tick(); $this->quality->shouldBe(9); $this->sellIn->shouldBe(4); }
Vegeu:
https://github.com/acacha/Gilded-Rose-Kata-in-PHP
Recursos:
Com utilitzar PHPspec amb Laravel:
https://laracasts.com/lessons/phpspec-laravel-and-refactoring
Autoexecutar tests al guardar:
Es pot fer amb Gulp. Instal·leu-lo consultant l'apartat:
Instal·lació de Gulp
Afegiu els plugins gulp-phpspec gulp-notify gulp-run:
$ npm install gulp gulp-phpspec gulp-notify gulp-run --save-dev
Ara cal crear un fitxer de configuració/execució de Gulp Gulpfile.js:
var gulp = require('gulp'); var phpspec = require('gulp-phpspec'); var run = require('gulp-run'); var notify = require('gulp-notify'); gulp.task('test', function() { gulp.src('spec/**/*.php') .pipe(run('clear')) .pipe(phpspec('', { notify: true })) .on('error', notify.onError({ title: 'Dangit', message: 'Your tests failed!', icon: __dirname + '/fail.png' })) .pipe(notify({ title: 'Success', message: 'All tests have returned green!' })); }); gulp.task('watch', function() { gulp.watch(['spec/**/*.php', 'src/**/*.php'], ['test']); }); gulp.task('default', ['test', 'watch']);
Podeu veure el Gist a:
https://gist.github.com/laracasts/52a9f085408605a06400
O descarregar-lo amb:
$ wget https://gist.githubusercontent.com/laracasts/52a9f085408605a06400/raw/693215b5c6943d786da1ef75d3f5322c2ffd8367/Gulpfile.js
Ara només cal executar Gulp en una terminal:
$ gulp
Si ho deixeu en execució aniran apareixen les notificacions cada cop que guardeu un fitxer i per veure el resultat ho podeu fer a la terminal on heu executat Gulp. Recursos
ex - example skeleton let - example set up letgo - example tear down sb - shouldBe sbc - shouldBeCalled sbet - shouldBeEqualTo sbi - shouldBeAnInstanceOf sbl - shouldBeLike se - shouldEqual shbc - shouldHaveBeenCalled sht - shouldHaveType si - shouldImplement snb - shouldNotBe snbc - shouldNotBeCalled snbet - shouldNotBeEqualTo snbi - shouldNotBeInstanceOf snbl - shouldNotBeLike sne - shouldNotEqual snhbc - shouldNotHaveBeenCalled snr - shouldNotReturn sr - shouldReturn st - shouldThrow wr - willReturn wt - willThrow
Podeu instal·lar unes ajudes per a la creació de codi PHPSpec (S'utilitzen els live templates amb Ctrl+j) fent un
File -> Import Settings
Del fitxer:
http://kacper.gunia.me/resources/live-templates-settings.jar
o
http://acacha.org/~sergi/live-templates-settings.jar
Recursos:
Utilitzant vfsStream:
https://laracasts.com/lessons/testing-with-virtual-file-systems
Per facilitar les ajudes de la IDE o altres mètodes d' autocompletion en els specs es pot utilitzar l'anotació @mixin
use PhpSpec\ObjectBehavior; /** * @mixin User */ class UserSpec extends ObjectBehavior { }
Cal tenir en compte que PHPSpec és BDD (Behavior-driven_development) ([1] i vegeu també Testing) és a dir que primer es descriu (vegeu comanda describe) el comportament d'una classe i després s'escriu el codi de forma que si es segueix estrictament aquest procediment no pot quedar cap part de la classe per provar.
A l'hora de la veritat sempre pot ser que es trenqui el procediment en algun moment o que realitzem los tests PHPSpec a posteriori i per tant pot anar bé alguna eina que realitzi un report de quantes línies de codi són testejades respecte al total de forma que podem tenir una eina de la cobertura dels nostres tests.
Recursos
https://laracasts.com/series/phpunit-testing-in-laravel/episodes/13
Llibreria que incorpora PHPSpec per tal de realitzar Stubbing i Mocking. Vegeu l'article sobre Testing i concretament l'apartat Test doubles.