Inteligência Artificial

Caso de teste PHPUnit a partir do bug: do relato solto para o teste que falha

O chamado chegou assim: “o cupom de 10% está tirando 10 reais em vez de 10%”. Sem número de pedido, sem print, sem passo a passo. Antes de abrir o arquivo da calculadora eu transformo esse texto em algo que reclama sozinho: um caso de teste que falha com o código de hoje.

O que colar junto com o relato

O texto do chamado sozinho não vira teste. Eu junto três coisas: o relato literal, a assinatura do método suspeito e o namespace onde o teste vai morar. Aí peço um caso PHPUnit que reproduza a falha, sem mock e sem banco.

// a assinatura que eu colo junto do relato
public function aplicar(float $subtotal, string $tipo, float $valor): float

O que volta é um esqueleto que eu ainda leio linha por linha. Escolhi 250 reais de propósito: com subtotal de 100 o bug some, porque 10% e 10 reais dão o mesmo valor e o teste passa mentindo.

<?php
namespace TestsUnitCupom;

use AppCupomCalculadora;
use PHPUnitFrameworkTestCase;

final class CalculadoraTest extends TestCase
{
    public function testPercentualNaoPodeVirarValorFixo(): void
    {
        $calc = new Calculadora();

        $this->assertSame(225.0, $calc->aplicar(250.0, 'percent', 10.0));
    }
}

Só aceito o teste se ele falhar

./vendor/bin/phpunit --filter testPercentualNaoPodeVirarValorFixo

F                                                                   1 / 1 (100%)

There was 1 failure:

1) TestsUnitCupomCalculadoraTest::testPercentualNaoPodeVirarValorFixo
Failed asserting that 240.0 is identical to 225.0.

/var/www/loja/tests/Unit/Cupom/CalculadoraTest.php:14

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

É essa saída vermelha que eu quero: voltou 240,00, o desconto virou valor fixo mesmo. Se o teste passa de primeira, tenho duas opções e nenhuma é comemorar. Ou ele não reproduz o que o cliente viu, ou o defeito está em outro canto, tipo arredondamento na hora de exibir o carrinho.

Cuidado com o assertSame em float: ele só serve aqui porque 250 menos 10% cai exato em 225.0. Em conta como 19,90 vezes 3, use assertEqualsWithDelta(59.7, $real, 0.001), senão o teste falha por dízima binária e você caça bug onde não tem.

Só depois do vermelho eu mexo na Calculadora. Quando o mesmo comando fica verde sem eu ter tocado no teste, o chamado está resolvido com prova e o próximo deploy não devolve o bug de brinde.

Post Recentes

CLAUDE.md para projeto WordPress: as regras que evitam o Claude Code quebrar o tema

O CLAUDE.md que funciona em projeto WordPress é curto: versões, onde o Claude Code pode mexer, comandos do projeto e…

9 horas atrás

YouTube sem cookie: adiar o embed do vídeo e do Maps até o aceite

Seu banner de consentimento está certo, mas o vídeo incorporado grava cookie de terceiro no primeiro carregamento. Troque o domínio…

1 dia atrás

Custom post type dando 404: flush_rewrite_rules na ativação do plugin

A listagem do custom post type abre e o single dá 404 no WordPress 6.9. Entenda o cache das rewrite…

3 dias atrás

systemd timer no lugar do cron: agendar script com log e sem execução dupla

Um par .service e .timer substitui a linha do crontab com log no journal, execução perdida recuperada no boot e…

3 dias atrás

Descrição em massa no WooCommerce: wp eval-file lendo a lista de SKUs

400 produtos importados do fornecedor com a aba Descrição vazia. Um wp eval-file percorre os SKUs sem texto, grava pelo…

3 dias atrás

Frete grátis no WooCommerce: esconder as outras opções de entrega

Some com PAC e SEDEX da lista quando o frete grátis está disponível, usando woocommerce_package_rates, e limpe o cache de…

4 dias atrás