{"id":230460,"date":"2022-11-26T12:32:00","date_gmt":"2022-11-26T09:32:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230460"},"modified":"2022-11-26T12:32:14","modified_gmt":"2022-11-26T09:32:14","slug":"escrevendo-testes-de-unidade-com-phpunit-parte-1-a-configuracao","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/escrevendo-testes-de-unidade-com-phpunit-parte-1-a-configuracao\/","title":{"rendered":"Escrevendo testes de unidade com PHPUnit, parte 1: a configura\u00e7\u00e3o"},"content":{"rendered":"\n<p>No in\u00edcio deste m\u00eas, come\u00e7amos a analisar a instala\u00e7\u00e3o do <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/instalando-o-phpunit-no-visual-studio-code\/\" title=\"PHPUnit no Visual Studio Code\">PHPUnit no Visual Studio Code<\/a><\/strong> com o objetivo final de aprender a escrever testes de unidade para nossos projetos baseados em WordPress.<\/p>\n<p>Para esse fim, este post pressup\u00f5e que voc\u00ea leu os seguintes posts e assume que voc\u00ea alcan\u00e7ou um punhado de posts anteriores:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/um-ambiente-de-desenvolvimento-wordpress-usando-um-gerenciador-de-pacotes\/\" title=\"Um ambiente de desenvolvimento WordPress (usando um gerenciador de pacotes)\">Um ambiente de desenvolvimento WordPress (usando um gerenciador de pacotes)<\/a><\/strong><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/um-ide-para-desenvolvimento-wordpress-independentemente-da-experiencia\/\" title=\"Um IDE para desenvolvimento WordPress\">Um IDE para desenvolvimento WordPress<\/a><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/trabalhando-com-configuracoes-de-usuario-no-visual-studio-code\/\" title=\"Trabalhando com configura\u00e7\u00f5es de usu\u00e1rio no Visual Studio Code\">Trabalhando com configura\u00e7\u00f5es de usu\u00e1rio no Visual Studio Code<\/a><\/strong><\/li>\n<\/ol>\n<p>E, claro, instalando o PHPUnit no Visual Studio Code conforme link acima. Feito isso, estaremos prontos para prosseguir. Mas uma coisa a ter em mente \u00e9 que esta noite ser\u00e1 um curso tradicional ou abrangente sobre como escrever testes unit\u00e1rios.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164223-61e760d45682b.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-164223-61e760d45682b.png\" alt=\"Escrevendo testes de unidade com PHPUnit, parte 1: a configura\u00e7\u00e3o\"><\/a><\/p>\n<p>Em vez disso, trata-se de escrever testes de unidade para projetos do WordPress.<\/p>\n<h2>Testes de unidade com PHPUnit, Parte 1: A configura\u00e7\u00e3o<\/h2>\n<p>Antes de me aprofundar muito nisso, quero deixar claro que este n\u00e3o \u00e9 tanto um post sobre desenvolvimento orientado a testes, mas um post que estabelece as bases para entender a escrita de testes de unidade. E ent\u00e3o, finalmente, trabalharemos para escrever testes de unidade para nosso c\u00f3digo.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164223-61e760d8c4801.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-164223-61e760d8c4801.png\" alt=\"Escrevendo testes de unidade com PHPUnit, parte 1: a configura\u00e7\u00e3o\"><\/a><\/p>\n<p>Para aqueles de voc\u00eas que fizeram alguma leitura pr\u00e9via sobre testes de unidade, ent\u00e3o voc\u00ea sabe que escrever testes de unidade \u00e9 um t\u00f3pico para o qual h\u00e1 muitas informa\u00e7\u00f5es e este post n\u00e3o tentar\u00e1 cobrir tudo isso. Em vez disso, ser\u00e1 necess\u00e1ria uma abordagem mais pragm\u00e1tica para escrever testes de unidade em plugins baseados em WordPress, aplicativos da web e similares.<\/p>\n<h3>1 Escrevendo Testes Unit\u00e1rios<\/h3>\n<p>Sempre que voc\u00ea come\u00e7ar a escrever testes de unidade, voc\u00ea ver\u00e1 a ideia dos m\u00e9todos <strong>setUp<\/strong> e <strong>tearDown<\/strong>. Isso \u00e9 comum no <strong><a href=\"https:\/\/phpunit.de\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPUnit<\/a><\/strong> (assim como em outros frameworks de teste). Existem algumas coisas sobre esses dois m\u00e9todos espec\u00edficos que geralmente causam problemas.<\/p>\n<p>Resumindo, as pessoas tratam as fun\u00e7\u00f5es assim:<\/p>\n<ul>\n<li><strong>setUp<\/strong> \u00e9 como o construtor no qual voc\u00ea instancia sua classe e ent\u00e3o prepara tudo o que precisa para o teste, incluindo o objeto a ser testado, os dados necess\u00e1rios e assim por diante.<\/li>\n<li><strong>tearDown<\/strong> \u00e9 o destruidor onde voc\u00ea redefine tudo e depois descarta seus objetos. Isso geralmente \u00e9 mais comum em linguagens compiladas, mas tamb\u00e9m n\u00e3o deve ser esquecido no PHPUnit.<\/li>\n<\/ul>\n<p>E embora eu possa entender isso completamente, nem sempre \u00e9 o caso. Estou falando por experi\u00eancia aqui tamb\u00e9m. Em vez disso, \u00e9 de onde vem o teste de unidade de frase real. Trata-se de testar o c\u00f3digo do c\u00f3digo das unidades e faz\u00ea-lo de maneira limpa e concisa.<\/p>\n<p>Ent\u00e3o, para que servem esses m\u00e9todos, afinal? Isso pode ser um h\u00e1bito especialmente dif\u00edcil de quebrar ou at\u00e9 mesmo um modelo conceitual de quebrar quando voc\u00ea est\u00e1 entrando no processo pela primeira vez. Para esse fim, quero examinar o prop\u00f3sito de cada m\u00e9todo e como abordar isso ao trabalhar com projetos baseados em WordPress.<\/p>\n<p>E, como sempre, tentarei manter isso o mais simples e pragm\u00e1tico poss\u00edvel. Estou muito menos interessado na teoria por tr\u00e1s de certas coisas do que em como ela pode servir tanto ao meu neg\u00f3cio quanto aos meus projetos. (Isso n\u00e3o \u00e9 para desconsiderar a teoria, \u00e9 claro, mas h\u00e1 um tempo n\u00e3o \u00e9 um lugar para isso e este blog n\u00e3o \u00e9 isso.)<\/p>\n<h3>2 A fun\u00e7\u00e3o de configura\u00e7\u00e3o<\/h3>\n<p>Embora eu esteja come\u00e7ando com uma breve discuss\u00e3o sobre o m\u00e9todo <strong>setUp<\/strong>, \u00e9 importante ter em mente que sua fun\u00e7\u00e3o irm\u00e3 (como alguns consideram) nem sempre \u00e9 necess\u00e1ria.<\/p>\n<p>Por exemplo, se voc\u00ea estiver escrevendo c\u00f3digo em que tudo o que est\u00e1 fazendo \u00e9 instanciar um objeto ou um conjunto de objetos, o m\u00e9todo <strong>tearDown<\/strong> pode n\u00e3o ser necess\u00e1rio. Entrarei em mais detalhes sobre isso na pr\u00f3xima se\u00e7\u00e3o.<\/p>\n<p>Com isso dito, digamos que voc\u00ea tenha uma classe respons\u00e1vel por executar um pouco de l\u00f3gica de dom\u00ednio. Lembre-se, para os prop\u00f3sitos deste post, n\u00e3o estamos preocupados com c\u00f3digo que far\u00e1 coisas que o WordPress faz naturalmente e que j\u00e1 possui seu pr\u00f3prio conjunto de testes.<\/p>\n<p>Com isso, quero dizer que estamos preocupados com o c\u00f3digo que funciona especificamente dentro de um dom\u00ednio de problema. Por exemplo, talvez estejamos preocupados em escrever uma classe que armazena dados em cache no banco de dados. Uma das informa\u00e7\u00f5es respons\u00e1veis \u200b\u200bpor armazenar em cache as informa\u00e7\u00f5es \u00e9 por quanto tempo os dados devem ser armazenados em cache. Assim, um candidato para o teste unit\u00e1rio faria o uso que podemos definir e alterar a quantidade de tempo, certo?<\/p>\n<p>Concedido, talvez esses dados sejam codificados, mas para fins de exemplo, vamos supor o contr\u00e1rio. Isso implica o seguinte:<\/p>\n<ul>\n<li>Temos uma classe que serve como nosso cache,<\/li>\n<li>A classe mant\u00e9m uma parte dos dados da inst\u00e2ncia por quanto tempo o cache deve ser definido,<\/li>\n<li>O tempo de cache pode ser definido a partir de classes de terceiros,<\/li>\n<li>O tempo de cache pode ser lido de classes de terceiros.<\/li>\n<\/ul>\n<p>Isso significa que um teste de unidade incluiria:<\/p>\n<ol>\n<li>Configurando a aula,<\/li>\n<li>Definindo um valor,<\/li>\n<li>Afirmando que o valor que foi definido \u00e9 o esperado,,<\/li>\n<li>Mudando o valor,<\/li>\n<li>A declara\u00e7\u00e3o do valor que foi alterado foi atualizada.<\/li>\n<\/ol>\n<p>Portanto, a classe b\u00e1sica pode ser algo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/248c7741273e6be414c1f98c11085fe7#file-00-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a><\/strong> (toda a documenta\u00e7\u00e3o sendo deixada de fora da classe para manter o c\u00f3digo o mais conciso poss\u00edvel):<\/p>\n<pre><code>&lt;?php\n\nclass AcmeCache\n{\n    private $duration;\n\n    public function __construct()\n    {\n        $this-&gt;duration = 43200;\n    }\n\n    public function setDuration($duration)\n    {\n        $this-&gt;duration = $duration;\n    }\n\n    public function getDuration()\n    {\n        return $this-&gt;duration;\n    }\n\n    \/\/ More cache code omitted...\n}\n<\/code><\/pre>\n<p>Observe que, por padr\u00e3o, temos o tempo de cache definido em 12 horas (em segundos). A classe suporta a capacidade de alterar e ler a dura\u00e7\u00e3o tamb\u00e9m.<\/p>\n<p>Isso significa que podemos escrever testes que testam:<\/p>\n<ul>\n<li>se o valor inicial for o esperado,<\/li>\n<li>se o novo valor for o esperado (e sobrescrever o valor inicial)<\/li>\n<\/ul>\n<pre><code>&lt;?php\n\nuse PHPUnitFrameworkTestCase;\n\nclass AcmeCacheTest extends TestCase\n{\n  protected $cache;\n\n  protected function setUp()\n  {\n    $this-&gt;cache = new AcmeCache();\n  }\n\n  public function testDefaultDuration()\n  {\n    $this-&gt;assertTrue($this-&gt;cache-&gt;getDuration() === 43200);\n  }\n\n  public function testNewDuration()\n  {\n    $this-&gt;cache-&gt;setDuration(1000);\n\n    $this-&gt;assertFalse($this-&gt;cache-&gt;getDuration() === 43200);\n    $this-&gt;assertTrue($this-&gt;cache-&gt;getDuration() === 1000);\n  }\n\n  \/\/ More to come...\n}<\/code><\/pre>\n<p>Uma das coisas que eu gostaria de salientar no c\u00f3digo acima \u00e9 que voc\u00ea pode ler que cada teste deve ter uma \u00fanica asser\u00e7\u00e3o enquanto <strong>testNewDuration<\/strong> claramente tem duas asser\u00e7\u00f5es.<\/p>\n<p>Costumo tomar a ideia de uma afirma\u00e7\u00e3o por teste como regra geral. Por exemplo, neste caso, quero afirmar que o valor inicial \u00e9 substitu\u00eddo ou n\u00e3o armazenado em nenhum lugar e o novo valor \u00e9 armazenado.<\/p>\n<p>Isso pode nem sempre ser o caso, ent\u00e3o voc\u00ea pode precisar tratar esses tipos de situa\u00e7\u00e3o com cuidado.<\/p>\n<p>Como voc\u00ea pode ver, isso n\u00e3o tem nada a ver com o WordPress; no entanto, tem a ver com a l\u00f3gica de teste relacionada especificamente ao dom\u00ednio em quest\u00e3o. Ou seja, a dura\u00e7\u00e3o do cache. E \u00e9 disso que se trata o n\u00facleo do teste de unidade: Testar o comportamento l\u00f3gico das unidades de c\u00f3digo para garantir que as coisas funcionem conforme o esperado.<\/p>\n<p>E dependendo de quando voc\u00ea escreve esse c\u00f3digo, voc\u00ea pode ter testes com falha. Isso pode ajudar no design da classe, mas esse \u00e9 outro t\u00f3pico e n\u00e3o faz parte deste post.<\/p>\n<h2>Executando os testes<\/h2>\n<p>Uma vez que os testes s\u00e3o escritos, \u00e9 importante poder execut\u00e1-los para ver se eles passam, se falham, o que passa e o que n\u00e3o. Mas ainda n\u00e3o terminamos. Eu quero fornecer uma vis\u00e3o abrangente dos testes de unidade no contexto do WordPress e discutir o que o WordPress fornece, o que n\u00e3o oferece, alguns equ\u00edvocos e como executar esses testes no terminal ou no Visual Studio Code.<\/p>\n<p>No pr\u00f3ximo post desta s\u00e9rie, veremos a fun\u00e7\u00e3o <strong>tearDown<\/strong> e como (e quando) us\u00e1-la, quando \u00e9 necess\u00e1rio, quando n\u00e3o \u00e9, e ent\u00e3o vamos dar uma olhada em torno da unidade testes no WordPress em geral.<\/p>\n<p>Em \u00faltima an\u00e1lise, estamos trabalhando para obter uma vis\u00e3o completa de como fazer isso e como faz\u00ea-lo corretamente. Mas \u00e9 importante estabelecer as bases para isso e faz\u00ea-lo ao longo de alguns postes \u00e9 mais f\u00e1cil do que em um post monol\u00edtico.<\/p>\n<p>Portanto, examinar <strong>tearDown()<\/strong>, seu uso e como executar testes a partir da linha de comando ser\u00e1 o t\u00f3pico do pr\u00f3ximo post desta s\u00e9rie.<\/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 para come\u00e7ar a escrever testes PHPUnit atrav\u00e9s do uso de um cache b\u00e1sico e usando o m\u00e9todo setUp do framework.<\/p>\n","protected":false},"author":1,"featured_media":164224,"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-230460","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\/230460","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=230460"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230460\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/164224"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230460"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230460"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}