zig test em Zig — O que é e Como Usar

zig test em Zig — O que é e Como Usar

Definição

zig test é o comando da toolchain do Zig para executar testes unitários definidos diretamente no código-fonte. Em Zig, testes são declarados com a palavra-chave test dentro de qualquer arquivo .zig — não existe necessidade de framework de testes externo. O compilador extrai automaticamente os blocos de teste, compila-os e executa.

Por que zig test Importa

  1. Testes integrados: Blocos test vivem ao lado do código que testam, facilitando a manutenção.
  2. Sem framework externo: O sistema de testes é parte da linguagem e da toolchain.
  3. Rápido: O compilador só compila o que é necessário para os testes.
  4. Filtros: É possível rodar apenas testes específicos por nome.

Exemplo Prático

Testes Básicos

const std = @import("std");
const expect = std.testing.expect;

fn somar(a: i32, b: i32) i32 {
    return a + b;
}

fn dividir(a: f64, b: f64) !f64 {
    if (b == 0) return error.DivisaoPorZero;
    return a / b;
}

test "somar dois números" {
    try expect(somar(2, 3) == 5);
    try expect(somar(-1, 1) == 0);
}

test "dividir números válidos" {
    const resultado = try dividir(10, 2);
    try expect(resultado == 5.0);
}

test "dividir por zero retorna erro" {
    const resultado = dividir(10, 0);
    try std.testing.expectError(error.DivisaoPorZero, resultado);
}

Executando Testes

# Rodar todos os testes do arquivo
zig test src/math.zig

# Filtrar testes por nome
zig test src/math.zig --test-filter "somar"

# Via sistema de build
zig build test

Testes com Allocator de Teste

const std = @import("std");
const expect = std.testing.expect;

fn duplicarSlice(allocator: std.mem.Allocator, dados: []const u8) ![]u8 {
    const resultado = try allocator.alloc(u8, dados.len * 2);
    @memcpy(resultado[0..dados.len], dados);
    @memcpy(resultado[dados.len..], dados);
    return resultado;
}

test "duplicar slice" {
    // testing.allocator detecta memory leaks automaticamente
    const resultado = try duplicarSlice(std.testing.allocator, "abc");
    defer std.testing.allocator.free(resultado);

    try expect(std.mem.eql(u8, resultado, "abcabc"));
}

Opções do Comando

OpçãoDescrição
--test-filter "nome"Executar apenas testes cujo nome contém a string
--test-cmd ARGPassar argumentos ao executor de testes
-Doptimize=MODETestar em modo de otimização específico
--summary allMostrar resumo detalhado

Armadilhas Comuns

  • Testes em arquivos importados: zig test executa testes do arquivo raiz e todos os módulos importados com @import. Testes em arquivos não importados são ignorados.
  • testing.allocator: Use std.testing.allocator em testes — ele detecta leaks e double-free automaticamente.
  • Efeitos colaterais: Testes devem ser independentes. Evitar estado global mutável entre testes.
  • Testes comptime: Blocos test rodam em runtime. Para validação em comptime, use comptime { ... } com @compileError.

Termos Relacionados

  • zig build — Comando de build que pode executar testes
  • build.zig — Configuração de steps de teste
  • Error Union — Testes com funções que retornam erros
  • Allocator — testing.allocator para detecção de leaks

Tutoriais Relacionados

Continue aprendendo Zig

Explore mais tutoriais e artigos em português para dominar a linguagem Zig.