Skills Agentes

Golang Stretchr Testify

Guía completa de stretchr/testify para testing en Golang: assert, require, mock y suite, con matchers, verificación de llamadas y patrones avanzados como Eventually y JSONEq.

Solicitaread edit write glob grep bash(go:*) bash(golangci-lint:*) bash(git:*) agent webfetch mcp__context7__resolve-library-id mcp__context7__query-docs bash(gotests:*) askuserquestion bash(godig:*) bash(gopls:*) lsp mcp__gopls__*
Estrellas
3k

en todo el repo

Actividad
57

0–100, la ruta de este skill

Actualizado
el mes pasado

último commit aquí

Commits
4

últimos 90 días

Contexto
1.8k tok

116 tok en reposo

Paquete
3 archivos

22 KB

Instalar

Funciona con cualquier agente que lea SKILL.md

npx -y skills add samber/cc-skills-golang --skill golang-stretchr-testify --agent claude-code

Se instala solo en este repositorio.

Qué hace

  • Guía para escribir aserciones, mocks y suites con stretchr/testify en Go
  • Explica cuándo usar assert frente a require según el tipo de fallo esperado
  • Detalla matchers de mock (mock.Anything, MatchedBy) y modificadores de llamada (.Once, .Times, .Maybe)
  • Documenta el ciclo de vida de testify/suite (SetupSuite, SetupTest, TearDownTest)
  • Lista errores comunes: olvidar AssertExpectations, orden de argumentos invertido, comparar punteros

Úsalo cuando

  • Al escribir tests con testify
  • Al crear mocks
  • Al configurar test suites
  • Al elegir entre assert y require, o cuando el código importa github.com/stretchr/testify

