Nette Documentation Preview

syntax
Começando com o Tester
**********************

<div class=perex>

Mesmo os bons programadores cometem erros. A diferença entre um bom programador e um mau programador é que o bom só o fará uma vez e da próxima vez o detectará usando testes automatizados.

- "Aquele que não testa está condenado a repetir seus próprios erros". (provérbio sábio)
- "Quando nos livramos de um erro, aparece outro". (Lei de Murphy)
- "Sempre que você se sentir tentado a imprimir uma declaração, escreva-a como um teste". (Martin Fowler)

</div>

Você já escreveu o seguinte código em PHP?

```php
$obj = new MyClass;
$result = $obj->process($input);

var_dump($result);
```

Então, alguma vez você já deixou uma chamada de função só para verificar a olho se ela retorna o que deveria retornar? Você certamente o faz muitas vezes por dia. Com a mão no coração, se tudo funcionar, você apaga este código e espera que a classe não seja quebrada no futuro? A Lei de Murphy garante o oposto :-)

Na verdade, você escreveu o teste. Precisa de pequenas modificações para não exigir nossa inspeção, simplesmente para poder verificar a si mesmo. E se você não o apagasse, poderíamos executá-lo a qualquer momento no futuro para verificar se tudo ainda funciona como deveria. Você pode criar uma grande quantidade destes testes ao longo do tempo, então seria bom se pudéssemos executá-los automaticamente.

E o Nette Tester ajuda exatamente com isso.


