Raggruppamento di test

PHP unit testing tutorial - Grouping together unit tests and examples of writing test cases

Il prossimo passo sarà quello di riempire dei vuoti e create una test suite.

# another Aggiungere un test

Aggiungere un nuovo test è facile esattamente come aggiungere un metodo al test case: class TestOfLogging extends UnitTestCase { function testCreatingNewFile() { @unlink('../temp/test.log'); $log = new Log('../temp/test.log'); $this->assertFalse(file_exists('../temp/test.log'), 'Created before message'); $log->message('Should write this to a file'); $this->assertTrue(file_exists('../temp/test.log'), 'File created');<strong> @unlink('../temp/test.log');</strong> } <strong> function testSecondMessageIsAppended() { @unlink('../temp/test.log'); $log = new Log('../temp/test.log'); $log->message('Test line 1'); $messages = file('../temp/test.log'); $this->assertPattern('/Test line 1/', $messages[0]); $log->message('Test line 2'); $messages = file('../temp/test.log'); $this->assertPattern('/Test line 2/', $messages[1]); @unlink('../temp/test.log'); }</strong> } Il metodo `assertPattern()` del test case utilizza un'espressione regolare in stile Perl per verificare la corrispondenza di stringhe.

Tutto quel che si sta facendo in questo metodo è scrivere una riga in un file per poi rileggerla, per due volte. Vogliamo semplicemente verificare che il logger accodi il testo piuttosto che sovrascrivere il vecchio file.

In effetti lo unit test passa senza problemi:

# Log class test

1/1 test cases complete. 4 passes, 0 fails and 0 exceptions. Il problema è che abbiamo molta ridondanza: dobbiamo cancellare il file di test prima e dopo ogni collaudo.

Plagiando spudoratamente JUnit, Simpletest provvede i metodi `setUp()` e `tearDown()`, che vengono eseguiti rispettivamente prima e dopo ogni test. La cancellazione di file è un'operazione comune a tutti i test e pertanto dovremmo spostarla in questi metodi.

I nostri test sono verdi, quindi possiamo procedere al refactoring: class TestOfLogging extends UnitTestCase { <strong> function setUp() { @unlink('../temp/test.log'); } function tearDown() { @unlink('../temp/test.log'); } </strong> function testCreatingNewFile() { $log = new Log('../temp/test.log'); $this->assertFalse(file_exists('../temp/test.log'), 'Created before message'); $log->message('Should write this to a file'); $this->assertTrue(file_exists('../temp/test.log'), 'File created'); } <strong> function testSecondMessageIsAppended() { $log = new Log('../temp/test.log'); $log->message('Test line 1'); $messages = file('../temp/test.log'); $this->assertPattern('/Test line 1/', $messages[0]); $log->message('Test line 2'); $messages = file('../temp/test.log'); $this->assertPattern('/Test line 2/', $messages[1]); } </strong> } I test restano verdi. Possiamo aggiungere metodi non-test al test case fintanto che i loro nomi non cominciano con la stringa "test". Solo i metodi i cui nomi iniziano per "test" vengono eseguiti. Ciò permette un ulteriore refactoring: class TestOfLogging extends UnitTestCase { function setUp() { @unlink('../temp/test.log'); } function tearDown() { @unlink('../temp/test.log'); } <strong> function getFileLine($filename, $index) { $messages = file($filename); return $messages[$index]; } </strong> function testCreatingNewFile() { $log = new Log('../temp/test.log'); $this->assertFalse(file_exists('../temp/test.log'), 'Created before message'); $log->message('Should write this to a file'); $this->assertTrue(file_exists('../temp/test.log'), 'File created'); } function testSecondMessageIsAppended() { $log = new Log('../temp/test.log'); $log->message('Test line 1');<strong> $this->assertPattern('/Test line 1/', $this->getFileLine('../temp/test.log', 0));</strong> $log->message('Test line 2');<strong> $this->assertPattern('/Test line 2/', $this->getFileLine('../temp/test.log', 1));</strong> } } La scelta tra la prima versione e la seconda è una pura questione di gusti. C'è un po' di codice in più, ma la logica del test è più chiara.

# suite A test suite

Un test case non funzionerà da solo per molto tempo. Quando si sviluppa del codice reale normalmente si vorranno eseguire molti test più rapidamente e più spesso possibile. Questo comporta la necessità di raggruppare insieme più test in test suite che possano facilmente includere tutti i test dell'applicazione.

Per prima cosa, creiamo una test suite chiamata all_tests.php nella directory tests: <?php require_once(dirname(__FILE__) . '/simpletest/autorun.php'); <strong>require_once('log_test.php'); class AllTests extends TestSuite { function __construct() { parent::__construct(); $this->addTest(new TestOfLogging()); } } ?></strong> Difficilmente si noteranno differenze, finché le cose funzionano:

# All tests

1/1 test cases complete. 4 passes and 0 fails. L'aggiunta di ulteriori test è veramente semplice.

Nella prossima pagina li aggiungeremo ancora più rapidamente.

Aggiungere un test al test case ed eseguire il refactoring Il modo più rozzo per raggruppare unit test in test suite.
Next is controlling how the class under test interacts with the rest of the system. Previous is the creation of a first test. You need SimpleTest to run these examples.
software development, php programming, programming in php, test first, software development tools, php tutorial, free php scripts, architecture, php resources, mock objects, junit, php testing, unit test, phpunit, PHP unit testing