IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

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".

Introducció

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

Quan utilitzar PHPSpec i quan no?

  • PHPSpec should be used for true unit tests. This means you will have to mock all of your dependencies. It should not be used for things like controller testing. (

https://laracasts.com/lessons/phpspec-laravel-and-refactoring)

  • Behat is for acceptance/functional tests.
  • PHPUnit can be used for both unit tests and integration tests.
  • Codeception is another tool that can be used for acceptance/functional tests instead of Behat.

Recursos:

Presentacions i tutorials

Recursos:

Configuració

phpspec.yml

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

Usage

Exemple amb Gilded Rose

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:


Constructors (let) i destructors (let go)

Laravel

Com utilitzar PHPspec amb Laravel:

https://laracasts.com/lessons/phpspec-laravel-and-refactoring

PHPStorm

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

File watcher:

Live templates:

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:

Filesystem mocking

Utilitzant vfsStream:

https://laracasts.com/lessons/testing-with-virtual-file-systems

Autocompletion

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 {
 
 
}

Coverage

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.

phpspec-code-coverage

Recursos

Prophecy

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.

Vegeu també

Enllaços externs