Golang Stretchr Testify
Samuel BertheCommunityCreated by samberDistributed by Samuel Berthe
- Skill
- Tool integration
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach to using the stretchr/testify library in Go projects. It covers the core packages: assert, require, mock, and suite. It emphasizes best practices such as using require for preconditions and assert for verifications, maintaining correct argument order, and properly managing mock expectations. The guide includes patterns for async testing, custom matchers, and lifecycle management for test suites.
What it does
- Provides patterns for readable assertions using assert and require.
- Explains how to implement and verify mocks using testify/mock.
- Demonstrates how to structure tests with shared setup and teardown using testify/suite.
- Covers advanced testing techniques like async polling and JSON equality checks.
- Highlights common pitfalls such as incorrect argument order and missing mock verification.
- Offers guidance on choosing between assert and require based on failure behavior.
When to use it
- When writing unit or integration tests in a Go project that uses stretchr/testify.
- When you need to create mock implementations for interfaces to isolate units under test.
- When organizing related tests that require shared setup or teardown logic.
- When auditing existing test code to improve readability and reliability.
- When you need to perform complex assertions like unordered slice comparisons or async polling.
Advantages
- Improves test readability and maintainability compared to standard library testing.
- Reduces boilerplate code for common assertion and mocking tasks.
- Provides clear failure messages that simplify debugging.
- Enables robust testing of asynchronous operations and complex data structures.
- Standardizes test patterns across a codebase.
Usage examples
- “How do I use require vs assert in a Go test?”
- The agent explains that require stops execution immediately upon failure (ideal for preconditions), while assert records the failure and continues (ideal for general verifications).
- “Show me how to mock an interface with testify.”
- The agent provides a code example showing how to embed mock.Mock, implement methods using m.Called(), and verify expectations with AssertExpectations(t).
- “How can I test a function that eventually returns a specific status?”
- The agent demonstrates the use of is.Eventually or is.EventuallyWithT to poll for a condition within a specified timeout.
- “Help me set up a test suite for my service.”
- The agent provides a template for a struct-based test suite using suite.Suite, including SetupTest and a required TestXxx launcher function.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/samber/golang-stretchr-testify/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip golang-stretchr-testify.zip -d .agents/skills
Documentation by samber
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 — 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-devskill (godig), preferred 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-goplsskill (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 testsExample
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 verificationis.Equal(ErrNotFound, err)— fails on wrapped errors. Useis.ErrorIsto walk the chainSwapped argument order — testify assumes
(expected, actual). Swapping produces backwards diffsassertfor guards — test continues after failure and panics on nil dereference. UserequireMissing
suite.Run()— without the launcher function, zero tests execute silentlyComparing pointers —
is.Equal(ptr1, ptr2)compares addresses. Dereference or useEqualExportedValues
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-testingskill for general test patterns, table-driven tests, and CI→ See
samber/cc-skills-golang@golang-lintskill for testifylint configuration
Files
- ATTRIBUTION.mdAdded by AutoGineer926 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md7.2 KiB
- evals/evals.json11.9 KiB
- references/mock.md3.1 KiB
ATTRIBUTION.md
Attribution
This folder is an unmodified copy of the Agent Skill "golang-stretchr-testify", distributed by AutoGineer (https://autogineer.com/agent-skills).
Commit: bb1d43d98a3f8ab639a0042f90d0ec524e39a477
Created by: samber (https://github.com/samber/cc-skills-golang/tree/bb1d43d98a3f8ab639a0042f90d0ec524e39a477/skills/golang-stretchr-testify)
Publisher: Samuel Berthe (https://github.com/samber)
Licence: MIT License (https://spdx.org/licenses/MIT.html)
Licence evidence: declared in the frontmatter ("license: MIT")
Retrieved: 2026-11-07
The skill's own files are unmodified copies. AutoGineer is not affiliated with or endorsed by the author or the publisher.
Files added by AutoGineer
ATTRIBUTION.md: this file, written by AutoGineer
LICENSE: copied from LICENSE
Requirements and compatibility
Written for: Claude Code, OpenAI Codex
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Declares allowed tools, Claude Code frontmatter
The author says: Designed for Claude Code, Codex or similar harness, and for projects using Golang.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- samber
- Publisher
- Samuel Berthe (Community)
- Distributed by
- Samuel Berthe
- Source
- samber/cc-skills-golang · skills/golang-stretchr-testify · commit bb1d43d
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by samber or Samuel Berthe.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download golang-stretchr-testify.zip