No lo uses cuando

    Qué lo activa

    Di cualquiera de estas frases y el agente debería cargar este skill.

    • Escribe tests con testify para este servicio
    • Crea un mock para esta interfaz usando testify/mock
    • Configura una test suite con SetupTest y TearDownTest
    • ¿Cuándo debo usar require en vez de assert?

    SKILL.md

    En inglés

    Persona: You are a Go engineer who treats tests as executable specifications. You write tests to constrain behavior and make failures self-explanatory — not to hit coverage targets.

    Modes:

    • Write mode — adding new tests or mocks to a codebase.
    • Review mode — auditing existing test code for testify misuse.

    stretchr/testify

    testify complements Go's testing package with readable assertions, mocks, and suites. It does not replace testing — always use *testing.T as the entry point.

    This skill is not exhaustive. Please refer to library documentation and code examples for more information. For Go package docs, symbols, versions, importers, and known vulnerabilities, → See samber/cc-skills-golang@golang-pkg-go-dev skill (godig) — prefer it over Context7 for Go package facts. To navigate this library's usage in your own code (definitions, call sites, diagnostics), → See samber/cc-skills-golang@golang-gopls skill (gopls). Context7 remains a fallback for docs not indexed on pkg.go.dev.

    assert vs require

    Both offer identical assertions. The difference is failure behavior:

    • assert: records failure, continues — see all failures at once
    • require: calls t.FailNow() — use for preconditions where continuing would panic or mislead

    Use assert.New(t) / require.New(t) for readability. Name them is and must:

    func TestParseConfig(t *testing.T) {
        is := assert.New(t)
        must := require.New(t)
    
        cfg, err := ParseConfig("testdata/valid.yaml")
        must.NoError(err)    // stop if parsing fails — cfg would be nil
        must.NotNil(cfg)
    
        is.Equal("production", cfg.Environment)
        is.Equal(8080, cfg.Port)
        is.True(cfg.TLS.Enabled)
    }
    

    Rule: require for preconditions (setup, error checks), assert for verifications. Never mix randomly.

    Core Assertions

    is := assert.New(t)
    
    // Equality
    is.Equal(expected, actual)              // DeepEqual + exact type
    is.NotEqual(unexpected, actual)
    is.EqualValues(expected, actual)        // converts to common type first
    is.EqualExportedValues(expected, actual)
    
    // Nil / Bool / Emptiness
    is.Nil(obj)                  is.NotNil(obj)
    is.True(cond)                is.False(cond)
    is.Empty(collection)         is.NotEmpty(collection)
    is.Len(collection, n)
    
    // Contains (strings, slices, map keys)
    is.Contains("hello world", "world")
    is.Contains([]int{1, 2, 3}, 2)
    is.Contains(map[string]int{"a": 1}, "a")
    
    // Comparison
    is.Greater(actual, threshold)     is.Less(actual, ceiling)
    is.Positive(val)                  is.Negative(val)
    is.Zero(val)
    
    // Errors
    is.Error(err)                     is.NoError(err)
    is.ErrorIs(err, ErrNotFound)      // walks error chain
    is.ErrorAs(err, &target)
    is.ErrorContains(err, "not found")
    
    // Type
    is.IsType(&User{}, obj)
    is.Implements((*io.Reader)(nil), obj)
    

    Argument order: always (expected, actual) — swapping produces confusing diff output.

    Advanced Assertions

    is.ElementsMatch([]string{"b", "a", "c"}, result)             // unordered comparison
    is.InDelta(3.14, computedPi, 0.01)                            // float tolerance
    is.JSONEq(`{"name":"alice"}`, `{"name": "alice"}`)             // ignores whitespace/key order
    is.WithinDuration(expected, actual, 5*time.Second)
    is.Regexp(`^user-[a-f0-9]+$`, userID)
    
    // Async polling
    is.Eventually(func() bool {
        status, _ := client.GetJobStatus(jobID)
        return status == "completed"
    }, 5*time.Second, 100*time.Millisecond)
    
    // Async polling with rich assertions
    is.EventuallyWithT(func(c *assert.CollectT) {
        resp, err := client.GetOrder(orderID)
        assert.NoError(c, err)
        assert.Equal(c, "shipped", resp.Status)
    }, 10*time.Second, 500*time.Millisecond)
    

    testify/mock

    Mock interfaces to isolate the unit under test. Embed mock.Mock, implement methods with m.Called(), always verify with AssertExpectations(t).

    Key matchers: mock.Anything, mock.AnythingOfType("T"), mock.MatchedBy(func). Call modifiers: .Once(), .Times(n), .Maybe(), .Run(func).

    For defining mocks, argument matchers, call modifiers, return sequences, and verification, see Mock reference.

    testify/suite

    Suites group related tests with shared setup/teardown.

    Lifecycle

    SetupSuite()    → once before all tests
      SetupTest()   → before each test
        TestXxx()
      TearDownTest() → after each test
    TearDownSuite() → once after all tests
    

    Example

    type TokenServiceSuite struct {
        suite.Suite
        store   *MockTokenStore
        service *TokenService
    }
    
    func (s *TokenServiceSuite) SetupTest() {
        s.store = new(MockTokenStore)
        s.service = NewTokenService(s.store)
    }
    
    func (s *TokenServiceSuite) TestGenerate_ReturnsValidToken() {
        s.store.On("Save", mock.Anything, mock.Anything).Return(nil)
        token, err := s.service.Generate("user-42")
        s.NoError(err)
        s.NotEmpty(token)
        s.store.AssertExpectations(s.T())
    }
    
    // Required launcher
    func TestTokenServiceSuite(t *testing.T) {
        suite.Run(t, new(TokenServiceSuite))
    }
    

    Suite methods like s.Equal() behave like assert. For require: s.Require().NotNil(obj).

    Common Mistakes

    • Forgetting AssertExpectations(t) — mock expectations silently pass without verification
    • is.Equal(ErrNotFound, err) — fails on wrapped errors. Use is.ErrorIs to walk the chain
    • Swapped argument order — testify assumes (expected, actual). Swapping produces backwards diffs
    • assert for guards — test continues after failure and panics on nil dereference. Use require
    • Missing suite.Run() — without the launcher function, zero tests execute silently
    • Comparing pointersis.Equal(ptr1, ptr2) compares addresses. Dereference or use EqualExportedValues

    Linters

    Use testifylint to catch wrong argument order, assert/require misuse, and more. See samber/cc-skills-golang@golang-lint skill.

    Cross-References

    • → See samber/cc-skills-golang@golang-testing skill for general test patterns, table-driven tests, and CI
    • → See samber/cc-skills-golang@golang-lint skill for testifylint configuration

    Reproducido de samber/cc-skills-golang bajo licencia MIT. Leer esta página en markdown.

    Archivos

    3 archivos en el paquete. Solo se lee SKILL.md al activarse — las referencias se cargan si el skill decide que las necesita.

    Antes de instalar

    Requiere los binarios go y gotests, y que el proyecto importe github.com/stretchr/testify.

    Detalles

    Creador
    samber
    Categoría
    Testing y QA
    Licencia
    MIT
    Recursos incluidos
    referencias
    Código fuente
    Ver SKILL.md

    Etiquetas

    Más de samber/cc-skills-golang

    Este repo incluye 46 skills. Si instalas uno, normalmente ya tienes los demás.

    Buenas prácticas de linting y configuración de golangci-lint para proyectos Golang: ejecutar linters, configurar .golangci.yml, suprimir avisos con nolint, interpretar salidas y elegir linters.

    Costo de contexto al activarse
    1.8k tok
    Tamaño del paquete
    5 archivos
    Última actualización
    hace 3 días
    herramientas desarrollo

    Benchmarking, profiling y medición de rendimiento en Golang: escribir y comparar benchmarks, perfilar con pprof, analizar con benchstat y detectar regresiones en CI.

    Costo de contexto al activarse
    3.3k tok
    Tamaño del paquete
    10 archivos
    Última actualización
    hace 28 días
    testing qa

    Orquestador de skills de Golang, siempre activo en cualquier tarea de código, revisión, debug o setup: carga las skills más relevantes de samber/cc-skills-golang, a menudo varias a la vez.

    Costo de contexto al activarse
    3.8k tok
    Tamaño del paquete
    4 archivos
    Última actualización
    hace 20 días
    herramientas desarrollo

    Patrones y metodología de optimización de rendimiento en Golang: si hay cuello de botella X, aplica el patrón Y, una vez que profiling o benchmarks ya lo identificaron.

    Costo de contexto al activarse
    2.3k tok
    Tamaño del paquete
    9 archivos
    Última actualización
    el mes pasado
    herramientas desarrollo

    Tests de Golang listos para producción: table-driven, suites y mocks con testify, tests paralelos, fuzzing, fixtures, detección de fugas de goroutines con goleak, snapshot testing, cobertura, tests de integración.

    Costo de contexto al activarse
    4.4k tok
    Tamaño del paquete
    6 archivos
    Última actualización
    el mes pasado
    testing qa

    Inyección de dependencias en Golang con samber/do: contenedores de servicios, gestión de ciclo de vida, scopes, health checks, apagado ordenado y organización en módulos.

    Costo de contexto al activarse
    2.3k tok
    Tamaño del paquete
    4 archivos
    Última actualización
    hace 22 días
    herramientas desarrollo

    Skills relacionados

    Benchmarking, profiling y medición de rendimiento en Golang: escribir y comparar benchmarks, perfilar con pprof, analizar con benchstat y detectar regresiones en CI.

    Costo de contexto al activarse
    3.3k tok
    Tamaño del paquete
    10 archivos
    Última actualización
    hace 28 días
    testing qa

    Codificación defensiva en Golang para evitar panics, corrupción silenciosa de datos y bugs sutiles en tiempo de ejecución.

    Costo de contexto al activarse
    2.6k tok
    Tamaño del paquete
    4 archivos
    Última actualización
    hace 2 meses
    testing qa

    Tests de Golang listos para producción: table-driven, suites y mocks con testify, tests paralelos, fuzzing, fixtures, detección de fugas de goroutines con goleak, snapshot testing, cobertura, tests de integración.

    Costo de contexto al activarse
    4.4k tok
    Tamaño del paquete
    6 archivos
    Última actualización
    el mes pasado
    testing qa