Uma introdução ao teste automatizado de plugins do WordPress com PHPUnit
Publicados: 2022-03-10O WordPress é um sistema de gerenciamento de conteúdo popular para a construção de sites porque é fácil de começar e uma tonelada de temas e plugins estão disponíveis para estender seu conjunto de recursos. A principal razão pela qual o WordPress tem muitos plugins e temas é porque é fácil para desenvolvedores de qualquer nível começar a construir um. A maioria de seus desenvolvedores não são experientes e não escrevem testes para seu trabalho, talvez pelos seguintes motivos:
- Não há muitas discussões acontecendo sobre testes de unidade, então eles podem não saber que o teste é possível.
- Eles não acreditam no valor de escrever testes para seu código, ou acham que isso os atrasará.
- Eles acreditam que testar para ver se o plugin ou tema funciona no navegador é suficiente.
Neste tutorial, vamos aprender o que é teste automatizado e sua importância, conhecer PHPUnit e WP-CLI, aprender a escrever um teste e, por fim, configurar testes automatizados contínuos com o Travis CI.
Estamos optando por usar o Travis CI porque ele oferece integração perfeita com o GitHub; você não precisa ir ao seu repositório e configurar nenhuma conexão entre eles. E é gratuito para repositórios públicos. Ao contrário de seus concorrentes, como Semaphore CI, GitLab CI e CircleCI, o Travis CI não oferece um plano de repositório privado gratuito. No entanto, nenhum de seus concorrentes oferece integração perfeita com o GitHub.
O que é teste automatizado?
De acordo com a Wikipedia, teste automatizado, ou automação de teste, é o uso de software especial (separado do software que está sendo testado) para controlar a execução de testes e a comparação dos resultados reais com os resultados previstos. A automação de teste pode automatizar algumas tarefas repetitivas, mas necessárias, em um processo de teste formalizado já implementado ou realizar testes adicionais que seriam difíceis de fazer manualmente.
Existem vários tipos de testes. De todos, o teste de unidade é o mais popular. Os testes de unidade verificam se um bloco de código, função ou método de classe faz o que se destina a fazer. Faremos testes de unidade neste tutorial.
O teste automatizado ajuda a detectar bugs para que eles não cheguem à produção. Sem dúvida, um plugin codificado e testado levaria mais tempo para ser concluído do que um que não foi testado. No entanto, o plugin resultante conteria menos ou nenhum bug.
Vamos ver um exemplo simples do mundo real de como os testes de unidade são inestimáveis e para que podemos usá-los.
Meu plugin de geração de leads do WordPress tem uma classe OptinThemesRepository
, com um método add()
para adicionar novos modelos de formulário opt-in e um método get()
para a recuperação de um modelo de formulário opt-in.
Para garantir que add()
e get()
funcionem como pretendido agora e no futuro, escrevi o teste abaixo.
public function testAddGetMethods() { $kick_optin_form = array( 'name' => 'Kick', 'optin_class' => 'kick', 'optin_type' => 'kick', 'screenshot' => MAILOPTIN_ASSETS_URL . 'img/kick.png' ); // add kick optin theme OptinThemesRepository::add($kick_optin_form); $result = OptinThemesRepository::get('kick'); $this->assertEquals($kick_optin_form, $result); }
Se, no futuro, este teste começar a falhar, eu saberia que há um problema e saberia a função exata, método de classe ou ponto no meu plugin onde ele está ocorrendo.
Benefícios dos testes automatizados
Agora que sabemos o que é o teste automatizado, vamos ver mais benefícios.
Detecção antecipada de bugs
Ao desenvolver software, você pode encontrar facilmente bugs com ferramentas de teste automatizadas. Isso pode economizar muito tempo e esforço no rastreamento de bugs.
Maior qualidade de software
Um testador com muitos anos de experiência pode cometer erros quando tiver que preparar os mesmos scripts de teste manual chatos repetidamente. Os testes automatizados não apenas produzem resultados precisos, mas também economizam tempo.
Relatórios fáceis e robustos
As ferramentas de teste automatizadas podem rastrear cada script de teste. A execução de cada script de teste pode ser vista em logs visuais. O log visual, ou relatório, normalmente exibe o número de scripts de teste executados e seu status (por exemplo, aprovado, reprovado ou ignorado), seus bugs relatados e dicas sobre como corrigi-los.
Antes de falarmos sobre como configurar e escrever testes, vamos criar um plugin simples para usar como estudo de caso.
Construindo um plugin WordPress
Vamos construir um plugin simples que exibe as metatags de verificação de webmasters do Google e do Bing no cabeçalho do front-end do WordPress. O plugin está hospedado na minha conta do GitHub.
O código para este plugin abaixo irá para o arquivo wp-meta-verify.php
.
<?php class WP_Meta_Verify { public function __construct() { add_action('wp_head', \[$this, 'header_code']); } public function header_code() { $google_code = get_option('wpmv_google_code'); $bing_code = get_option('wpmv_google_code'); echo $this->google_site_verification($google_code); echo $this->bing_site_verification($bing_code); } public function google_site_verification($code) { return "<meta name=\"google-site-verification\" content=\"$code\">"; } public function bing_site_verification($code) { return "<meta name=\"msvalidate.01\" content=\"$code\">"; } } new WP_Meta_Verify();
Você pode notar que não incluímos uma página de configurações no plug-in, onde você normalmente salvaria o código de verificação do Google e do Bing. Fiz isso de propósito para manter isso simples e focar nossa atenção no que mais importa. No entanto, get_option('wpmv_google_code')
e get_option('wpmv_bing_code')
assumem que existe uma página de configurações e recuperam os códigos de verificação de lá.
Teste de unidade de um plugin do WordPress
PHPUnit é a ferramenta de teste de fato para PHP, enquanto WP-CLI é a interface de linha de comando oficial para WordPress.
Antes do WP-CLI, configurar o teste PHPUnit para plugins do WordPress era uma dor. O WP-CLI tem um ótimo guia para configurá-lo; no entanto, ainda vamos repassar as etapas aqui.
Instalar PHPUnit
Para instalar o PHPUnit, execute os seguintes comandos.
composer global require phpunit/phpunit:5.*
Nota: Estamos instalando explicitamente o 5.x
porque é isso que o WordPress suporta quando você está executando o PHP 7 ou superior, que eu tenho na minha máquina. Instale o PHPUnit 4.8 se você estiver executando o PHP versão 5.
Execute phpunit --version
para confirmar que foi instalado.
Instale o WP-CLI
Para instalar o WP-CLI, execute os comandos a seguir.
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar chmod +x wp-cli.phar sudo mv wp-cli.phar /usr/local/bin/wp
Execute wp --info
para confirmar sua instalação.
Tendo instalado o PHPUnit e o WP-CLI, usaremos este último para configurar o teste de unidade para o plugin.
Configurar teste de unidade de plug-in
Altere o diretório do seu terminal para a raiz da sua instalação do WordPress e execute o comando abaixo para gerar os arquivos de teste do plugin.
wp scaffold plugin-tests wp-meta-verify
Abaixo está como ficará a estrutura do plugin após o comando acima gerar os arquivos de teste.
|-bin/ |----install-wp-tests.sh |-tests/ |----bootstrap.php |----test-sample.php |-.travis.yml |-phpcs.xml.dist |-phpunit.xml.dist |-wp-meta-verify.php
Nota: Por padrão, o comando wp scaffold plugin-tests
gera um arquivo de configuração do Travis CI. Você pode especificar um sinalizador --ci
para gerar um arquivo de configuração para o serviço CI que você usa, assim: wp scaffold plugin-tests --c gitlab
. No momento em que escrevo, apenas Travis CI, CircleCI e GitLab CI são suportados.
Altere o diretório do seu terminal para o diretório do seu plugin e execute o script de instalação:
cd path-to-wordpress-plugin
bin/install-wp-tests.sh wordpress_test root '' localhost latest
Se você é como eu, seu nome de usuário do MySQL não é root
e a senha não está vazia. Por exemplo, suponha que o nome de usuário seja homestead
e a senha seja secret
. Você executaria o script de instalação assim:
bin/install-wp-tests.sh wordpress_test homestead 'secret' localhost latest
Execute o comando phpunit
para executar o teste padrão em tests/test-sample.php
.
Escreva nossos testes de plug-in
Crie um arquivo test-wp-meta-verify.php
na pasta de tests
. Ele conterá nossos testes de plugin com a seguinte classe setUp
.
<?php class WP_Meta_VerifyTest extends WP_UnitTestCase { public function setUp() { parent::setUp(); $this->class_instance = new WP_Meta_Verify(); } public function test_google_site_verification() { } public function test_bing_site_verification() { } }
Vale ressaltar que para que um método seja considerado um teste unitário, ele deve ser prefixado com test
. Uma prática recomendada é adicionar um sufixo de Test
a cada classe de teste, embora não seja obrigatório. Consulte WP_Meta_VerifyTest
.
Confuso sobre o que setUp()
faz? Apenas saiba que o PHPUnit o executa uma vez antes de cada método de teste (e em novas instâncias) da classe de caso de teste. Há também tearDown()
, mas é executado após cada método de teste. Há também setUpBeforeClass()
e tearDownAfterClass()
, que são executados antes e depois de cada caso de teste, respectivamente. Um caso de teste é basicamente uma classe que contém vários métodos de teste. Consulte o Manual do WordPress e a documentação do PHPUnit para obter mais informações.
Da classe acima, é bastante óbvio que vamos escrever testes para os métodos google_site_verification
e bing_site_verification
da nossa classe de plugins.
public function test_google_site_verification() { $meta_tag = $this->class_instance->google_site_verification('B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g'); $expected = '<meta name="google-site-verification" content="B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g">'; $this->assertEquals($expected, $meta_tag); }
public function test_bing_site_verification() { $meta_tag = $this->class_instance->bing_site_verification('B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g'); $expected = '<meta name="msvalidate.01" content="B6wFaCRbzWE42SyxSvKUOyyPxZfJCb5g">'; $this->assertEquals($expected, $meta_tag); }
Basicamente, os testes garantirão que ambos os métodos retornem a metatag correta quando os códigos de verificação do webmaster do Google e do Bing forem passados a eles como argumentos.
Execute phpunit
e você deverá ver uma saída semelhante à captura de tela abaixo.
Testes automatizados contínuos com Travis CI
O Travis CI é um serviço de integração contínua distribuído e hospedado usado para criar e testar projetos de software hospedados no GitHub.
Para usar o Travis CI, portanto, temos que publicar nosso plugin no GitHub. Vá em frente e faça isso agora. Sinta-se livre para se referir ao meu.
Graças ao WP-CLI, já o configuramos em nosso plugin, cortesia do arquivo .travis.yml
.
Gostaria de mencionar que não aderi aos padrões de codificação do WordPress, mas sim às Recomendações dos Padrões do PHP, e meus plugins exigem pelo menos o PHP 5.4. Para que minhas compilações não falhem, tive que substituir sua matriz pela seguinte no arquivo .travis.yml
.
matrix: include: - php: 7.1 env: WP_VERSION=latest - php: 7.0 env: WP_VERSION=latest - php: 5.6 env: WP_VERSION=latest - php: 5.6 env: WP_VERSION=trunk - php: 5.5 env: WP_VERSION=latest - php: 5.4 env: WP_VERSION=latest
Vá até o Travis CI e faça login com sua conta do GitHub. Siga o guia na tela para adicionar seu repositório GitHub.
Após a sincronização da conta com o GitHub, role até o repositório do seu plugin e ative.
Na próxima vez que você fizer uma alteração de código e enviar para o GitHub, uma compilação será acionada no Travis CI.
Eu disponibilizei um resultado de construção bem sucedido para seu prazer de visualização.
Empacotando
Não é segredo que muitos desenvolvedores, não apenas os do WordPress, não escrevem testes para seus projetos porque não os conhecem. Mesmo alguns dos mais experientes e avançados entre nós aparentemente não o fazem porque consideram uma perda de tempo.
É verdade que configurar testes automatizados pode ser chato e demorado. No entanto, é um investimento que garantirá que poucos ou nenhum bug se infiltrem em seu software, economizando tempo e recursos (incluindo financeiros) que os bugs em seu software teriam custado.
Sempre escreva um teste antes de implementar um recurso, para que você não se esqueça ou fique com preguiça de fazê-lo depois que o recurso for implementado.
Espero que agora você reconheça a importância de escrever testes e como começar a escrever um para seu próprio plugin WordPress.
Se você tiver alguma dúvida ou comentário, por favor, deixe-me saber na seção de comentários.