<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Untitled Publication]]></title><description><![CDATA[Untitled Publication]]></description><link>https://daniel.lemes.dev</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 09:56:19 GMT</lastBuildDate><atom:link href="https://daniel.lemes.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Introdução aos testes com PHPUnit - parte II]]></title><description><![CDATA[Na primeira parte dessa série mostrei como instalar o PHPUnit, configurar e iniciamos um projeto simples para vermos se tudo funcionou como o esperado. Mostrei algumas convenções que eu considero úteis para o desenvolvimento de testes e no teste most...]]></description><link>https://daniel.lemes.dev/introducao-aos-testes-com-phpunit-parte-ii</link><guid isPermaLink="true">https://daniel.lemes.dev/introducao-aos-testes-com-phpunit-parte-ii</guid><category><![CDATA[PHP]]></category><category><![CDATA[Testing]]></category><category><![CDATA[PHPUnit]]></category><dc:creator><![CDATA[Daniel Lemes]]></dc:creator><pubDate>Sun, 17 Apr 2022 22:37:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/BfrQnKBulYQ/upload/v1650234962036/eRI6_MdAp.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Na <a target="_blank" href="https://daniel.lemes.dev/introducao-aos-testes-com-phpunit-parte-i">primeira parte</a> dessa série mostrei como instalar o PHPUnit, configurar e iniciamos um projeto simples para vermos se tudo funcionou como o esperado. Mostrei algumas convenções que eu considero úteis para o desenvolvimento de testes e no teste mostrei um método que não expliquei o assertEquals.</p>
<h3 id="heading-o-que-e-um-assert">O que é um assert?</h3>
<p>A tradução seria afirmação, em testes de software ele é exatamente isso, são afirmações que queremos fazer, por exemplo, <em>$this-&gt;assertTrue($variavel)</em> queremos afirmar se a variável é verdadeira (True). </p>
<p>Então sempre que temos um assert queremos fazer uma afirmação e o PHPUnit nos traz uma série de asserts prontos para uso, você pode encontrar a lista completa aqui, mas na maior parte dos casos usamos:</p>
<ul>
<li>assertArrayHasKey()</li>
<li>assertEquals() </li>
<li>assertFalse()</li>
<li>assertSame()</li>
<li>assertTrue(). </li>
</ul>
<p>Pelo menos eu nunca usei muito mais que isso.</p>
<p>Para ficar mais claro vamos explicar no nosso exemplo anterior.</p>
<pre><code><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Calculator</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">PHPUnit</span>\<span class="hljs-title">Framework</span>\<span class="hljs-title">TestCase</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CalculatorTest</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">TestCase</span>
</span>{

    <span class="hljs-comment">/**
     * <span class="hljs-doctag">@return</span> void
     * <span class="hljs-doctag">@test</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">it_should_do_a_sum_and_return_the_result</span>(<span class="hljs-params"></span>)
    </span>{
        $sum = <span class="hljs-keyword">new</span> Calculator();
        $result = $sum-&gt;sum(<span class="hljs-number">10</span>,<span class="hljs-number">8.5</span>);
        <span class="hljs-keyword">$this</span>-&gt;assertEquals(<span class="hljs-number">18.5</span>, $result);
    }
}
</code></pre><p>Nós fazemos um assert $this-&gt;assertEquals(18.5, $result), isso seria o equivalente a fazermos um if (18.5 == $result). </p>
<h3 id="heading-asserts">Asserts</h3>
<p>Como eu disse que temos alguns asserts como mais utilizados vou colocar aqui o que cada um deles faz embora o nome diga bastante sobre eles, se você usa alguma IDE com autocomplete ao digitar $this-&gt;assert* vai aparece uma lista com todos os asserts disponíveis.</p>
<ul>
<li>assertArrayHasKey - Verifica se existe uma chave em um array</li>
<li>assertEquals - Verifica se o resultado são iguais</li>
<li>assertFalse - verifica se a expressão é falsa</li>
<li>assertTrue - verifica se a expressão é verdadeira</li>
<li>assertSame - verifica se a expectativa e o resultado atual são iguais ===, ou seja, de mesmo valor e tipo, diferente de assertEquals que compara utilizando == no caso de assertEquals  a string '1' é igual ao inteiro 1, isso não é verdade quando utilizamos assertSame.</li>
</ul>
<p>Vamos criar mais cenários para nossa calculadora, afinal testamos apenas somando inteiro e float.</p>
<pre><code>
<span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Calculator</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">PHPUnit</span>\<span class="hljs-title">Framework</span>\<span class="hljs-title">TestCase</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CalculatorTest</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">TestCase</span>
</span>{

    <span class="hljs-comment">/**
     * <span class="hljs-doctag">@return</span> void
     * <span class="hljs-doctag">@test</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">it_should_do_a_sum_and_return_the_result</span>(<span class="hljs-params"></span>)
    </span>{
        $sum = <span class="hljs-keyword">new</span> Calculator();
        $result = $sum-&gt;sum(<span class="hljs-number">10</span>,<span class="hljs-number">8.5</span>);
        <span class="hljs-keyword">$this</span>-&gt;assertEquals(<span class="hljs-number">18.5</span>, $result);
    }
    <span class="hljs-comment">/**
     * <span class="hljs-doctag">@return</span> void
     * <span class="hljs-doctag">@test</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">it_should_do_a_sum_negative_numbers</span>(<span class="hljs-params"></span>)
    </span>{
        $sum = <span class="hljs-keyword">new</span> Calculator();
        $result = $sum-&gt;sum(<span class="hljs-number">-1</span>, <span class="hljs-number">-10</span>);
        <span class="hljs-keyword">$this</span>-&gt;assertEquals(<span class="hljs-number">-11</span>, $result);
    }
    <span class="hljs-comment">/**
     * <span class="hljs-doctag">@return</span> void
     * <span class="hljs-doctag">@test</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">it_should_do_a_sum_two_float_numbers</span>(<span class="hljs-params"></span>)
    </span>{
        $sum = <span class="hljs-keyword">new</span> Calculator();
        $result = $sum-&gt;sum(<span class="hljs-number">10.5</span>,<span class="hljs-number">8.5</span>);
        <span class="hljs-keyword">$this</span>-&gt;assertEquals(<span class="hljs-number">19</span>, $result);
    }
    <span class="hljs-comment">/**
     * <span class="hljs-doctag">@return</span> void
     * <span class="hljs-doctag">@test</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">it_should_do_a_sum_two_integer_numbers</span>(<span class="hljs-params"></span>)
    </span>{
        $sum = <span class="hljs-keyword">new</span> Calculator();
        $result = $sum-&gt;sum(<span class="hljs-number">10</span>,<span class="hljs-number">8</span>);
        <span class="hljs-keyword">$this</span>-&gt;assertEquals(<span class="hljs-number">18</span>, $result);
    }
}
</code></pre><p>Criamos mais alguns cenários, testamos números negativos, apenas float, apenas inteiros e nossos testes passaram</p>
<p>Vemos que o código repete muitas vezes, estamos apenas variando o valor, isso vai contra algo que talvez já tenhamos ouvido falar <a target="_blank" href="https://pt.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY</a>, ou seja, don't repeat yourself então para nos ajudar o phpunit tem algo que chamamos dataproviders.</p>
<h3 id="heading-dataproviders">DataProviders</h3>
<p>Para utilizarmos dataproviders basta utilizarmos annotations. Annotations nada mais são do que sinalizadores especiais definidos em seus docblocks de método, um exemplo abaixo: </p>
<pre><code><span class="hljs-meta">&lt;?php</span>

<span class="hljs-comment">/**
 * <span class="hljs-doctag">@annotationName</span> Annotation value
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">testFoo</span>(<span class="hljs-params"></span>)
</span>{
    <span class="hljs-comment">//</span>
}
</code></pre><p>Existem muitas <a target="_blank" href="https://phpunit.readthedocs.io/en/9.5/annotations.html">anotações</a> no PHPUnit , mas a que queremos agora é a dataProvider.</p>
<p>PHPUnit define provedores de dados como:</p>
<blockquote>
<p>Um método de teste pode aceitar argumentos arbitrários. Esses argumentos devem ser fornecidos por um método de provedor de dados.</p>
</blockquote>
<p>Em termos gerais um dataProvider fornece uma massa de dados que pode simular vários cenários para seu teste, evitando assim a repetição de código.</p>
<p>Então ao invés de criar vários métodos criamos um método que recebe os parâmetros que queremos passar para o teste.</p>
<p>Utilizando o exemplo anterior vamos mexer na nossa classe de cálculo</p>
<pre><code><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Calculator</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">PHPUnit</span>\<span class="hljs-title">Framework</span>\<span class="hljs-title">TestCase</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CalculatorTest</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">TestCase</span>
</span>{

    <span class="hljs-comment">/**
     * <span class="hljs-doctag">@dataProvider</span> numbersDataProvider
     * <span class="hljs-doctag">@test</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">it_should_do_a_sum_and_return_the_result</span>(<span class="hljs-params">$number1, $number2, $expected</span>)
    </span>{
        $sum = <span class="hljs-keyword">new</span> Calculator();
        $result = $sum-&gt;sum($number1, $number2);
        <span class="hljs-keyword">$this</span>-&gt;assertEquals($expected, $result);
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">numbersDataProvider</span>(<span class="hljs-params"></span>): <span class="hljs-title">array</span>
    </span>{
        <span class="hljs-keyword">return</span> [
            [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>],
            [<span class="hljs-number">1.5</span>, <span class="hljs-number">10</span>, <span class="hljs-number">11.5</span>],
            [<span class="hljs-number">-10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">10</span>],
            [<span class="hljs-number">1</span>, <span class="hljs-number">-20</span>, <span class="hljs-number">-19</span>],
            [<span class="hljs-number">1.8</span>, <span class="hljs-number">1.8</span>, <span class="hljs-number">3.6</span>],
        ];
    }
}
</code></pre><p>No método temos a anotação    * @dataProvider numbersDataProvider, essa anotação define o nome do método que é o dataProvider e vai nos fornecer os dados.</p>
<p>O método    numbersDataProvider vai retornar um array contendo outro array onde os 3 valores vão ser passados para o teste it_should_do_a_sum_and_return_the_result na mesma ordem em que foram chamados, eu costumo chamar o último parâmetro de expected que seria o que eu espero que o teste retorne.</p>
<p>Agora temos apenas um teste com 5 cenários diferentes. Ao rodar vamos ter o resultado abaixo.</p>
<pre><code><span class="hljs-string">PHPUnit</span> <span class="hljs-number">9.5</span><span class="hljs-number">.20</span> <span class="hljs-comment">#StandWithUkraine</span>

<span class="hljs-attr">Runtime:</span>       <span class="hljs-string">PHP</span> <span class="hljs-number">8.1</span><span class="hljs-number">.4</span>
<span class="hljs-attr">Configuration:</span> <span class="hljs-string">/var/www/html/phpunit.xml</span>

<span class="hljs-string">.....</span>                                                               <span class="hljs-number">5</span> <span class="hljs-string">/</span> <span class="hljs-number">5</span> <span class="hljs-string">(100%)</span>

<span class="hljs-attr">Time:</span> <span class="hljs-number">00</span><span class="hljs-string">:00.034,</span> <span class="hljs-attr">Memory:</span> <span class="hljs-number">6.00</span> <span class="hljs-string">MB</span>

<span class="hljs-string">OK</span> <span class="hljs-string">(5</span> <span class="hljs-string">tests,</span> <span class="hljs-number">5</span> <span class="hljs-string">assertions)</span>
</code></pre><p>Notem que no shell vamos ter o resultado <em>OK (5 tests, 5 assertions)</em> porque teste rodou 5 vezes e agora não temos mais duplicação de código.</p>
<p>Então hoje aprendemos sobre <em>asserts</em>, <em>dataProviders</em> e vimos como diminuir a duplicação de código nos nossos testes, utilizando apenas um teste para vários cenários. Com isso você já pode começar a criar alguns testes em cenários simples e até alguns mais complexos.</p>
<p>Na próxima parte vamos ver sobre dublês de testes, métodos estáticos e injeção de dependência.</p>
]]></content:encoded></item><item><title><![CDATA[Introdução aos testes com PHPUnit]]></title><description><![CDATA[Já faz algum tempo que venho adiando uma série sobre testes em forma de vídeo, como eu penso que os vídeos trazem uma maior complexidade para desenvolver em relação ao texto resolvi escrever o que pode (ou não) se torna uma série de vídeos no YouTube...]]></description><link>https://daniel.lemes.dev/introducao-aos-testes-com-phpunit-1</link><guid isPermaLink="true">https://daniel.lemes.dev/introducao-aos-testes-com-phpunit-1</guid><category><![CDATA[PHP]]></category><category><![CDATA[Testing]]></category><category><![CDATA[PHPUnit]]></category><dc:creator><![CDATA[Daniel Lemes]]></dc:creator><pubDate>Sun, 17 Apr 2022 03:16:47 GMT</pubDate><content:encoded><![CDATA[<p>Já faz algum tempo que venho adiando uma série sobre testes em forma de vídeo, como eu penso que os vídeos trazem uma maior complexidade para desenvolver em relação ao texto resolvi escrever o que pode (ou não) se torna uma série de vídeos no YouTube, se isso acontecer vou atualizar esse texto com o vídeo.</p>
<p>Nessa série eu pretendo apresentar os principais conceitos de testes, vamos ver porque métodos estáticos são ruins para testes, como criar dublês de testes, injeção de dependência e espero que você ame testes após ler isso &lt;3</p>
<p>Não vamos falar sobre TDD, mas você ira ver que escrever testes pode mudar a sua maneira de pensar e escrever software.</p>
<h3 id="heading-antes-de-comecamos">Antes de começamos</h3>
<p>Estou assumindo que você tem um ambiente PHP já configurado, recomendo fortemente que use um container docker com PHP 8.1 assim essa série terá uma vida maior no que se refere ao código (versão do PHP), embora o conceito sobreviva com o passar dos anos. Também vamos usar majoritariamente a linha de comando, se você não estiver familiarizado com isso <a target="_blank" href="https://www.globalmind.com.br/principais-comandos-linux/">aqui</a> tem uma artigo com oo principais pontos sobre isso.</p>
<h3 id="heading-instalando-o-phpunit">Instalando o PHPUnit</h3>
<p>Para gerenciar todas as dependências usaremos o composer, se você não conhece o composer recomendo ler esse artigo.
Vamos usar o comando abaixo no diretório do nosso projeto.</p>
<pre><code>composer <span class="hljs-built_in">require</span> <span class="hljs-operator">-</span><span class="hljs-operator">-</span>dev phpunit<span class="hljs-operator">/</span>phpunit
</code></pre><p>Após executarmos esse comando teremos um arquivo composer.json na raiz do projeto com um conteúdo parecido com o que temos abaixo</p>
<pre><code>{
    <span class="hljs-attr">"require-dev"</span>: {
        <span class="hljs-attr">"phpunit/phpunit"</span>: <span class="hljs-string">"^9.5"</span>
    }
}
</code></pre><p>Vamos usar o seguinte comando para termos certeza que tudo funcionou sem erros.</p>
<pre><code>./vendor<span class="hljs-operator">/</span>bin<span class="hljs-operator">/</span>phpunit <span class="hljs-operator">-</span><span class="hljs-operator">-</span>version
</code></pre><p>A saída deve ser algo parecido com <em>PHPUnit 9.5.20 #StandWithUkraine</em>
Agora vamos abrir o arquivo <em>composer.json</em> e altera-lo para termos algo semelhante ao exemplo abaixo.</p>
<pre><code>{
    <span class="hljs-attr">"require"</span>: {

    },
    <span class="hljs-attr">"require-dev"</span>: {
        <span class="hljs-attr">"phpunit/phpunit"</span>: <span class="hljs-string">"^9.5"</span>
    },
    <span class="hljs-attr">"autoload"</span>: {
        <span class="hljs-attr">"psr-4"</span>: {
            <span class="hljs-attr">"App\\"</span>: <span class="hljs-string">"src/"</span>
        }
    },
    <span class="hljs-attr">"autoload-dev"</span>: {
        <span class="hljs-attr">"psr-4"</span>: {
            <span class="hljs-attr">"Tests\\"</span>: <span class="hljs-string">"tests/"</span>
        }
    }
}
</code></pre><h4 id="heading-explicando-o-arquivo">Explicando o arquivo</h4>
<ul>
<li>temos a chave <em>require</em> vazia que é onde ficam as dependências do projeto</li>
<li>a <em>require-dev</em> são as dependências de desenvolvimento e por isso o PHPUnit está ali. </li>
<li><em>autoload</em> utilizamos a <a target="_blank" href="https://www.php-fig.org/psr/psr-4/">PSR-4</a> que define as especificações do autoloader, ali temos o namespace que vai apontar para a pasta src, da mesma forma temos o autoload-dev</li>
</ul>
<p>Vamos agora personalizar as configurações do PHPUnit, você pode rodar ele com a configuração padrão assim como personalizar essas configurações, para isso vamos criar o arquivo phpunit.xml,</p>
<pre><code><span class="hljs-operator">&lt;</span>?xml version<span class="hljs-operator">=</span><span class="hljs-string">"1.0"</span> encoding<span class="hljs-operator">=</span><span class="hljs-string">"UTF-8"</span>?<span class="hljs-operator">&gt;</span>

<span class="hljs-operator">&lt;</span>phpunit bootstrap<span class="hljs-operator">=</span><span class="hljs-string">"vendor/autoload.php"</span>
         colors<span class="hljs-operator">=</span><span class="hljs-string">"true"</span>
         verbose<span class="hljs-operator">=</span><span class="hljs-string">"true"</span>
         stopOnFailure<span class="hljs-operator">=</span><span class="hljs-string">"false"</span><span class="hljs-operator">&gt;</span>
    <span class="hljs-operator">&lt;</span>testsuites<span class="hljs-operator">&gt;</span>
        <span class="hljs-operator">&lt;</span>testsuite name<span class="hljs-operator">=</span><span class="hljs-string">"Tests"</span><span class="hljs-operator">&gt;</span>
            <span class="hljs-operator">&lt;</span>directory<span class="hljs-operator">&gt;</span>tests<span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>directory<span class="hljs-operator">&gt;</span>
        <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>testsuite<span class="hljs-operator">&gt;</span>
    <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>testsuites<span class="hljs-operator">&gt;</span>
    <span class="hljs-operator">&lt;</span>coverage processUncoveredFiles<span class="hljs-operator">=</span><span class="hljs-string">"true"</span><span class="hljs-operator">&gt;</span>
        <span class="hljs-operator">&lt;</span>include<span class="hljs-operator">&gt;</span>
            <span class="hljs-operator">&lt;</span>directory suffix<span class="hljs-operator">=</span><span class="hljs-string">".php"</span><span class="hljs-operator">&gt;</span>./app<span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>directory<span class="hljs-operator">&gt;</span>
            <span class="hljs-operator">&lt;</span>directory suffix<span class="hljs-operator">=</span><span class="hljs-string">".php"</span><span class="hljs-operator">&gt;</span>./src<span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>directory<span class="hljs-operator">&gt;</span>
        <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>include<span class="hljs-operator">&gt;</span>
    <span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>coverage<span class="hljs-operator">&gt;</span>
<span class="hljs-operator">&lt;</span><span class="hljs-operator">/</span>phpunit<span class="hljs-operator">&gt;</span>
</code></pre><ul>
<li>directory informa para o PHPUnit onde estão os testes que vamos rodar</li>
<li>colors estamos especificando que queremos uma saída com as cores ativadas para facilitar a visualização no terminar</li>
<li>verbose é ativado para termos mais informações sobre os erros</li>
<li>stopOnFailure desativado para os testes não pararem no primeiro erro encontrado. Também já definimos o coverage e mais a frente explico o porquê de utilizarmos.</li>
</ul>
<p>Vamos rodar mais uma vez o comando <em>./vendor/bin/phpunit</em> para ver se deu tudo certo, então teremos a saída semelhante a essa</p>
<pre><code><span class="hljs-string">PHPUnit</span> <span class="hljs-number">9.5</span><span class="hljs-number">.20</span> <span class="hljs-comment">#StandWithUkraine</span>

<span class="hljs-attr">Runtime:</span>    <span class="hljs-string">PHP</span> <span class="hljs-number">8.1</span><span class="hljs-number">.4</span>

<span class="hljs-attr">Configuration:</span> <span class="hljs-string">/var/www/html/phpunit.xml</span>
</code></pre><h3 id="heading-convencoes">Convenções</h3>
<p>O PHPUnit tem algumas convenções que embora você não precise segui-las eu acho que é altamente recomendável que você as sigas, por isso abaixo vou falar sobre algumas.
Estrutura de pastas e arquivos</p>
<p>No caso desse exemplo os arquivos vão ficar dentro de src, portanto se você tiver um arquivo no endereço <em>src/Domain/Entities/User.php</em> o seu teste deve ficar em <em>tests/Domain/Entities/UserTest.php</em> e a sua classe de teste deve ter o mesmo nome que o arquivo ou seja class <em>UserTest{}</em></p>
<h3 id="heading-nome-de-metodos">Nome de métodos</h3>
<p>Dentro das classes de testes os métodos devem seguir a convenção para que sejam executados pela suite de testes, o método deve ser público e o nome dele deve iniciar com test, em minúsculo, ou ter a annotation @test.</p>
<p>Devemos escrever como nome do método, um nome que faça sentido para o teste informando o nome do método que deve ser testado, não há espaço para nomes de métodos curtos, verbosidade é que o que você deve buscar ao escrever nome dos métodos porque você precisará saber ao que se refere o teste quando ele falha e ele irá falhar.</p>
<p>Por fim suas classes devem estender a classe PHPUnit_Framework_TestCase ou outra classe equivalente.</p>
<h4 id="heading-finalmente-nosso-primeiro-teste">Finalmente nosso primeiro teste</h4>
<p>Vamos criar uma classe calculadora e um método que faz a soma de números, nossa classe te teste ficaria assim</p>
<pre><code><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Calculator</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">PHPUnit</span>\<span class="hljs-title">Framework</span>\<span class="hljs-title">TestCase</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CalculatorTest</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">TestCase</span>
</span>{

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test_it_should_do_a_sum_and_return_the_result</span>(<span class="hljs-params"></span>)
    </span>{
        $sum = <span class="hljs-keyword">new</span> Calculator();
        $result = $sum-&gt;sum(<span class="hljs-number">10</span>,<span class="hljs-number">8.5</span>);
        <span class="hljs-keyword">$this</span>-&gt;assertEquals(<span class="hljs-number">18.5</span>, $result);
    }
}
</code></pre><p>Vamos salvar essa classe na raiz do diretório tests, definimos que nossa classe se chama <em>CalculatorTest</em> (assim como o arquivo) e estende o <em>TestCase</em> do PHPUnit. Nosso método inicia como test e depois temos um nome utilizando <em>snake_case</em>, algumas pessoas preferem usar <em>CamelCase</em>, isso é mais definição de legibilidade e padrão que o time quer seguir.
Uma outra opção para definirmos a classe é utilizar <em>annotations</em> e desse forma podemos subtrair o test no início do nome do método, como no exemplo abaixo, ambos os exemplos funcionam da mesma maneira.</p>
<pre><code><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Calculator</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">PHPUnit</span>\<span class="hljs-title">Framework</span>\<span class="hljs-title">TestCase</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CalculatorTest</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">TestCase</span>
</span>{

    <span class="hljs-comment">/**
     * <span class="hljs-doctag">@return</span> void
     * <span class="hljs-doctag">@test</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">it_should_do_a_sum_and_return_the_result</span>(<span class="hljs-params"></span>)
    </span>{
        $sum = <span class="hljs-keyword">new</span> Calculator();
        $result = $sum-&gt;sum(<span class="hljs-number">10</span>,<span class="hljs-number">8.5</span>);
        <span class="hljs-keyword">$this</span>-&gt;assertEquals(<span class="hljs-number">18.5</span>, $result);
    }
}
</code></pre><p>Agora vamos escrever a classe que faz o cálculo dentro do diretório src/</p>
<pre><code><span class="hljs-meta">&lt;?php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">App</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Calculator</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Sum</span>(<span class="hljs-params"><span class="hljs-keyword">int</span>|<span class="hljs-keyword">float</span> ... $numbers</span>): <span class="hljs-title">float</span>|<span class="hljs-title">int</span>
    </span>{
        $sum = <span class="hljs-number">0</span>;
        <span class="hljs-keyword">foreach</span>($numbers <span class="hljs-keyword">as</span> $number){
            $sum += $number;
        }
        <span class="hljs-keyword">return</span> $sum;
    }
}
</code></pre><p>O que estamos fazendo é definindo uma classe Calculator e um método público Sum, nesse método podemos receber vários números que devem ser inteiro ou ponto flutuante, o retorno também pode ser inteiro ou ponto flutuante, dentro do métodos apenas um loop que vai somando cada número e um retorno. O código é simples mas a ideia é que ao invés de instanciarmos essa classe, ir no navegador e ver um print vamos utilizar uma automação e assim sempre que fizermos alterações testamos para ver se tudo continua funcionando da mesma maneira.</p>
<p>Rodando o comando <em>./vendor/bin/phpunit</em> temos a "barra verde" indicando que nossos testes passaram.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650165253939/Ut-dGibg9.png" alt="Captura de Tela 2022-04-15 às 19.39.34.png" /></p>
<blockquote>
<p>descrição da imagem: tela preta do shell do linux com a saída do comando ./vendo/bin/phpunit na imagem temos 5 linhas, onde na primeira temos a versão do PHP que é a 8.1.4, na segunda linha indica o endereço no computador das configurações do PHPUnit, na terceira linha temos um ponto na esquerda e na direita temos o texto 1/1 (100%), na quarta linha o tempo de execução e a quantidade de memória usada, na quinta e última linha temos o texto com fundo verde OK(1 test, 1 assertion), indicando que todos os testes passaram.</p>
</blockquote>
<p>Nota: Sei que poderia ter usado imagens nos códigos o que ficaria visualmente mais bonito para quem enxerga mas menos acessível, por isso escolhi a acessibilidade embora que não tenha conhecimento sobre, estou acreditando que isso seria melhor do que termos várias imagens de código.</p>
<p>Então chegamos ao fim da primeira parte, agradeço a quem chegou até o fim e qualquer erro ou sugestão podem me chamar que terei prazer em corrigir.</p>
<p><a target="_blank" href="https://daniel.lemes.dev/introducao-aos-testes-com-phpunit">Segunda parte aqui</a></p>
]]></content:encoded></item></channel></rss>