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

Bloquear .env e .git no nginx: as regras que ainda deixam o arquivo vazar

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…

2 dias atrás

Canonical errado no Yoast: corrigindo pelo filtro wpseo_canonical

O Search Console marca suas páginas 2, 3 e 4 como alternativas da página 1? Ajuste a tag canônica do…

2 dias atrás

Layout XML do Magento 2: remover bloco de módulo de terceiro

Um módulo de terceiro plantou um banner no topo da loja e você não quer desinstalar nada: tire o bloco…

2 dias atrás

Restaurar dump do Magento 2 em outro servidor: trocar a base_url no SQL

Importou o banco de produção e o site pula para o domínio antigo? Rode o UPDATE em core_config_data, limpe o…

3 dias atrás

Criar exceção customizada em PHP: quando estender Exception compensa

Seu catch trata pedido inexistente e banco fora do ar do mesmo jeito. Veja como criar exceção customizada em PHP…

4 dias atrás

DataProvider Magento 2: form do admin abre com campos vazios ao editar

O form do admin salva mas abre em branco na edição: veja o getData() indexado pelo id da entidade e…

5 dias atrás