2019-04-15 23:45:23 +02:00

2.7 KiB

Roman To Number en PHP et en TDD

Je commence par installer PHP et PHPUnit sur ma machine

sudo apt install php phpunit

J'écris un premier cas de tests simple : I donne 1 (en copiant collant le code example sur phpunit.

Ça donne

<?php
declare(strict_types=1);

use PHPUnit\Framework\TestCase;

final class RomanToNumberTest extends TestCase {

  public function testIDonne1(): void {
    $this->assertEquals('1', romanToNumber('I'));
  }

}

l'execution donne

~/ $ phpunit --testdox romanToNumberTest.php
PHPUnit 5.4.6 by Sebastian Bergmann and contributors.

RomanToNumber
 [ ] I donne 1

ou

~/ $ phpunit romanToNumberTest.php
PHPUnit 5.4.6 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 30 ms, Memory: 4.00MB

There was 1 error:

1) RomanToNumberTest::testIDonne1
Error: Call to undefined function romanToNumber()

/home/yaf/Scopyleft/stage-lepoles/romanToNumber/yannick-php/romanToNumberTest.php:9

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

Un peu plus verbeux, ce dernier affichage est celui par défaut. Il a le mérite d'afficher clairement l'erreur (et non la failure, attention la différence est importante :)).

Ensuite, il faut faire passer au vert au plus vite :

<?php
declare(strict_types=1);

function romanToNumber(string $roman): string {
  return '1';
}

Et ensuite, on écrit le test suivant. Celui qui, par exemple, donne 5 pour V

<?php
declare(strict_types=1);

include 'romanToNumber.php';

use PHPUnit\Framework\TestCase;

final class RomanToNumberTest extends TestCase {

  public function testIDonne1() {
    $this->assertEquals(
      '1',
      romanToNumber('I')
    );
  }

  public function testVDonne5() {
    $this->assertEquals(
      '5',
      romanToNumber('V')
    );
  }

}

L'execution donne :

~/ $ phpunit romanToNumberTest.php
PHPUnit 5.4.6 by Sebastian Bergmann and contributors.

.F                                                                  2 / 2 (100%)

Time: 34 ms, Memory: 4.00MB

There was 1 failure:

1) RomanToNumberTest::testVDonne5
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'5'
+'1'

/home/yaf/Scopyleft/stage-lepoles/romanToNumber/yannick-php/romanToNumberTest.php:20

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.

Et l'évolution la plus rapide pour passer au vert :

<?php
declare(strict_types=1);

function romanToNumber(string $roman): string {
  if ($roman == 'V') {
    return '5';
  }
  return '1';
}

Ensuite, on peut envisager un refactoring... Puis un nouveau test... Et ainsi de suite, jusqu'à pouvoir traduire MCMLXXVII