Por que "testes primeiro" não é masoquismo, mas um superpoder
\n\nImagine: você escreve código, tudo funciona. Você está feliz. Um mês depois, você volta ao projeto, muda uma linha — e tudo quebra. Familiar? Bem-vindo ao clube dos desenvolvedores que não escrevem testes. Agora imagine outra realidade: você altera o código, executa os testes — e em 10 segundos sabe que nada quebrou. Isso não é mágica, é TDD (Test-Driven Development) — desenvolvimento orientado a testes.
\n\nNeste artigo, vamos analisar o TDD usando C# como exemplo. Sem teoria chata. Apenas prática, código e casos reais. Se você acha que TDD é para "arquitetos puristas" ou "monstros corporativos" — você vai se surpreender. É uma ferramenta que salvará seu código e seus nervos.
\n\nO que é TDD e como funciona o Red-Green-Refactor
\n\nTDD não é sobre testes. É sobre design. Você não escreve testes depois do código, mas o contrário: primeiro o teste, depois o código mínimo que o faz passar, e só então a refatoração. Esse ciclo é chamado de Red-Green-Refactor:
\n\n- \n
- Red — escrevemos um teste que certamente não passará (vermelho). \n
- Green — escrevemos o código mínimo para o teste passar (verde). \n
- Refactor — melhoramos o código sem alterar seu comportamento. \n
Parece estranho? Vamos a um exemplo. Suponha que precisamos de uma calculadora com um método de soma. Normalmente, escrevemos a classe, depois o teste. No TDD, é o contrário.
\n\nPasso 1: Red — escrevemos um teste que vai falhar
\n\nusing NUnit.Framework;\n\n[TestFixture]\npublic class CalculatorTests\n{\n [Test]\n public void Add_ShouldReturnSumOfTwoNumbers()\n {\n // Arrange\n var calculator = new Calculator();\n \n // Act\n var result = calculator.Add(2, 3);\n \n // Assert\n Assert.AreEqual(5, result);\n }\n}\n\nExecutamos — o teste falha, porque a classe Calculator não existe. Vermelho é normal. Agora nossa tarefa é ficar verde.
\n\nPasso 2: Green — mínimo de código para o teste passar
\n\npublic class Calculator\n{\n public int Add(int a, int b)\n {\n return a + b; // Implementação mínima\n }\n}\n\nTeste verde. Ufa. Mas o código ainda está feio. Vamos para o passo 3.
\n\nPasso 3: Refactor — melhoramos, mas não quebramos
\n\nNesta etapa, podemos adicionar validações, tratamento de exceções ou alterar a arquitetura. O importante é que os testes continuem verdes.
\n\npublic class Calculator\n{\n public int Add(int a, int b)\n {\n if (a < 0 || b < 0)\n throw new ArgumentException("Only positive numbers allowed");\n return a + b;\n }\n}\n\nO teste vai falhar? Sim. Então, precisamos atualizar o teste ou alterar a lógica. No TDD, a refatoração é sempre um diálogo com os testes.
\n\nComo escolher um framework para TDD em C#: NUnit vs xUnit
\n\nEm C#, existem três frameworks populares: NUnit, xUnit e MSTest. Vamos analisar os dois primeiros, pois são os mais flexíveis.
\n\n| Critério | \nNUnit | \nxUnit | \n
|---|---|---|
| Atributos | \n[Test], [SetUp] | \n[Fact], [Theory] | \n
| Parametrização | \n[TestCase] | \n[InlineData] | \n