
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 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): floatO 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));
}
}./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.
O CLAUDE.md que funciona em projeto WordPress é curto: versões, onde o Claude Code pode mexer, comandos do projeto e…
Seu banner de consentimento está certo, mas o vídeo incorporado grava cookie de terceiro no primeiro carregamento. Troque o domínio…
A listagem do custom post type abre e o single dá 404 no WordPress 6.9. Entenda o cache das rewrite…
Um par .service e .timer substitui a linha do crontab com log no journal, execução perdida recuperada no boot e…
400 produtos importados do fornecedor com a aba Descrição vazia. Um wp eval-file percorre os SKUs sem texto, grava pelo…
Some com PAC e SEDEX da lista quando o frete grátis está disponível, usando woocommerce_package_rates, e limpe o cache de…