Pular para o conteúdo
Skillpedia
Testes41 mil · #4951

bats-testing-patterns

Ajuda seu agente a testar scripts de shell. É útil para garantir que os scripts funcionem corretamente e para desenvolvimento com testes.

O que ela faz

Este guia ensina como criar testes automáticos para seus scripts de linha de comando (shell scripts) usando uma ferramenta chamada Bats. Ele mostra como verificar se seus scripts funcionam corretamente, lidam com erros e são compatíveis com diferentes ambientes.

Quando usar

  • ✓Quando você escreve scripts que precisam ser confiáveis.
  • ✓Ao configurar testes automáticos para projetos.
  • ✓Para garantir que seus scripts funcionem em diferentes sistemas.

Exemplo do que pedir para a IA

“Como posso testar se meu script de backup falha quando o disco está cheio?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/wshobson/agents/blob/main/plugins/shell-scripting/skills/bats-testing-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/wshobson/agents/blob/main/plugins/shell-scripting/skills/bats-testing-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

O Bats permite escrever testes em arquivos especiais. Cada teste verifica uma parte específica do seu script, como se ele retorna o resultado esperado ou se lida com erros corretamente. Ele pode até simular condições como arquivos faltando ou permissões negadas.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add wshobson/agents --skill bats-testing-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/wshobson/agents/main/plugins/shell-scripting/skills/bats-testing-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões de Teste com Bats

Orientação abrangente para escrever testes unitários completos para scripts shell usando Bats (Bash Automated Testing System), incluindo padrões de teste, fixtures e melhores práticas para testes de scripts em nível de produção.

Quando Usar Esta Habilidade

  • Escrever testes unitários para scripts shell
  • Implementar desenvolvimento guiado por testes (TDD) para scripts
  • Configurar testes automatizados em pipelines de CI/CD
  • Testar casos extremos e condições de erro
  • Validar o comportamento em diferentes ambientes de shell
  • Construir suítes de teste de scripts de fácil manutenção
  • Criar fixtures para cenários de teste complexos
  • Testar múltiplos dialetos de shell (bash, sh, dash)

Padrões Detalhados e Exemplos Práticos

A documentação detalhada dos padrões está em references/details.md. Leia este arquivo quando o nível de navegação acima for insuficiente.

Testando Condições de Erro

#!/usr/bin/env bats

@test "Function fails with missing file" {
    run my_function "/nonexistent/file.txt"
    [ "$status" -ne 0 ]
    [[ "$output" == *"not found"* ]]
}

@test "Function fails with invalid input" {
    run my_function ""
    [ "$status" -ne 0 ]
}

@test "Function fails with permission denied" {
    touch "$TMPDIR/readonly.txt"
    chmod 000 "$TMPDIR/readonly.txt"
    run my_function "$TMPDIR/readonly.txt"
    [ "$status" -ne 0 ]
    chmod 644 "$TMPDIR/readonly.txt"  # Cleanup
}

@test "Function provides helpful error message" {
    run my_function --invalid-option
    [ "$status" -ne 0 ]
    [[ "$output" == *"Usage:"* ]]
}

Testando com Dependências

#!/usr/bin/env bats

setup() {
    # Check for required tools
    if ! command -v jq &>/dev/null; then
        skip "jq is not installed"
    fi

    export SCRIPT="${BATS_TEST_DIRNAME}/../bin/script.sh"
}

@test "JSON parsing works" {
    skip_if ! command -v jq &>/dev/null
    run my_json_parser '{"key": "value"}'
    [ "$status" -eq 0 ]
}

Testando Compatibilidade de Shell

#!/usr/bin/env bats

@test "Script works in bash" {
    bash "${BATS_TEST_DIRNAME}/../bin/script.sh" arg1
}

@test "Script works in sh (POSIX)" {
    sh "${BATS_TEST_DIRNAME}/../bin/script.sh" arg1
}

@test "Script works in dash" {
    if command -v dash &>/dev/null; then
        dash "${BATS_TEST_DIRNAME}/../bin/script.sh" arg1
    else
        skip "dash not installed"
    fi
}

Execução Paralela

#!/usr/bin/env bats

@test "Multiple independent operations" {
    run bash -c 'for i in {1..10}; do
        my_operation "$i" &
    done
    wait'
    [ "$status" -eq 0 ]
}

@test "Concurrent file operations" {
    for i in {1..5}; do
        my_function "$TMPDIR/file$i" &
    done
    wait
    [ -f "$TMPDIR/file1" ]
    [ -f "$TMPDIR/file5" ]
}

Padrão de Auxiliar de Teste

test_helper.sh

#!/usr/bin/env bash

# Source script under test
export SCRIPT_DIR="${BATS_TEST_DIRNAME%/*}/bin"

# Common test utilities
assert_file_exists() {
    if [ ! -f "$1" ]; then
        echo "Expected file to exist: $1"
        return 1
    fi
}

assert_file_equals() {
    local file="$1"
    local expected="$2"

    if [ ! -f "$file" ]; then
        echo "File does not exist: $file"
        return 1
    fi

    local actual=$(cat "$file")
    if [ "$actual" != "$expected" ]; then
        echo "File contents do not match"
        echo "Expected: $expected"
        echo "Actual: $actual"
        return 1
    fi
}

# Create temporary test directory
setup_test_dir() {
    export TEST_DIR=$(mktemp -d)
}

cleanup_test_dir() {
    rm -rf "$TEST_DIR"
}

Integração com CI/CD

Fluxo de Trabalho do GitHub Actions

name: Tests

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Install Bats
        run: |
          npm install --global bats

      - name: Run Tests
        run: |
          bats tests/*.bats

      - name: Run Tests with Tap Reporter
        run: |
          bats tests/*.bats --tap | tee test_output.tap

Integração com Makefile

.PHONY: test test-verbose test-tap

test:
	bats tests/*.bats

test-verbose:
	bats tests/*.bats --verbose

test-tap:
	bats tests/*.bats --tap

test-parallel:
	bats tests/*.bats --parallel 4

coverage: test
	# Optional: Generate coverage reports

Melhores Práticas

  1. Teste uma coisa por teste - Princípio da responsabilidade única
  2. Use nomes de teste descritivos - Declara claramente o que está sendo testado
  3. Limpe após os testes - Sempre remova arquivos temporários na desmontagem

…

Perguntas frequentes

O que são 'testes unitários'?

São pequenos testes que verificam uma única parte (unidade) do seu código para garantir que ela funcione como esperado.

O que é 'CI/CD'?

É um processo automático que testa e implanta seu código sempre que você faz alterações, ajudando a encontrar problemas rapidamente.

O que são 'fixtures'?

São dados ou configurações pré-definidas que os testes usam para simular cenários específicos.

Detalhes

Descrição original do autor

Master Bash Automated Testing System (Bats) for comprehensive shell script testing. Use when writing tests for shell scripts, CI/CD pipelines, or requiring test-driven development of shell utilities.

repo: wshobson/agents

Popularidade

Estrelas no GitHub
41 mil
Posição no ranking
#4951
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas