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
Le code source romanToNumber.php et romanToNumberTest.php