Commencer avec le TDDEric HoguePHP Québec - 2013-06-06
Test Driven Development
Où Commencer?
Les tests unitairesTest automatisé qui exerce une seule unitéde code
Outils● PHPUnit● SimpleTest● atoum● PHPT
PHPUnitFactorialTest.php<?phpclass FactorialTest extendsPHPUnit_Framework_TestCase {}
public function testSomething() {}/** @test */public function somethingElse() {}
Les assertions● $this->assertTrue();● $this->assertEquals();● $this->assertSame();● $this->assertContains();● $this->asser...
Préparation des testssetup() -> Avant chaque testteardown() -> Après chaque test
phpunit.xml<phpunit bootstrap="bootstrap.php"colors="true"strict="true"verbose="true">...</phpunit>
Le TDDnyuhuhuuhttp://www.flickr.com/photos/nyuhuhuu/4442144329/
Red - Green - RefactorRougeUn test qui échoue
Red - Green - RefactorVertFaire passer le test
Red - Green - RefactorRefactorArranger le code
/** @test */public function create() {$this->assertNotNull(new Factorial);}
class Factorial {}
/** @test */public function factOf1() {$facto = new Factorial;$this->assertSame(1, $facto->fact(1));}
public function fact($number) {return 1;}
Duplicationpublic function create() {$this->assertNotNull(new Factorial);}public function factOf1() {$facto = new Factoria...
public function setup() {$this->facto = new Factorial;}/** @test */public function factOf1() {$this->assertSame(1, $this->...
/** @test */public function factOf2() {$this->assertSame(2, $this->facto->fact(2));}
public function fact($number) {return $number;}
Encore de la duplication/** @test */public function factOf1() {$this->assertSame(1, $this->facto->fact(1));}/** @test */pu...
public function factDataProvider() {return array(array(1, 1),array(2, 2),);}
/*** @test* @dataProvider factDataProvider*/public function factorial($number, $expected) {$result = $this->facto->fact($n...
array(3, 6,),
array(3, 6,),public function fact($number) {if ($number < 2) return 1;return $number * $this->fact($number - 1);}
Les 3 lois du TDD selon Uncle Bob● Ne jamais écrire du code de production saufpour faire passer un test unitaire qui échou...
Les 3 lois du TDD selon Uncle Bob● Ne jamais écrire du code de production saufpour faire passer un test unitaire qui échou...
Les 3 lois du TDD selon Uncle Bob● Ne jamais écrire du code de production saufpour faire passer un test unitaire qui échou...
Beaucoupde travail
Photo: Adam Melanconhttp://www.flickr.com/photos/melancon/348974082/
Les dépendancesZhent_http://www.flickr.com/photos/zhent/574472488/in/faves-96579472@N07/
Les fichiersRyan Vettesehttp://www.flickr.com/photos/rvettese/383453435/
vfsStreamSystème de fichier virtuelcomposer.json"require-dev": {"mikey179/vfsStream": "*"},
Vérifier la création dun répertoire$root = vfsStream::setup(dir);$parentDir = $root->url(dir);//Code qui créer un sous rép...
Lire un fichier$struct = array(subDir => array(test.txt => contenu));$root = vfsStream::setup(root, null, $struct);$parent...
La base de donnéesshindoversehttp://www.flickr.com/photos/shindotv/3835363999/
Les MocksPermet de remplacer une dépendance● PHPUnit mocks● Mockery● Phake
Création$mock = $this->getMock(NamespaceClasse);
Création$mock = $this->getMock(NamespaceClasse);Ou$mock =$this->getMockBuilder(NamespaceClasse)->disableOriginalConstructo...
$mock->expect($this->once())->method(nomMéthode)
$mock->expect($this->once())->method(nomMéthode)->with(1, aa, $this->anything())
$mock->expect($this->once())->method(nomMéthode)->with(1, aa, $this->anything())->will($this->returnValue(10));
PDO$statement = $this->getMockBuilder(PDOStatement)->getMock();$statement->expects($this->once())->method(execute)->will($...
$pdo = $this->getMockBuilder(stdClass)->disableOriginalConstructor()->setMethods(array(prepare))->getMock();$pdo->expects(...
Pour utiliser PDO$this->getMockBuilder(PDO)
class PDOMock extends PDO {public function __construct() {}}$pdo = $this->getMockBuilder(PDOMock)->getMock();
mysql_*Eliot Phillipshttp://www.flickr.com/photos/hackaday/5553713944/
Lextension DbUnitextendsPHPUnit_Extensions_Database_TestCasepublic function getConnection() {$pdo = new PDO(sqlite::memory...
public function getDataSet() {return $this->createFlatXMLDataSet(file);}
API
● Mettre tous les appels HTTP dans uneclasse○ ZendHttp○ Simple classe qui appel curl● Faire un mock de cette classe○ Retou...
Avantages - Inconvénients
Avantages du TDD● Moins de régression
Avantages du TDD● Moins de régression● Plus de confiance
Avantages du TDD● Moins de régression● Plus de confiance● Couplage plus faible
Avantages du TDD● Moins de régression● Plus de confiance● Couplage plus faible● Design plus simple
Inconvénients du TDD● Plus long
“If it doesnt have towork, I can get it done alot faster!”- Kent BeckImprove Ithttp://www.flickr.com/photos/improveit/1573...
Inconvénients du TDD● Plus long● Difficile à vendre aux gestionnaires
Inconvénients du TDD● Plus long● Difficile à vendre aux gestionnaires● Cest difficile
Prochaines étapes?
Continuous Testing
BDD● phpspec● Codeception● Behat○ Mink + Goutte/Selenium
Behat + MinkFeature: Add a new postIn order to post the next meetupAs an admin userI want to add a new event
Scenario: View eventsGiven I am on "/"When I go to "evenement"Then I should see "Commencer avec leTDD"
Intégration Continue
Intégration Continue● Exécute les tests automatiquement○ tests unitaires○ tests dacceptation○ tests de performace○ ...
Intégration Continue● Exécute les tests automatiquement○ tests unitaires○ tests dacceptation○ tests de performace○ ...● Vé...
Intégration Continue● Exécute les tests automatiquement○ tests unitaires○ tests dacceptation○ tests de performace○ ...● Vé...
Damián Navashttp://www.flickr.com/photos/wingedwolf/5471047557/Commentaires:https://joind.in/8740Twitter:@ehogueBlogue:htt...
Upcoming SlideShare
Loading in...5
×

Commencer avec le tdd

7,283

Published on

Le TDD (Test Driven Development) devient de plus en plus populaire. Guider le développement d’une application par les tests est maintenant une pratique acceptée dans plusieurs communautés. Mais démarrer avec le TDD peut être une tâche ardue.

Dans cette présentation, nous allons voir ce qu’est le TDD. En commençant par les principes fondamentaux au TDD. Puis nous verrons quels sont les outils utilisés. Puis comment appliquer ces techniques dans le travail quotidien.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,283
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
12
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "Commencer avec le tdd"

  1. 1. Commencer avec le TDDEric HoguePHP Québec - 2013-06-06
  2. 2. Test Driven Development
  3. 3. Où Commencer?
  4. 4. Les tests unitairesTest automatisé qui exerce une seule unitéde code
  5. 5. Outils● PHPUnit● SimpleTest● atoum● PHPT
  6. 6. PHPUnitFactorialTest.php<?phpclass FactorialTest extendsPHPUnit_Framework_TestCase {}
  7. 7. public function testSomething() {}/** @test */public function somethingElse() {}
  8. 8. Les assertions● $this->assertTrue();● $this->assertEquals();● $this->assertSame();● $this->assertContains();● $this->assertNull();● $this->assertRegExp();● ...
  9. 9. Préparation des testssetup() -> Avant chaque testteardown() -> Après chaque test
  10. 10. phpunit.xml<phpunit bootstrap="bootstrap.php"colors="true"strict="true"verbose="true">...</phpunit>
  11. 11. Le TDDnyuhuhuuhttp://www.flickr.com/photos/nyuhuhuu/4442144329/
  12. 12. Red - Green - RefactorRougeUn test qui échoue
  13. 13. Red - Green - RefactorVertFaire passer le test
  14. 14. Red - Green - RefactorRefactorArranger le code
  15. 15. /** @test */public function create() {$this->assertNotNull(new Factorial);}
  16. 16. class Factorial {}
  17. 17. /** @test */public function factOf1() {$facto = new Factorial;$this->assertSame(1, $facto->fact(1));}
  18. 18. public function fact($number) {return 1;}
  19. 19. Duplicationpublic function create() {$this->assertNotNull(new Factorial);}public function factOf1() {$facto = new Factorial;...
  20. 20. public function setup() {$this->facto = new Factorial;}/** @test */public function factOf1() {$this->assertSame(1, $this->facto->fact(1));}
  21. 21. /** @test */public function factOf2() {$this->assertSame(2, $this->facto->fact(2));}
  22. 22. public function fact($number) {return $number;}
  23. 23. Encore de la duplication/** @test */public function factOf1() {$this->assertSame(1, $this->facto->fact(1));}/** @test */public function factOf2() {$this->assertSame(2, $this->facto->fact(2));}
  24. 24. public function factDataProvider() {return array(array(1, 1),array(2, 2),);}
  25. 25. /*** @test* @dataProvider factDataProvider*/public function factorial($number, $expected) {$result = $this->facto->fact($number);$this->assertSame($expected, $result);}
  26. 26. array(3, 6,),
  27. 27. array(3, 6,),public function fact($number) {if ($number < 2) return 1;return $number * $this->fact($number - 1);}
  28. 28. Les 3 lois du TDD selon Uncle Bob● Ne jamais écrire du code de production saufpour faire passer un test unitaire qui échouehttp://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd
  29. 29. Les 3 lois du TDD selon Uncle Bob● Ne jamais écrire du code de production saufpour faire passer un test unitaire qui échoue● Ne pas écrire plus de test que nécéssairepour avoir un échec○ une erreur de compilation est un échechttp://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd
  30. 30. Les 3 lois du TDD selon Uncle Bob● Ne jamais écrire du code de production saufpour faire passer un test unitaire qui échoue● Ne pas écrire plus de test que nécéssairepour avoir un échec○ une erreur de compilation est un échec● Ne pas écrire plus de code de productionque nécéssaire pour faire passer le testunitairehttp://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd
  31. 31. Beaucoupde travail
  32. 32. Photo: Adam Melanconhttp://www.flickr.com/photos/melancon/348974082/
  33. 33. Les dépendancesZhent_http://www.flickr.com/photos/zhent/574472488/in/faves-96579472@N07/
  34. 34. Les fichiersRyan Vettesehttp://www.flickr.com/photos/rvettese/383453435/
  35. 35. vfsStreamSystème de fichier virtuelcomposer.json"require-dev": {"mikey179/vfsStream": "*"},
  36. 36. Vérifier la création dun répertoire$root = vfsStream::setup(dir);$parentDir = $root->url(dir);//Code qui créer un sous répertoire$this->createDir($parentDir, test);$this->assertTrue($root->hasChild(test));
  37. 37. Lire un fichier$struct = array(subDir => array(test.txt => contenu));$root = vfsStream::setup(root, null, $struct);$parentDir = $root->url(root);$content = file_get_contents($parentDir ./subDir/test.txt);$this->assertSame(contenu , $content);
  38. 38. La base de donnéesshindoversehttp://www.flickr.com/photos/shindotv/3835363999/
  39. 39. Les MocksPermet de remplacer une dépendance● PHPUnit mocks● Mockery● Phake
  40. 40. Création$mock = $this->getMock(NamespaceClasse);
  41. 41. Création$mock = $this->getMock(NamespaceClasse);Ou$mock =$this->getMockBuilder(NamespaceClasse)->disableOriginalConstructor()->getMock();
  42. 42. $mock->expect($this->once())->method(nomMéthode)
  43. 43. $mock->expect($this->once())->method(nomMéthode)->with(1, aa, $this->anything())
  44. 44. $mock->expect($this->once())->method(nomMéthode)->with(1, aa, $this->anything())->will($this->returnValue(10));
  45. 45. PDO$statement = $this->getMockBuilder(PDOStatement)->getMock();$statement->expects($this->once())->method(execute)->will($this->returnValue(true));$statement->expects($this->once())->method(fetchAll)->will($this->returnValue(array(array(id =>123, name => Eric Hogue))));
  46. 46. $pdo = $this->getMockBuilder(stdClass)->disableOriginalConstructor()->setMethods(array(prepare))->getMock();$pdo->expects($this->once())->method(prepare)->will($this->returnValue($statement));
  47. 47. Pour utiliser PDO$this->getMockBuilder(PDO)
  48. 48. class PDOMock extends PDO {public function __construct() {}}$pdo = $this->getMockBuilder(PDOMock)->getMock();
  49. 49. mysql_*Eliot Phillipshttp://www.flickr.com/photos/hackaday/5553713944/
  50. 50. Lextension DbUnitextendsPHPUnit_Extensions_Database_TestCasepublic function getConnection() {$pdo = new PDO(sqlite::memory:);return $this->createDefaultDBConnection($pdo, :memory:);}
  51. 51. public function getDataSet() {return $this->createFlatXMLDataSet(file);}
  52. 52. API
  53. 53. ● Mettre tous les appels HTTP dans uneclasse○ ZendHttp○ Simple classe qui appel curl● Faire un mock de cette classe○ Retourne le xml/json voulu
  54. 54. Avantages - Inconvénients
  55. 55. Avantages du TDD● Moins de régression
  56. 56. Avantages du TDD● Moins de régression● Plus de confiance
  57. 57. Avantages du TDD● Moins de régression● Plus de confiance● Couplage plus faible
  58. 58. Avantages du TDD● Moins de régression● Plus de confiance● Couplage plus faible● Design plus simple
  59. 59. Inconvénients du TDD● Plus long
  60. 60. “If it doesnt have towork, I can get it done alot faster!”- Kent BeckImprove Ithttp://www.flickr.com/photos/improveit/1573943815/
  61. 61. Inconvénients du TDD● Plus long● Difficile à vendre aux gestionnaires
  62. 62. Inconvénients du TDD● Plus long● Difficile à vendre aux gestionnaires● Cest difficile
  63. 63. Prochaines étapes?
  64. 64. Continuous Testing
  65. 65. BDD● phpspec● Codeception● Behat○ Mink + Goutte/Selenium
  66. 66. Behat + MinkFeature: Add a new postIn order to post the next meetupAs an admin userI want to add a new event
  67. 67. Scenario: View eventsGiven I am on "/"When I go to "evenement"Then I should see "Commencer avec leTDD"
  68. 68. Intégration Continue
  69. 69. Intégration Continue● Exécute les tests automatiquement○ tests unitaires○ tests dacceptation○ tests de performace○ ...
  70. 70. Intégration Continue● Exécute les tests automatiquement○ tests unitaires○ tests dacceptation○ tests de performace○ ...● Vérifie que les standards sont respectés○ phpcs
  71. 71. Intégration Continue● Exécute les tests automatiquement○ tests unitaires○ tests dacceptation○ tests de performace○ ...● Vérifie que les standards sont respectés○ phpcs● Détecte des "code smells"○ phploc○ phpcpd○ PHP Depend○ PHP Mess Detector
  72. 72. Damián Navashttp://www.flickr.com/photos/wingedwolf/5471047557/Commentaires:https://joind.in/8740Twitter:@ehogueBlogue:http://erichogue.ca/Questions
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×