Imported from manorfm/toToggle (
server/.claude/skills/unit-testing-testify/SKILL.md). Install upstream withnpx skills add manorfm/toToggle --skill unit-testing-testify. Copyright stays with the author.
Unit Testing in Go
Como aplicar testes na aplicação Go existente.
-
Bibliotecas:
- Utilize o pacote de asserts do
testify(github.com/stretchr/testify/assert) ao invés do pacote cru nativo para asserções mais legíveis.
- Utilize o pacote de asserts do
-
Nomenclatura:
- Coloque seus testes no arquivo adjunto ex:
toggle_usecase_test.gopara o arquivotoggle_usecase.go.
- Coloque seus testes no arquivo adjunto ex:
-
Estrutura Table-Driven:
- Para métodos que possuem múltiplos caminhos (Sucesso vs. Falhas), organize usando Table-Driven Tests (
[]struct{name string, ...}). - Sempre utilize mocks (
testify/mock) para isolar camadas. Exemplo: Para testar umUsecase, instancie seuRepositorycomo um struct tipo Mock para simular respostas do banco.
- Para métodos que possuem múltiplos caminhos (Sucesso vs. Falhas), organize usando Table-Driven Tests (
-
Cobertura mínima:
- Toda função nova em
usecase/ehandler/precisa de pelo menos um teste de sucesso e um de falha (validação/erro de repositório) — não é aceitável adicionar lógica de negócio sem teste correspondente no mesmo commit. - Rode
go test -coverprofile=coverage.out ./... && go tool cover -func=coverage.outantes de considerar uma tarefa concluída se a mudança tocouusecase/,handler/oudomain/entity/.
- Toda função nova em
-
Testes de integração de handler:
- Para fluxos que atravessam handler → usecase → repositório (ex.: criação de toggle com regra
de ativação), prefira um teste usando
net/http/httptest+gorm.Open(sqlite.Open(":memory:"))com as migrations aplicadas, em vez de mockar cada camada — GORM+SQLite in-memory já é rápido o suficiente para isso e pega bugs de mapeamento que um mock esconde. - Não abuse disso: lógica pura de validação/regra continua sendo teste unitário isolado (regra 3).
- Para fluxos que atravessam handler → usecase → repositório (ex.: criação de toggle com regra
de ativação), prefira um teste usando
-
Testes não devem ser flaky nem depender de ordem:
- Nunca dependa de estado deixado por outro teste (
db/toggles.dbreal, contadores globais). Cada teste cria seu próprio banco in-memory ou mock isolado. - Nunca use
time.Sleeppara sincronizar; se há concorrência, sincronize via canal/WaitGroup.
- Nunca dependa de estado deixado por outro teste (