{"id":36,"date":"2022-11-14T10:45:00","date_gmt":"2022-11-14T13:45:00","guid":{"rendered":"http:\/\/marcosmarcolin.com.br\/dev\/?p=36"},"modified":"2022-12-01T20:13:29","modified_gmt":"2022-12-01T23:13:29","slug":"como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real","status":"publish","type":"post","link":"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/","title":{"rendered":"Como otimizar a gera\u00e7\u00e3o de cobertura de testes em PHP? Um caso real."},"content":{"rendered":"\n<p><strong>O problema<\/strong><\/p>\n\n\n\n<p>Est\u00e1vamos com lentid\u00e3o para gerar a cobertura de testes PHP nas pipelines do GitLab, ou mesmo localmente usando Docker. Sempre foi utilizado o Xdebug para fazer esse trabalho, mas conforme o projeto cresce, os testes aumentam e o trabalho vai ficando lento, e isso \u00e9 um custo para a empresa(recursos computacionais e desenvolvedores).<\/p>\n\n\n\n<p>Para otimizar, realizamos algumas pesquisas para tentar diminuir o tempo de execu\u00e7\u00e3o e encontramos v\u00e1rias fontes que est\u00e3o citadas no final deste artigo.<\/p>\n\n\n\n<p>Hoje, o&nbsp;<em>driver<\/em>&nbsp;mais famoso para fazer esse trabalho \u00e9 o&nbsp;<a href=\"https:\/\/xdebug.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Xdebug<\/a>&nbsp;do&nbsp;<a href=\"https:\/\/www.linkedin.com\/in\/derickrethans?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAACWzQBgPGigjzCP_AMpcroI15deLvEZKo\" target=\"_blank\" rel=\"noreferrer noopener\">Derick Rethans<\/a>, inevitavelmente. Existem outros n\u00e3o t\u00e3o novos como o&nbsp;<a href=\"https:\/\/www.php.net\/manual\/pt_BR\/book.phpdbg.php\" target=\"_blank\" rel=\"noreferrer noopener\">PHPDBG<\/a>&nbsp;e&nbsp;<a href=\"https:\/\/pecl.php.net\/package\/pcov\" target=\"_blank\" rel=\"noreferrer noopener\">PCov<\/a>, que s\u00e3o interessantes para o uso.<\/p>\n\n\n\n<p><strong>Xdebug &#8211; Debugger and Profiler Tool for PHP<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>Xdebug \u00e9 uma extens\u00e3o para PHP e fornece uma variedade de recursos para melhorar a experi\u00eancia de desenvolvimento PHP.<\/p>\n<\/blockquote>\n\n\n\n<p>Antes de mostrar os resultados, preciso citar que o Xdebug n\u00e3o realiza apenas a fun\u00e7\u00e3o de gerar cobertura de c\u00f3digo, ele \u00e9 um depurador de alto n\u00edvel, que est\u00e1 entre os melhores de todas as linguagens de programa\u00e7\u00e3o, inquestion\u00e1vel. Por isso, n\u00e3o podemos questionar sua efetividade, mas sua performance, neste caso sim.<\/p>\n\n\n\n<p><strong>PHPDBG &#8211; The Interactive PHP Debugger<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>phpdbg pretende ser uma plataforma de depura\u00e7\u00e3o leve, poderosa e f\u00e1cil de usar.<\/p>\n<\/blockquote>\n\n\n\n<p>Este&nbsp;<em>driver<\/em>&nbsp;se mostrou muito efetivo e r\u00e1pido sua execu\u00e7\u00e3o, por\u00e9m enfrentamos alguns problemas em seu uso relacionado \u00e0 algumas caracter\u00edsticas da nossa base de c\u00f3digo. Suspeito que seja conflito com outra extens\u00e3o que utilizamos, mas n\u00e3o vem ao caso.<\/p>\n\n\n\n<p>Executando as&nbsp;<em>tests su\u00edtes&nbsp;<\/em>separadas, mostrou-se muito mais r\u00e1pido que o Xdebug.<\/p>\n\n\n\n<p>Tamb\u00e9m,&nbsp;<strong>este&nbsp;<\/strong><strong><em>driver<\/em><\/strong><strong>&nbsp;parece n\u00e3o ser mais mantido e sua \u00faltima vers\u00e3o foi lan\u00e7ada em 2013<\/strong>, ent\u00e3o leve em considera\u00e7\u00e3o isso antes de utilizar.<\/p>\n\n\n\n<p><strong>PCOV &#8211; CodeCoverage compatible driver for PHP<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>Um driver compat\u00edvel com cobertura de c\u00f3digo php independente para PHP.<\/p>\n<\/blockquote>\n\n\n\n<p>Com o PCov foi diferente, tivemos total compatibilidade com um de nossos projetos, que \u00e9 o caso real deste artigo. N\u00e3o vou entrar no m\u00e9rito de instala\u00e7\u00e3o e execu\u00e7\u00e3o, isso voc\u00ea encontra facilmente por a\u00ed, mas caso tenha d\u00favida pode me chamar.<\/p>\n\n\n\n<p>O Pcov do&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/krakjoe\" target=\"_blank\">Joe Watkins<\/a>&nbsp;e&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/remicollet\" target=\"_blank\">Remi Collet<\/a>&nbsp;foi desenvolvido exatamente para isso,&nbsp;<strong>cobertura de c\u00f3digo<\/strong>. Ent\u00e3o, ele n\u00e3o se preocupa com outros trabalhos, comparado ao Xdebug.<\/p>\n\n\n\n<p><strong>Este&nbsp;<\/strong><strong><em>driver<\/em><\/strong><strong>&nbsp;ainda \u00e9 mantido e sua \u00faltima vers\u00e3o foi lan\u00e7ada em 12\/2021<\/strong>, ent\u00e3o leve em considera\u00e7\u00e3o isso antes de utilizar.<\/p>\n\n\n\n<p><strong>PHPUnit &#8211; The PHP Testing Framework<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>PHPUnit \u00e9 uma estrutura de teste orientada ao programador para PHP. \u00c9 uma inst\u00e2ncia da arquitetura xUnit para estruturas de teste de unidade.<\/p>\n<\/blockquote>\n\n\n\n<p>A maioria das empresas utiliza essa estrutura para execu\u00e7\u00e3o dos testes, logo, poder\u00edamos afirmar que est\u00e1 pode ser a estrutura oficial do PHP.<\/p>\n\n\n\n<p>O&nbsp;<em>framework<\/em>&nbsp;\u00e9 compat\u00edvel com todos os&nbsp;<em>drivers<\/em>&nbsp;citados neste artigo.<\/p>\n\n\n\n<p><strong>Resultados<\/strong><\/p>\n\n\n\n<p>Realizamos v\u00e1rios testes em ambiente local com a&nbsp;<em>stack<\/em>:&nbsp;<strong>Docker + Debian Buster + PHP 7.3.x + MariaDB 10.3.x + PHPUnit 9.5.x<\/strong>&nbsp;e tamb\u00e9m no&nbsp;<strong>GitLab<\/strong>. Rodando testes unit\u00e1rios e de integra\u00e7\u00e3o em uma grande su\u00edte de testes.<\/p>\n\n\n\n<p>Mostrarei os resultados comparativos de execu\u00e7\u00e3o no GitLab, que \u00e9 a ferramenta de CI\/CD que utilizamos para gerenciar e entregar a maioria de nossos projetos.<\/p>\n\n\n\n<p><em>Xdebug&nbsp;<\/em>v2.7.0<em>&nbsp;x PCov&nbsp;<\/em>1.0.11<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/media-exp1.licdn.com\/dms\/image\/D4D12AQF2o4TCQkHf3w\/article-inline_image-shrink_1500_2232\/0\/1668259305780?e=1674691200&amp;v=beta&amp;t=do2hKLV99qqGCgacX9-ICLuOeQFHqX-5TKByVUAza-A\" alt=\"N\u00e3o foi fornecido texto alternativo para esta imagem\"\/><figcaption class=\"wp-element-caption\">Apenas execu\u00e7\u00e3o dos testes<\/figcaption><\/figure>\n\n\n\n<p>Na imagem acima, \u00e9 poss\u00edvel perceber que tem 1 dia de diferen\u00e7a para a execu\u00e7\u00e3o, mas nada que influencie o resultado final.<\/p>\n\n\n\n<p>O resultado para n\u00f3s j\u00e1 \u00e9 excepcional,&nbsp;<strong>reduzindo em quase 10 minutos o tempo de execu\u00e7\u00e3o.<\/strong><\/p>\n\n\n\n<p><em>Xdebug x PCov<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/media-exp1.licdn.com\/dms\/image\/D4D12AQEbK9tdHwz27Q\/article-inline_image-shrink_1500_2232\/0\/1668259564168?e=1674691200&amp;v=beta&amp;t=HIQjv8sVDjyqDfI2Mf2XBeo3yNXc411eTlEaNhzFWKU\" alt=\"N\u00e3o foi fornecido texto alternativo para esta imagem\"\/><figcaption class=\"wp-element-caption\">Execu\u00e7\u00e3o da pipeline completa<\/figcaption><\/figure>\n\n\n\n<p>Acima, o resultado da execu\u00e7\u00e3o da pipeline completa.<\/p>\n\n\n\n<p>Pontos a destacar da imagem acima:<\/p>\n\n\n\n<ol>\n<li><strong>Tempo de execu\u00e7\u00e3o:<\/strong>&nbsp;de 17.5 minutos para quase 6.5 minutos, s\u00e3o quase 11 minutos de diferen\u00e7a.<\/li>\n\n\n\n<li><strong>Coverage:<\/strong>&nbsp;quase inexpress\u00edvel, est\u00e1 na mesma casa decimal. Digamos que baixou de 70.65 para 70.62. N\u00e3o posso mostrar o valor real, \u00e9 reservado \u00e0 empresa.<\/li>\n<\/ol>\n\n\n\n<p><strong>Conclus\u00e3o<\/strong><\/p>\n\n\n\n<p>Sendo assim, tivemos como resultado que para o nosso caso de uso compensa e muito alterar o&nbsp;<em>driver<\/em>&nbsp;de&nbsp;<em>coverage<\/em>, afetando em quase nada o resultado final de cobertura. Mas talvez, para o seu caso seja diferente, pois n\u00e3o existe uma solu\u00e7\u00e3o m\u00e1gica.<\/p>\n\n\n\n<p>Devo refor\u00e7ar tamb\u00e9m, que n\u00e3o estou comparando as ferramentas, mas sim o resultado final delas.<\/p>\n\n\n\n<p>Eu, pessoalmente, indico voc\u00ea continuar usando o Xdebug caso estiver rodando uma su\u00edte de testes pequena, sem testes de integra\u00e7\u00e3o ou lentos. Por\u00e9m, se voc\u00ea tiver um projeto grande, com uma boa parte legada por exemplo, a utiliza\u00e7\u00e3o do PCov ou PHPDBG vai ser mais vantajosa, mas como citei no in\u00edcio, o quanto isso custa para o seu neg\u00f3cio?<\/p>\n\n\n\n<p>Abra\u00e7os e at\u00e9 a pr\u00f3xima!<\/p>\n\n\n\n<p><strong>Refer\u00eancias<\/strong><\/p>\n\n\n\n<ol>\n<li>https:\/\/dev.to\/swashata\/setup-php-pcov-for-5-times-faster-phpunit-code-coverage-3d9c<\/li>\n\n\n\n<li>https:\/\/medium.com\/hackernoon\/generating-code-coverage-with-phpunite-and-phpdbg-4d20347ffb45<\/li>\n\n\n\n<li>https:\/\/mixable.blog\/phpunit-faster-and-better-unit-tests-with-pcov\/<\/li>\n\n\n\n<li>https:\/\/geshan.com.np\/blog\/2020\/11\/phpunit-code-coverage-pcov\/<\/li>\n\n\n\n<li>https:\/\/phpunit.readthedocs.io\/en\/9.5\/code-coverage-analysis.html<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um caso real sobre otimiza\u00e7\u00e3o de pipelines para gera\u00e7\u00e3o de cobertura de c\u00f3digo.<\/p>\n","protected":false},"author":1,"featured_media":38,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[11],"tags":[12,10,9,5,6,4,8,7],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.2.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Como otimizar a gera\u00e7\u00e3o de cobertura de testes em PHP? Um caso real. - Blog do Marcolin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como otimizar a gera\u00e7\u00e3o de cobertura de testes em PHP? Um caso real. - Blog do Marcolin\" \/>\n<meta property=\"og:description\" content=\"Um caso real sobre otimiza\u00e7\u00e3o de pipelines para gera\u00e7\u00e3o de cobertura de c\u00f3digo.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog do Marcolin\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-14T13:45:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-12-01T23:13:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/marcosmarcolin.com.br\/dev\/wp-content\/uploads\/2022\/11\/1668261285077-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"500\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Marcos Marcolin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@marcolindev\" \/>\n<meta name=\"twitter:site\" content=\"@marcolindev\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marcos Marcolin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/\"},\"author\":{\"name\":\"Marcos Marcolin\",\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/6dc65ed86bf2212dfa12c6fcfb106afc\"},\"headline\":\"Como otimizar a gera\u00e7\u00e3o de cobertura de testes em PHP? Um caso real.\",\"datePublished\":\"2022-11-14T13:45:00+00:00\",\"dateModified\":\"2022-12-01T23:13:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/\"},\"wordCount\":897,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/6dc65ed86bf2212dfa12c6fcfb106afc\"},\"keywords\":[\"coverage\",\"docker\",\"gitlab\",\"mysql\",\"pcov\",\"php\",\"phpunit\",\"xdebug\"],\"articleSection\":[\"PHP\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/\",\"url\":\"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/\",\"name\":\"Como otimizar a gera\u00e7\u00e3o de cobertura de testes em PHP? Um caso real. - Blog do Marcolin\",\"isPartOf\":{\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/#website\"},\"datePublished\":\"2022-11-14T13:45:00+00:00\",\"dateModified\":\"2022-12-01T23:13:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\/\/marcosmarcolin.com.br\/dev\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Como otimizar a gera\u00e7\u00e3o de cobertura de testes em PHP? Um caso real.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/#website\",\"url\":\"https:\/\/marcosmarcolin.com.br\/dev\/\",\"name\":\"Blog do Marcolin\",\"description\":\"PHP &amp; DevOps\",\"publisher\":{\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/6dc65ed86bf2212dfa12c6fcfb106afc\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/marcosmarcolin.com.br\/dev\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/6dc65ed86bf2212dfa12c6fcfb106afc\",\"name\":\"Marcos Marcolin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/marcosmarcolin.com.br\/dev\/wp-content\/uploads\/2022\/11\/20190113_104622-scaled.jpg\",\"contentUrl\":\"https:\/\/marcosmarcolin.com.br\/dev\/wp-content\/uploads\/2022\/11\/20190113_104622-scaled.jpg\",\"width\":1920,\"height\":2560,\"caption\":\"Marcos Marcolin\"},\"logo\":{\"@id\":\"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/image\/\"},\"description\":\"Desenvolvedor PHP.\",\"sameAs\":[\"http:\/\/marcosmarcolin.com.br\/dev\",\"https:\/\/www.instagram.com\/marcosmarcolin\/\",\"https:\/\/www.linkedin.com\/in\/marcosmarcolin\/\",\"https:\/\/twitter.com\/marcolindev\"],\"url\":\"https:\/\/marcosmarcolin.com.br\/dev\/author\/marcolindev\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Como otimizar a gera\u00e7\u00e3o de cobertura de testes em PHP? Um caso real. - Blog do Marcolin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/","og_locale":"pt_BR","og_type":"article","og_title":"Como otimizar a gera\u00e7\u00e3o de cobertura de testes em PHP? Um caso real. - Blog do Marcolin","og_description":"Um caso real sobre otimiza\u00e7\u00e3o de pipelines para gera\u00e7\u00e3o de cobertura de c\u00f3digo.","og_url":"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/","og_site_name":"Blog do Marcolin","article_published_time":"2022-11-14T13:45:00+00:00","article_modified_time":"2022-12-01T23:13:29+00:00","og_image":[{"width":960,"height":500,"url":"https:\/\/marcosmarcolin.com.br\/dev\/wp-content\/uploads\/2022\/11\/1668261285077-1.png","type":"image\/png"}],"author":"Marcos Marcolin","twitter_card":"summary_large_image","twitter_creator":"@marcolindev","twitter_site":"@marcolindev","twitter_misc":{"Escrito por":"Marcos Marcolin","Est. tempo de leitura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/#article","isPartOf":{"@id":"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/"},"author":{"name":"Marcos Marcolin","@id":"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/6dc65ed86bf2212dfa12c6fcfb106afc"},"headline":"Como otimizar a gera\u00e7\u00e3o de cobertura de testes em PHP? Um caso real.","datePublished":"2022-11-14T13:45:00+00:00","dateModified":"2022-12-01T23:13:29+00:00","mainEntityOfPage":{"@id":"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/"},"wordCount":897,"commentCount":0,"publisher":{"@id":"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/6dc65ed86bf2212dfa12c6fcfb106afc"},"keywords":["coverage","docker","gitlab","mysql","pcov","php","phpunit","xdebug"],"articleSection":["PHP"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/","url":"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/","name":"Como otimizar a gera\u00e7\u00e3o de cobertura de testes em PHP? Um caso real. - Blog do Marcolin","isPartOf":{"@id":"https:\/\/marcosmarcolin.com.br\/dev\/#website"},"datePublished":"2022-11-14T13:45:00+00:00","dateModified":"2022-12-01T23:13:29+00:00","breadcrumb":{"@id":"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/marcosmarcolin.com.br\/dev\/como-otimizar-a-geracao-de-cobertura-de-testes-em-php-um-caso-real\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/marcosmarcolin.com.br\/dev\/"},{"@type":"ListItem","position":2,"name":"Como otimizar a gera\u00e7\u00e3o de cobertura de testes em PHP? Um caso real."}]},{"@type":"WebSite","@id":"https:\/\/marcosmarcolin.com.br\/dev\/#website","url":"https:\/\/marcosmarcolin.com.br\/dev\/","name":"Blog do Marcolin","description":"PHP &amp; DevOps","publisher":{"@id":"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/6dc65ed86bf2212dfa12c6fcfb106afc"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/marcosmarcolin.com.br\/dev\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":["Person","Organization"],"@id":"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/6dc65ed86bf2212dfa12c6fcfb106afc","name":"Marcos Marcolin","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/image\/","url":"https:\/\/marcosmarcolin.com.br\/dev\/wp-content\/uploads\/2022\/11\/20190113_104622-scaled.jpg","contentUrl":"https:\/\/marcosmarcolin.com.br\/dev\/wp-content\/uploads\/2022\/11\/20190113_104622-scaled.jpg","width":1920,"height":2560,"caption":"Marcos Marcolin"},"logo":{"@id":"https:\/\/marcosmarcolin.com.br\/dev\/#\/schema\/person\/image\/"},"description":"Desenvolvedor PHP.","sameAs":["http:\/\/marcosmarcolin.com.br\/dev","https:\/\/www.instagram.com\/marcosmarcolin\/","https:\/\/www.linkedin.com\/in\/marcosmarcolin\/","https:\/\/twitter.com\/marcolindev"],"url":"https:\/\/marcosmarcolin.com.br\/dev\/author\/marcolindev\/"}]}},"_links":{"self":[{"href":"https:\/\/marcosmarcolin.com.br\/dev\/wp-json\/wp\/v2\/posts\/36"}],"collection":[{"href":"https:\/\/marcosmarcolin.com.br\/dev\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marcosmarcolin.com.br\/dev\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marcosmarcolin.com.br\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marcosmarcolin.com.br\/dev\/wp-json\/wp\/v2\/comments?post=36"}],"version-history":[{"count":4,"href":"https:\/\/marcosmarcolin.com.br\/dev\/wp-json\/wp\/v2\/posts\/36\/revisions"}],"predecessor-version":[{"id":100,"href":"https:\/\/marcosmarcolin.com.br\/dev\/wp-json\/wp\/v2\/posts\/36\/revisions\/100"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/marcosmarcolin.com.br\/dev\/wp-json\/wp\/v2\/media\/38"}],"wp:attachment":[{"href":"https:\/\/marcosmarcolin.com.br\/dev\/wp-json\/wp\/v2\/media?parent=36"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marcosmarcolin.com.br\/dev\/wp-json\/wp\/v2\/categories?post=36"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marcosmarcolin.com.br\/dev\/wp-json\/wp\/v2\/tags?post=36"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}