O que torna o testador único? .[#toc-what-makes-tester-unique]
==============================================================

Os testes de escrita para Nette Tester são únicos, pois ** cada teste é um script PHP padrão que pode ser executado de forma autônoma.**

Assim, quando você escreve um teste, você pode simplesmente executá-lo para ver se há um erro de programação. Se ele funcionar corretamente. Caso contrário, você pode passar facilmente pelo programa em sua IDE e procurar por um bug. Você pode até mesmo abri-lo em um navegador.

E o mais importante - ao executá-lo, você realizará o teste. Você descobrirá imediatamente se ele passou ou não. Como? Vamos aparecer aqui. Vamos escrever um teste trivial para usar o array PHP e salvá-lo no arquivo `ArrayTest.php`:

```php .{file:ArrayTest.php}
<?php
use Tester\Assert;

require __DIR__ . '/vendor/autoload.php';  # load Composer autoloader
Tester\Environment::setup();               # initialization of Nette Tester

$stack = [];
Assert::same(0, count($stack));   # we expect count() to return zero

$stack[] = 'foo';
Assert::same(1, count($stack));   # we expect count() to return one
Assert::contains('foo', $stack);  # verify that the $stack contains the item 'foo'
```

Como você pode ver, [métodos de afirmação |Assertions] como `Assert::same()` são usados para afirmar que um valor real corresponde a um valor esperado.

O teste é escrito, podemos executá-lo a partir da linha de comando. A primeira execução revelará quaisquer erros de sintaxe, e se você não fez um erro de digitação, você vai ver:

/--pre .[terminal]
$ php ArrayTest.php

<span style="color:#FFF; background-color:#090">OK</span>
\--

Tente mudar a declaração para `Assert::contains('XXX', $stack);` no teste e veja o que acontece quando é executado:

/--pre .[terminal]
$ php ArrayTest.php

<span style="color: #FFF">Failed: </span><span style="color: #FF0">['foo']</span><span style="color: #FFF"> should contain </span><span style="color: #FF0">'XXX'</span>

<span style="color: #CCC">in </span><span style="color: #FFF">ArrayTest.php(17)</span><span style="color: #808080"> Assert::contains('XXX', $stack);</span>

<span style="color: #FFF; background-color: #900">FAILURE</span>
\--

Continuamos a escrever no capítulo [Testes de Escrita |Writing Tests].


Instalação e requisitos .[#toc-installation-and-requirements]
=============================================================

A versão mínima exigida pelo Tester é 7.1 (para mais detalhes, veja a tabela de [versões em PHP suportadas |#supported PHP versions] ). A forma preferida de instalação é por [Composer |best-practices:composer]:

/--pre .[terminal]
composer require --dev nette/tester
\--

Tente executar o Nette Tester a partir da linha de comando (sem nenhum argumento, ele mostrará apenas um resumo da ajuda):

/--pre .[terminal]
vendor/bin/tester
\--


Testes em andamento .[#toc-running-tests]
=========================================

À medida que nossa aplicação cresce, uma série de testes cresce com ela. Não seria prático realizar testes um a um. Portanto, o Tester tem um testador em série, que nós invocamos da linha de comando. O parâmetro é o diretório no qual os testes estão localizados. O ponto indica o diretório atual.

/--pre .[terminal]
vendor/bin/tester .
\--

O corredor do Nette Tester procura no diretório especificado e em todos os subdiretórios e procura por testes, que são arquivos `*.phpt` e `*Test.php`. Ele também encontrará nosso teste `ArrayTest.php`, pois ele combina com a máscara.

Em seguida, começa os testes. Ele executa cada teste como um novo processo PHP, de modo que ele corre completamente isolado dos outros. Ele roda em paralelo em vários fios, tornando-o extremamente rápido. E primeiro executa testes que falharam durante a execução anterior, assim você saberá imediatamente se corrigiu o erro.

Para cada teste feito, o corredor imprime um caractere para indicar o progresso:

- <code style="color: #CCC; background-color: #000">.</code> - teste aprovado
- <code style="color: #CCC; background-color: #000">s</code> - o teste foi pulado
- <code style="color: #FFF; background-color: #900">F</code> - teste falhou

A saída pode ser assim:

/--pre .[terminal]
 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

Note: No php.ini is used.
PHP 8.3.2 (cli) | php -n | 8 threads

........s................<span style="color: #FFF; background-color: #900">F</span>.........

<span style="color: #F00">-- FAILED: greeting.phpt</span>
<span style="color: #CCC">   </span><span style="color: #FFF">Failed: </span><span style="color: #FF0">'Hello John'</span><span style="color: #FFF"> should be</span>
<span style="color: #FFF">       ... </span><span style="color: #FF0">'Hello Peter'</span>

<span style="color: #CCC">   in </span><span style="color: #FFF">greeting.phpt(19)</span><span style="color: #808080"> Assert::same('Hello Peter', $o->say('John'));</span>

<span style="color: #FFF; background-color: #900">FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)</span>
\--

Foram realizados 35 testes, um falhou, outro foi pulado.

Continuamos no capítulo [Testes em andamento |Running tests].


Modo de relógio .[#toc-watch-mode]
==================================

Você está refatorando o código? Ou você está mesmo desenvolvendo de acordo com a metodologia TDD (Test Driven Development)? Então você vai gostar do modo relógio. O Tester monitora os códigos fonte e executa-se a si mesmo quando é alterado.

Durante o desenvolvimento, você tem um terminal no canto do monitor, onde a barra de status verde acende em você, e quando de repente fica vermelha, você sabe que acabou de fazer algo indesejado. Na verdade, é um grande jogo onde você programa e tenta se manter fiel à cor.

O modo de relógio é iniciado usando o parâmetro [--watch |running-tests#w-watch-path].


Relatórios de Cobertura de Código .[#toc-codecoverage-reports]
==============================================================

O Tester pode gerar relatórios com uma visão geral de quanto o código fonte os testes cobrem. O relatório pode ser em formato HTML legível por humanos ou em XML Clover para processamento posterior na máquina.

Veja o "relatório HTML de amostra":https://files.nette.org/tester/coverage.html com cobertura de código.


Versões PHP suportadas .[#toc-supported-php-versions]
=====================================================

| versão | compatível com PHP
|------------------|-------------------
| Tester 2.5       | PHP 8.0 – 8.3
| Tester 2.4 | PHP 7.2 - 8.2
| Tester 2.3 | PHP 7.1 - 8.0
| Tester 2.1 - 2.2 | PHP 7.1 - 7.3
| Tester 2.0 | PHP 5.6 - 7.3
| Tester 1.7 | PHP 5.3 - 7.3 + HHVM 3.3+
| Tester 1.6 | PHP 5.3 - 7.0 + HHVM
| Tester 1.3 - 1.5 | PHP 5.3 - 5.6 + HHVM
| Tester 0,9 - 1,2 | PHP 5,3 - 5,6

Aplica-se às últimas versões de remendos.

Até a versão 1.7 Tester suportada [HHVM |https://hhvm.com] 3.3.0 ou mais recente (usando `tester -p hhvm`). O suporte foi abandonado desde o Tester 2.0. O uso era simples:

Começando com o Tester

Mesmo os bons programadores cometem erros. A diferença entre um bom programador e um mau programador é que o bom só o fará uma vez e da próxima vez o detectará usando testes automatizados.

  • „Aquele que não testa está condenado a repetir seus próprios erros“. (provérbio sábio)
  • „Quando nos livramos de um erro, aparece outro“. (Lei de Murphy)
  • „Sempre que você se sentir tentado a imprimir uma declaração, escreva-a como um teste“. (Martin Fowler)

Você já escreveu o seguinte código em PHP?

$obj = new MyClass;
$result = $obj->process($input);

var_dump($result);

Então, alguma vez você já deixou uma chamada de função só para verificar a olho se ela retorna o que deveria retornar? Você certamente o faz muitas vezes por dia. Com a mão no coração, se tudo funcionar, você apaga este código e espera que a classe não seja quebrada no futuro? A Lei de Murphy garante o oposto :-)

Na verdade, você escreveu o teste. Precisa de pequenas modificações para não exigir nossa inspeção, simplesmente para poder verificar a si mesmo. E se você não o apagasse, poderíamos executá-lo a qualquer momento no futuro para verificar se tudo ainda funciona como deveria. Você pode criar uma grande quantidade destes testes ao longo do tempo, então seria bom se pudéssemos executá-los automaticamente.

E o Nette Tester ajuda exatamente com isso.

O que torna o testador único?

Os testes de escrita para Nette Tester são únicos, pois ** cada teste é um script PHP padrão que pode ser executado de forma autônoma.**

Assim, quando você escreve um teste, você pode simplesmente executá-lo para ver se há um erro de programação. Se ele funcionar corretamente. Caso contrário, você pode passar facilmente pelo programa em sua IDE e procurar por um bug. Você pode até mesmo abri-lo em um navegador.

E o mais importante – ao executá-lo, você realizará o teste. Você descobrirá imediatamente se ele passou ou não. Como? Vamos aparecer aqui. Vamos escrever um teste trivial para usar o array PHP e salvá-lo no arquivo ArrayTest.php:

<?php
use Tester\Assert;

require __DIR__ . '/vendor/autoload.php';  # load Composer autoloader
Tester\Environment::setup();               # initialization of Nette Tester

$stack = [];
Assert::same(0, count($stack));   # we expect count() to return zero

$stack[] = 'foo';
Assert::same(1, count($stack));   # we expect count() to return one
Assert::contains('foo', $stack);  # verify that the $stack contains the item 'foo'

Como você pode ver, métodos de afirmação como Assert::same() são usados para afirmar que um valor real corresponde a um valor esperado.

O teste é escrito, podemos executá-lo a partir da linha de comando. A primeira execução revelará quaisquer erros de sintaxe, e se você não fez um erro de digitação, você vai ver:

$ php ArrayTest.php

OK

Tente mudar a declaração para Assert::contains('XXX', $stack); no teste e veja o que acontece quando é executado:

$ php ArrayTest.php

Failed: ['foo'] should contain 'XXX'

in ArrayTest.php(17) Assert::contains('XXX', $stack);

FAILURE

Continuamos a escrever no capítulo Testes de Escrita.

Instalação e requisitos

A versão mínima exigida pelo Tester é 7.1 (para mais detalhes, veja a tabela de versões em PHP suportadas ). A forma preferida de instalação é por Composer:

composer require --dev nette/tester

Tente executar o Nette Tester a partir da linha de comando (sem nenhum argumento, ele mostrará apenas um resumo da ajuda):

vendor/bin/tester

Testes em andamento

À medida que nossa aplicação cresce, uma série de testes cresce com ela. Não seria prático realizar testes um a um. Portanto, o Tester tem um testador em série, que nós invocamos da linha de comando. O parâmetro é o diretório no qual os testes estão localizados. O ponto indica o diretório atual.

vendor/bin/tester .

O corredor do Nette Tester procura no diretório especificado e em todos os subdiretórios e procura por testes, que são arquivos *.phpt e *Test.php. Ele também encontrará nosso teste ArrayTest.php, pois ele combina com a máscara.

Em seguida, começa os testes. Ele executa cada teste como um novo processo PHP, de modo que ele corre completamente isolado dos outros. Ele roda em paralelo em vários fios, tornando-o extremamente rápido. E primeiro executa testes que falharam durante a execução anterior, assim você saberá imediatamente se corrigiu o erro.

Para cada teste feito, o corredor imprime um caractere para indicar o progresso:

  • . – teste aprovado
  • s – o teste foi pulado
  • F – teste falhou

A saída pode ser assim:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

Note: No php.ini is used.
PHP 8.3.2 (cli) | php -n | 8 threads

........s................F.........

-- FAILED: greeting.phpt
   Failed: 'Hello John' should be
       ... 'Hello Peter'

   in greeting.phpt(19) Assert::same('Hello Peter', $o->say('John'));

FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)

Foram realizados 35 testes, um falhou, outro foi pulado.

Continuamos no capítulo Testes em andamento.

Modo de relógio

Você está refatorando o código? Ou você está mesmo desenvolvendo de acordo com a metodologia TDD (Test Driven Development)? Então você vai gostar do modo relógio. O Tester monitora os códigos fonte e executa-se a si mesmo quando é alterado.

Durante o desenvolvimento, você tem um terminal no canto do monitor, onde a barra de status verde acende em você, e quando de repente fica vermelha, você sabe que acabou de fazer algo indesejado. Na verdade, é um grande jogo onde você programa e tenta se manter fiel à cor.

O modo de relógio é iniciado usando o parâmetro –watch.

Relatórios de Cobertura de Código

O Tester pode gerar relatórios com uma visão geral de quanto o código fonte os testes cobrem. O relatório pode ser em formato HTML legível por humanos ou em XML Clover para processamento posterior na máquina.

Veja o relatório HTML de amostra com cobertura de código.

Versões PHP suportadas

versão compatível com PHP
Tester 2.5 PHP 8.0 – 8.3
Tester 2.4 PHP 7.2 – 8.2
Tester 2.3 PHP 7.1 – 8.0
Tester 2.1 – 2.2 PHP 7.1 – 7.3
Tester 2.0 PHP 5.6 – 7.3
Tester 1.7 PHP 5.3 – 7.3 + HHVM 3.3+
Tester 1.6 PHP 5.3 – 7.0 + HHVM
Tester 1.3 – 1.5 PHP 5.3 – 5.6 + HHVM
Tester 0,9 – 1,2 PHP 5,3 – 5,6

Aplica-se às últimas versões de remendos.

Até a versão 1.7 Tester suportada HHVM 3.3.0 ou mais recente (usando tester -p hhvm). O suporte foi abandonado desde o Tester 2.0. O uso era simples: