
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.
Negar /.env no nginx parece resolvido até alguém pedir /wp-content/uploads/.env ou backup.sql. As regras que testei e os furos que…
O Search Console marca suas páginas 2, 3 e 4 como alternativas da página 1? Ajuste a tag canônica do…
Um módulo de terceiro plantou um banner no topo da loja e você não quer desinstalar nada: tire o bloco…
Importou o banco de produção e o site pula para o domínio antigo? Rode o UPDATE em core_config_data, limpe o…
Seu catch trata pedido inexistente e banco fora do ar do mesmo jeito. Veja como criar exceção customizada em PHP…
O form do admin salva mas abre em branco na edição: veja o getData() indexado pelo id da entidade e…