{"id":230559,"date":"2022-11-29T15:55:00","date_gmt":"2022-11-29T12:55:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230559"},"modified":"2022-11-29T16:01:57","modified_gmt":"2022-11-29T13:01:57","slug":"escrevendo-testes-de-unidade-com-phpunit-parte-3-configuracao-xml","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/escrevendo-testes-de-unidade-com-phpunit-parte-3-configuracao-xml\/","title":{"rendered":"Escrevendo testes de unidade com PHPUnit, parte 3: configura\u00e7\u00e3o XML"},"content":{"rendered":"\n<p>Nos posts anteriores desta s\u00e9rie, abordei os dois t\u00f3picos a seguir:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/escrevendo-testes-de-unidade-com-phpunit-parte-1-a-configuracao\/\" title=\"Escrevendo Testes Unit\u00e1rios com PHPUnit, Parte 1: A Configura\u00e7\u00e3o\">Escrevendo Testes Unit\u00e1rios com PHPUnit, Parte 1: A Configura\u00e7\u00e3o<\/a><strong>.<\/strong> Um guia para come\u00e7ar a escrever testes PHPUnit atrav\u00e9s do uso de um cache b\u00e1sico e usando o m\u00e9todo setUp do framework.<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/escrevendo-testes-unitarios-com-phpunit-parte-2-the-tear-down\/\" title=\"Escrevendo Testes Unit\u00e1rios com PHPUnit, Parte 2: The Tear Down.\">Escrevendo Testes Unit\u00e1rios com PHPUnit, Parte 2: The Tear Down.<\/a> Um tutorial sobre como escrever testes de unidade que aproveitam adequadamente os m\u00e9todos setUp e tearDown do PHPUnit.<\/li>\n<\/ol>\n<p>Cada um dos itens acima destina-se a fornecer uma cartilha sobre como come\u00e7ar a escrever testes de unidade muito b\u00e1sicos. As coisas podem ficar mais complexas, especialmente \u00e0 medida que um aplicativo ou projeto cresce (mas isso \u00e9 sempre verdade, certo?).<\/p>\n<p>Mas para ter certeza de que est\u00e1 preparado para isso, h\u00e1 um componente final para teste de unidade que acredito que devemos focar e que \u00e9 entender o arquivo de configura\u00e7\u00e3o XML PHPUnit (que voc\u00ea pode ter visto em outros projetos como phpunit.xml).<\/p>\n<h2>Configura\u00e7\u00e3o XML do PHPUnit<\/h2>\n<p>Ent\u00e3o, neste post, vou configurar um projeto simples que usa PHPUnit, escreve alguns testes como os que j\u00e1 vimos e aproveita um arquivo de configura\u00e7\u00e3o para automatizar os testes.<\/p>\n<p>Al\u00e9m disso, farei o que puder para explicar melhor as partes necess\u00e1rias do arquivo de configura\u00e7\u00e3o para que voc\u00ea possa incluir uma em seu pr\u00f3ximo projeto.<\/p>\n<h3>1 Apagando os arquivos<\/h3>\n<p>Antes de come\u00e7ar a escrever c\u00f3digo test\u00e1vel, \u00e9 importante conhecer os arquivos que ser\u00e3o necess\u00e1rios para que o processo funcione.<\/p>\n<p>O seguinte \u00e9, mais ou menos, como <strong><a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">organizamos<\/a><\/strong> as coisas desde o in\u00edcio de um projeto:<\/p>\n<ul>\n<li>um diret\u00f3rio para testes,<\/li>\n<li>o arquivo <strong>phpunit.xml<\/strong><\/li>\n<\/ul>\n<p>Eventualmente, voc\u00ea tamb\u00e9m ver\u00e1:<\/p>\n<ul>\n<li>os arquivos que comp\u00f5em o projeto,<\/li>\n<li>os testes que verificam esses arquivos.<\/li>\n<\/ul>\n<p>Neste ponto, por\u00e9m, vamos dar uma olhada no arquivo de configura\u00e7\u00e3o XML e tentar executar o PHPUnit automaticamente sem quaisquer outros par\u00e2metros.<\/p>\n<h3>2 No\u00e7\u00f5es b\u00e1sicas para o arquivo de configura\u00e7\u00e3o<\/h3>\n<p>Primeiro, vamos ver <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-00-phpunit-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o arquivo de configura\u00e7\u00e3o b\u00e1sica:<\/a><\/strong><\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n\n&lt;!-- http:\/\/phpunit.de\/manual\/4.1\/en\/appendixes.configuration.html --&gt;\n&lt;phpunit xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"http:\/\/schema.phpunit.de\/4.1\/phpunit.xsd\"\n         bootstrap=\".\/tests\/bootstrap.php\"\n         backupGlobals=\"false\"\n         colors=\"true\"\n         convertErrorsToExceptions=\"true\"\n         convertNoticesToExceptions=\"true\"\n         convertWarningsToExceptions=\"true\"\n&gt;\n  &lt;testsuites&gt;\n    &lt;testsuite name=\"AcmeTests\"&gt;\n      &lt;directory&gt;.\/tests&lt;\/directory&gt;\n    &lt;\/testsuite&gt;\n  &lt;\/testsuites&gt;\n\n  &lt;logging&gt;\n    &lt;log type=\"coverage-text\" target=\"php:\/\/stdout\" showUncoveredFiles=\"true\"&gt;&lt;\/log&gt;\n  &lt;\/logging&gt;\n&lt;\/phpunit&gt;\n<\/code><\/pre>\n<p>Agora vamos entender exatamente o que estamos vendo (al\u00e9m do XML simples).<\/p>\n<ul>\n<li><strong>phpunit<\/strong>. O n\u00f3 pai faz o trabalho normal de definir o esquema para o arquivo XML, mas h\u00e1 alguns outros componentes com os quais estamos preocupados:\n<ul>\n<li><strong>backupGlobals.<\/strong> Na verdade, isso est\u00e1 relacionado a uma anota\u00e7\u00e3o que podemos fazer em nosso c\u00f3digo-fonte. Os globais s\u00e3o algo que devemos tentar evitar na programa\u00e7\u00e3o orientada a objetos, mas se voc\u00ea optar por usar um ou precisar usar um, isso dir\u00e1 ao PHPUnit para lidar com os valores que as vari\u00e1veis \u200b\u200bglobais est\u00e3o mantendo (e lhe dar\u00e1 a op\u00e7\u00e3o de restaurar eles). Eu geralmente deixo isso como est\u00e1.<\/li>\n<li><strong>bootstrap.<\/strong> Isso \u00e9 opcional, mas se voc\u00ea optar por incluir outros arquivos com seus testes (como trazer uma biblioteca de simula\u00e7\u00e3o, parte do WordPress ou uma biblioteca de terceiros), isso ser\u00e1 tudo para voc\u00ea definir a localiza\u00e7\u00e3o do script que precisa executar. Zombar e trazer o WordPress est\u00e1 fora do escopo deste post, mas \u00e9 algo que provavelmente veremos no futuro, pois \u00e9 \u00fatil ao testar plugins. Por enquanto, incluirei um autoloader simples que basicamente adiciona todos os arquivos na raiz do diret\u00f3rio do projeto. A fonte completa para ele ser\u00e1 compartilhada mais tarde neste post.<\/li>\n<li><strong>cores.<\/strong> Se voc\u00ea quiser que o console imprima um relat\u00f3rio de seus testes e fa\u00e7a isso usando cores (para ajudar a identificar mais facilmente avisos, avisos, erros e assim por diante), defina como true.<\/li>\n<li>A seguir est\u00e3o todos os valores booleanos. Eu recomendo defini-los como <strong>verdadeiros<\/strong> para os relat\u00f3rios mais agressivos poss\u00edveis. Dessa forma, voc\u00ea n\u00e3o escapar\u00e1 simplesmente de receber avisos ou avisos enquanto se preocupa apenas com erros. Este \u00e9 mais um exerc\u00edcio de qualidade de c\u00f3digo do que qualquer outra coisa.\n<ul>\n<li><strong>convertErrorsToExceptions<\/strong><\/li>\n<li><strong>convertNoticesToExceptions<\/strong><\/li>\n<li><strong>convertWarningsToExceptions<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>testsuites<\/strong> s\u00e3o compostos de cole\u00e7\u00f5es de testes. Como um determinado projeto pode ter v\u00e1rios testes, \u00e9 importante garantir que voc\u00ea d\u00ea a cada conjunto um nome exclusivo e fa\u00e7a refer\u00eancia ao caminho adequado para o grupo de testes. Para nosso exemplo, teremos apenas um \u00fanico conjunto de testes e est\u00e1 localizado no diret\u00f3rio de <strong>testes<\/strong>.<\/li>\n<li><strong>logging<\/strong> \u00e9 um recurso que pode ser t\u00e3o simples quanto imprimir dados no console ou usar uma biblioteca de terceiros (como <strong><a href=\"https:\/\/confluence.atlassian.com\/clover\/clover-documentation-home-71598318.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Clover<\/a><\/strong>) para gerar relat\u00f3rios que ajudam na integra\u00e7\u00e3o cont\u00ednua. Como eu ainda tenho que discutir o \u00faltimo em qualquer um dos meus posts anteriores, vamos ficar com o console como nosso principal m\u00e9todo de sa\u00edda. Assim, temos php <strong>:\/\/stdout<\/strong> como nossa \u00fanica sa\u00edda de log.<\/li>\n<\/ul>\n<p>Com tudo isso dito, nosso arquivo XML tem tudo que o PHPUnit precisa para rodar sem outros par\u00e2metros.<\/p>\n<p>Lembre-se, por\u00e9m, antes de prosseguir com o resto deste artigo, suponho que voc\u00ea instalou globalmente o PHPUnit em seu sistema usando o Composer. Caso contr\u00e1rio, revise <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/compositor-para-wordpress-parte-1\/\" title=\"este artigo\">este artigo<\/a><\/strong>, pois ele fornecer\u00e1 instru\u00e7\u00f5es sobre como faz\u00ea-lo.<\/p>\n<p>Uma vez feito, voc\u00ea pode verificar se o PHPUnit est\u00e1 instalado digitando o seguinte comando no seu terminal:<\/p>\n<pre><code>$ which phpunit<\/code><\/pre>\n<p>E voc\u00ea deve ver algo como o seguinte:<\/p>\n<\/p>\n<p>Se voc\u00ea vir algo como o acima, poder\u00e1 executar o PHPUnit em qualquer lugar do seu sistema.<\/p>\n<h3>3 O arquivo Bootstrap<\/h3>\n<p>Antes de prosseguir, vamos escrever um arquivo bootstrap b\u00e1sico. Vamos cham\u00e1-lo de <strong>bootstrap.php<\/strong> e coloc\u00e1-lo em nosso diret\u00f3rio de <strong>testes<\/strong>. Incluir\u00e1 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-01-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o seguinte:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/\/ This array has a single file but could whole the contents of an entire directory.\n$files = [\n    dirname(__DIR__).'\/AcmeCache.php',\n];\n\nforeach ($files as $file) {\n    if (file_exists($file)) {\n        require_once $file;\n    }\n}\n<\/code><\/pre>\n<p>Este \u00e9 um simples &#8220;autoloader&quot; (que eu o chamo hesitantemente, j\u00e1 que est\u00e1 apenas iterando os arquivos e exigindo-os, mas funciona para nossos prop\u00f3sitos).<\/p>\n<p>Neste ponto, vamos configurar um teste b\u00e1sico.<\/p>\n<h3>4 Um Teste B\u00e1sico e Reprovado<\/h3>\n<p>Se voc\u00ea ler algo sobre desenvolvimento orientado a testes, provavelmente ouvir\u00e1 falar sobre o ciclo de repeti\u00e7\u00e3o vermelho-verde. H\u00e1 muito a ser dito sobre isso e eu recomendo <strong><a href=\"http:\/\/blog.cleancoder.com\/uncle-bob\/2014\/12\/17\/TheCyclesOfTDD.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ler sobre isso<\/a><\/strong>, mas n\u00e3o \u00e9 o objetivo deste post.<\/p>\n<p>Em vez disso, estamos mais focados em realmente escrever testes que correspondam ao que precisamos fazer, certo? Dito isso, vamos fazer o seguinte:<\/p>\n<ol>\n<li>crie um diret\u00f3rio a partir do qual voc\u00ea ter\u00e1 alguns arquivos PHP b\u00e1sicos que testaremos,<\/li>\n<li>na raiz do diret\u00f3rio, crie tamb\u00e9m <strong>phpunit.xml<\/strong> e preencha-o usando o c\u00f3digo compartilhado anteriormente neste post<\/li>\n<li>crie um diret\u00f3rio de <strong>testes<\/strong> onde colocaremos nossos testes.<\/li>\n<\/ol>\n<p>Agora, a partir do Terminal, mude o diret\u00f3rio para o diret\u00f3rio do projeto (que est\u00e1 faltando, por enquanto) e ent\u00e3o simplesmente execute <strong>php<em><\/em><\/strong> unit<em><\/em>:<\/p>\n<pre><code>$ phpunit<\/code><\/pre>\n<p>Supondo que tudo esteja configurado corretamente, voc\u00ea dever\u00e1 ver algo assim:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7588ea742f.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7588ea742f.png\" alt=\"Escrevendo testes de unidade com PHPUnit, parte 3: configura\u00e7\u00e3o XML\"><\/a><\/p>\n<p>Como n\u00e3o temos c\u00f3digo nem testes, naturalmente veremos a sa\u00edda acima, certo? Ent\u00e3o, vamos escrever um \u00fanico teste que ser\u00e1 executado (e falhar\u00e1), pois n\u00e3o h\u00e1 c\u00f3digo para ele realmente testar.<\/p>\n<p>Primeiro, no diret\u00f3rio de <strong>testes<\/strong>, crie um arquivo chamado <strong>AcmeCacheTest.php.<\/strong> E vamos fazer algo simples como <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-03-failing-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">instanciar um objeto de cache<\/a><\/strong> que eventualmente criaremos.<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n}\n<\/code><\/pre>\n<p>Antes de executar o teste, observe que:<\/p>\n<ol>\n<li>Certifique-se de <strong>usar PHPUnitFrameworkTestCase<\/strong><\/li>\n<li>E fa\u00e7a nossa classe <strong>estender TestCase<\/strong><\/li>\n<\/ol>\n<p>Isso \u00e9 parte do que torna o uso do PHPUnit t\u00e3o f\u00e1cil. Feito isso, execute o seguinte c\u00f3digo na raiz do seu projeto:<\/p>\n<pre><code>$ phpunit<\/code><\/pre>\n<p>Depois disso, voc\u00ea deve ver o seguinte:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e75891b9ec8.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e75891b9ec8.png\" alt=\"Escrevendo testes de unidade com PHPUnit, parte 3: configura\u00e7\u00e3o XML\"><\/a><\/p>\n<p>Observe que isso resultar\u00e1 em um teste com falha e informar\u00e1 <strong>onde<\/strong> o problema foi encontrado, o arquivo e a linha.<\/p>\n<p>Para corrigir isso, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-04-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">precisamos escrever uma classe:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace Acme;\n\nclass AcmeCache\n{\n    private $duration;\n\n    public function __construct()\n    {\n        $this-&gt;duration = 43200;\n    }\n\n    public function setDuration(int $duration)\n    {\n        $this-&gt;duration = $duration;\n    }\n\n    public function getDuration(): int\n    {\n        return $this-&gt;duration;\n    }\n}\n<\/code><\/pre>\n<h3>4 Alguns testes b\u00e1sicos e aprovados<\/h3>\n<p>O teste b\u00e1sico de aprova\u00e7\u00e3o (que ser\u00e1 baseado no c\u00f3digo anterior) incluir\u00e1 o seguinte:<\/p>\n<ul>\n<li>um arquivo com namespace,<\/li>\n<li>representar\u00e1 um cache simples,<\/li>\n<li>ser\u00e1 carregado automaticamente pelo PHPUnit usando o arquivo <strong>bootstrap.php<\/strong> compartilhado acima<\/li>\n<li>e ter\u00e1 uma dura\u00e7\u00e3o definida em seu construtor junto com um setter e um getter para o valor<\/li>\n<\/ul>\n<p>Primeiro, vamos testar se conseguimos configurar a classe e se ela n\u00e3o \u00e9 nula. Esta \u00e9 uma afirma\u00e7\u00e3o um pouco desnecess\u00e1ria, pois sabemos que teremos uma classe devidamente instanciada, mas nos coloca no ritmo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-03-failing-test-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de escrever testes:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n}\n<\/code><\/pre>\n<p>E execute o teste:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e75894bbad2.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e75894bbad2.png\" alt=\"Escrevendo testes de unidade com PHPUnit, parte 3: configura\u00e7\u00e3o XML\"><\/a><\/p>\n<p>Em seguida, vamos verificar se o valor padr\u00e3o do <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-05-test-2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cache est\u00e1 definido:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n\n    public function testDefaultCacheValue()\n    {\n        $this-&gt;assertSame(43200, $this-&gt;cache-&gt;getDuration());\n    }\n}\n<\/code><\/pre>\n<p>Assim como na etapa anterior, execute os testes e agora voc\u00ea ver\u00e1 dois testes aprovados:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7589770dbe.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7589770dbe.png\" alt=\"Escrevendo testes de unidade com PHPUnit, parte 3: configura\u00e7\u00e3o XML\"><\/a><\/p>\n<p>Por fim, vamos testar para ver se conseguimos <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2ae5a6b3afb7afebf200670a923f30ea#file-05-test-3-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">alterar o valor com sucesso:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeTests;\n\nuse PHPUnitFrameworkTestCase;\nuse AcmeAcmeCache;\n\nclass AcmeCacheTest extends TestCase\n{\n    private $cache;\n\n    public function setUp()\n    {\n        $this-&gt;cache = new AcmeCache();\n    }\n\n    public function testCacheExists()\n    {\n        $this-&gt;assertNotNull($this-&gt;cache);\n    }\n\n    public function testDefaultCacheValue()\n    {\n        $this-&gt;assertSame(43200, $this-&gt;cache-&gt;getDuration());\n    }\n\n    public function testSetCustomDuration()\n    {\n        $duration = 4200;\n\n        $this-&gt;cache-&gt;setDuration($duration);\n        $this-&gt;assertSame($duration, $this-&gt;cache-&gt;getDuration());\n    }\n}\n<\/code><\/pre>\n<p>E os tr\u00eas \u00faltimos testes de aprova\u00e7\u00e3o:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7589a7745a.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163700-61e7589a7745a.png\" alt=\"Escrevendo testes de unidade com PHPUnit, parte 3: configura\u00e7\u00e3o XML\"><\/a><\/p>\n<p>E a\u00ed est\u00e1:<\/p>\n<ol>\n<li>um arquivo XML PHPUnit,<\/li>\n<li>um simples bootstrap,<\/li>\n<li>uma \u00fanica classe com namespace,<\/li>\n<li>testes unit\u00e1rios para cada m\u00e9todo da classe<\/li>\n<\/ol>\n<p>Concedido, \u00e9 simples, mas isso estabelece os fundamentos para muito mais do que muitas pessoas j\u00e1 fazem com seus testes.<\/p>\n<p>Al\u00e9m disso, oferece algo para voc\u00ea construir \u00e0 medida que suas habilidades de teste se fortalecem.<\/p>\n<h2>H\u00e1 mais? (Sempre certo?)<\/h2>\n<p>Finalmente, se voc\u00ea estiver ansioso para realmente mergulhar no arquivo de configura\u00e7\u00e3o, poder\u00e1 ler a explica\u00e7\u00e3o <strong><a href=\"https:\/\/phpunit.de\/manual\/6.5\/en\/appendixes.configuration.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">detalhada do manual sobre ele.<\/a><\/strong><\/p>\n<p>Observe, no entanto, que tudo o que est\u00e1 descrito acima visa ser o que voc\u00ea precisa para come\u00e7ar a configurar seu pr\u00f3prio arquivo de configura\u00e7\u00e3o XML PHPUnit.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um guia b\u00e1sico para entender o arquivo de configura\u00e7\u00e3o XML do PHPUnit e como vincul\u00e1-lo a testes de unidade mais f\u00e1ceis.<\/p>\n","protected":false},"author":1,"featured_media":163701,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[722,806,846],"tags":[1170],"class_list":["post-230559","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvedor","category-php-8","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=230559"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230559\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/163701"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230559"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}