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): 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));
}
}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.