Visualizzare i risultati

PHP unit testing tutorial - Subclassing the test display

SimpleTest è fornita di default della più semplice interfaccia di visualizzazione. Nella maggior parte dei casi tutto quello che si vorrà sapere è se il test sono passati o sono falliti. Nel caso di fallimento si vorrà conoscere il motivo. Niente di più.

A volte si possono desiderare output più sofisticati perché siano letti da altri stakeholder o per gli acceptance test. Nel caso un display minimale non sia abbastanza, ecco come forgiarsene uno proprio.

# passes I want to see the passes!

Hai proprio necessità di visualizzare anche i successi? Ok, allora ecco come fare.

Si deve estendere la classe di display di default, che nel nostro caso è `HtmlReporter`. La classe `HtmlReporter` è definita nel file simpletest/reporter.php ed ha la seguente interfaccia: class HtmlReporter extends TestDisplay { public __construct() { ... } public void paintHeader(string $test_name) { ... } public void paintFooter(string $test_name) { ... } public void paintStart(string $test_name, $size) { ... } public void paintEnd(string $test_name, $size) { ... } public void paintFail(string $message) { ... } public void paintPass(string $message) { ... } protected string getCss() { ... } public array getTestList() { ... } public integer getPassCount() { ... } public integer getFailCount() { ... } public integer getTestCaseCount() { ... } public integer getTestCaseProgress { ... } } Ecco cosa significano i metodi più importanti. Se sei interessato, trovi qui l'elenco completo dei metodi.

- `__construct()`
  è il costruttore. Nota che è lo unit test ad impostare il collegamento con il display e non viceversa. Il display è un ricevitore passivo di eventi di test. Questo facilita l'utilizzo del display in altri sistemi di test diversi dagli unit test, come i server di monitoraggio. Permette anche allo unit test di scrivere i risultati su pià display contemporaneamente.
- `void paintFail(string $message)`
  disegna una failure. Vedi oltre.
- `void paintPass(string $message)`
  di default non fa niente. Questo è il metodo che modificheremo.
- `string getCss()`
  restituisce lo stile CSS come stringa per il metodo che gestisce l'header della pagina. Gli stili aggiuntivi vengono accodati qui.
- `array getTestList()`
  è un metodo di aiuto per le sottoclassi. Elenca l'attuale annidamento dei test come lista di nomi di test. Il test più profondamente annidato viene riportato per primo e il test correntemente eseguito per ultimo.

Per visualizzare i successi basta fare in modo che il metodo `paintPass()` si comporti come `paintFail()`. Ovviamente non modificheremo il file originale: faremo un subclassing.

# subclass Una sottoclasse di display

Per prima cosa creeremo il file tests/show_passes.php nel progetto e vi piazzeremo questa classe vuota: <strong><?php require_once('simpletest/reporter.php'); class ShowPasses extends HtmlReporter { } ?></strong> Una rapida scorsa al code base di SimpleTest mostra l'implementazione di `paintFail()` che, al momento della stesura di questo documento, appare così: function paintFail($message) { parent::paintFail($message); print "<span class=\"fail\">Fail</span>: "; $breadcrumb = $this->getTestList(); array_shift($breadcrumb); print implode("-&gt;", $breadcrumb); print "-&gt;$message<br />\n"; } Sostanzialmente, invoca la versione della classe padre, operazione che per correttezza dovremmo eseguire anche noi, poi stampa un breadcumb con la posizione calcolata dall'attuale elenco dei test, rimuovendo il livello più alto dei nomi dei test. Dal momento che quest'ultimo sarebbe identico per ogni test, sarebbe un eccesso di informazione. Trasponendo questo codice alla nostra nuova classe: class ShowPasses extends HtmlReporter { <strong> function paintPass($message) { parent::paintPass($message); print "<span class=\"pass\">Pass</span>: "; $breadcrumb = $this->getTestList(); array_shift($breadcrumb); print implode("-&gt;", $breadcrumb); print "-&gt;$message<br />\n"; }</strong> } Per adesso tutto bene. Adesso, utilizziamo la nuova classe per modificare il file tests/all_tests.php. <?php<strong> require_once('show_passes.php'); require_once('simpletest/simpletest.php'); SimpleTest::prefer(new ShowPasses());</strong> require_once('simpletest/autorun.php'); class AllTests extends TestSuite { function __construct() { parent::__construct('All tests'); $this->addFile(dirname(__FILE__).'/log_test.php'); $this->addFile(dirname(__FILE__).'/clock_test.php'); } } ?> Possiamo eseguirlo per vedere i risultati del nostro lavoro:

# All tests

Pass: log_test.php->Log class test->testappendingtofile->Expecting [/Test line 1/] in [Test line 1]
Pass: log_test.php->Log class test->testappendingtofile->Expecting [/Test line 2/] in [Test line 2]
Pass: log_test.php->Log class test->testcreatingnewfile->Created before message
Pass: log_test.php->Log class test->testcreatingnewfile->File created
Pass: clock_test.php->Clock class test->testclockadvance->Advancement
Pass: clock_test.php->Clock class test->testclocktellstime->Now is the right time
3/3 test cases complete. 6 passes and 0 fails. Buono, ma nona ancora perfetto. Abbiamo ancora una formattazione scarsa. Il display non prevede ancora uno stile CSS per `span.pass` ma possiamo facilmente aggiungerla con l'ovrerriding di un ulteriore metodo: class ShowPasses extends HtmlReporter { function paintPass($message) { parent::paintPass($message); print "<span class=\"pass\">Pass</span>: "; $breadcrumb = $this->getTestList(); array_shift($breadcrumb); print implode("-&gt;", $breadcrumb); print "->$message<br />\n"; } <strong> protected function getCss() { return parent::getCss() . ' .pass { color: green; }'; }</strong> } Se stai aggiungendo il codice mentre procedi, potrai vedere lo stile aggiunto nel sorgente delle pagine del risultato dei test nel browser. Il display stesso dovrebbe apparire così:

# All tests

Pass: log_test.php->Log class test->testappendingtofile->Expecting [/Test line 1/] in [Test line 1]
Pass: log_test.php->Log class test->testappendingtofile->Expecting [/Test line 2/] in [Test line 2]
Pass: log_test.php->Log class test->testcreatingnewfile->Created before message
Pass: log_test.php->Log class test->testcreatingnewfile->File created
Pass: clock_test.php->Clock class test->testclockadvance->Advancement
Pass: clock_test.php->Clock class test->testclocktellstime->Now is the right time
3/3 test cases complete. 6 passes and 0 fails. Alcuni preferiscono decisamente vedere i successi nei risultati mentre lavorano sul codice: la sensazione di star lavorando correttamente, dopo tutto, è piacevole. Una volta che dovrai fare lo scroll su e giù per la pagina per trovare le failure scoprirai il lato negativo di questo approccio.

Provali entrambi per decidere quale preferisci. Lasceremo questa modalità attiva per affrontare il prossimo argomento, i oggetti mock Questo è il primo esempio di strumento di test che genera test aggiuntivi e sarà utile per studiare cosa sta accadendo dietro le quinte.

Come modificare il display per mostrare i successi. Fare il subclassing di `HtmlReporter` class.
The previous tutorial section was subclassing the test case. This section is very specific to SimpleTest. If you use another tool you will want to skip this. But you can also move on to Mock Objects.
software development test first, php general programming advice, programming php, software development tools, php tutorial, free php sample code, architecture, sample test cases, php simpletest framework, php resources, php test case examples, phpunit, simpletest, unit test, php testing