gopherguides

go-test-coverage

WHEN: User wants to improve test coverage, find untested code, generate test stubs, or asks "what tests am I missing?" or "how do I improve coverage?" for a Go project. WHEN NOT: When running existing tests, debugging test failures, or benchmarking.

gopherguides 15 2 Updated 3mo ago
GitHub

Install

npx skillscat add gopherguides/gopher-ai/go-test-coverage

Install via the SkillsCat registry.

SKILL.md

Go Test Coverage

Test coverage gap analysis and recommendations for Go projects. Identifies missing or insufficient test coverage and generates actionable recommendations.

What It Does

  1. Coverage Analysis — Runs go test -cover and parses results
  2. Gap Identification — Finds untested exported functions, error paths, and edge cases
  3. Recommendation Engine — Suggests specific test cases using table-driven patterns
  4. Stub Generation — Creates ready-to-use test file stubs

Steps

API Integration (Optional)

If GOPHER_GUIDES_API_KEY is set, verify it:

curl -s -H "Authorization: Bearer $GOPHER_GUIDES_API_KEY" \
  https://gopherguides.com/api/gopher-ai/me

If not set, local analysis tools (go vet, staticcheck, golangci-lint) still provide comprehensive analysis. Set the key for enhanced API-powered insights. Get your key at gopherguides.com.

1. Measure Current Coverage

# Generate coverage profile
go test -coverprofile=coverage.out ./...

# View per-function coverage
go tool cover -func=coverage.out

# Generate HTML report (optional)
go tool cover -html=coverage.out -o coverage.html

2. Identify Gaps

Parse coverage output to find:

  • Untested exported functions — Any func with 0% coverage
  • Partially covered functions — Functions with branches not hit
  • Untested error pathsif err != nil blocks never executed
  • Missing edge cases — Boundary conditions not exercised
# Find functions with 0% coverage
go tool cover -func=coverage.out | grep "0.0%"

# Find exported functions without test files
for f in $(find . -name "*.go" ! -name "*_test.go" -path "*/pkg/*" -o -name "*.go" ! -name "*_test.go" -path "*/internal/*"); do
  dir=$(dirname "$f")
  base=$(basename "$f" .go)
  if [ ! -f "${dir}/${base}_test.go" ]; then
    echo "Missing test file: ${dir}/${base}_test.go"
  fi
done

3. Generate Recommendations

For each untested function, recommend:

  • Table-driven tests for functions with multiple input/output combinations
  • Error path tests for functions that return errors
  • Edge case tests for boundary values (nil, empty, zero, max)
  • Integration tests for functions with external dependencies

4. Generate Test Stubs

Create test files with the table-driven pattern:

func TestFunctionName(t *testing.T) {
	tests := []struct {
		name    string
		input   InputType
		want    OutputType
		wantErr bool
	}{
		{
			name:  "valid input",
			input: validInput,
			want:  expectedOutput,
		},
		{
			name:    "empty input returns error",
			input:   emptyInput,
			wantErr: true,
		},
		{
			name:    "nil input returns error",
			input:   nil,
			wantErr: true,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()
			got, err := FunctionName(tt.input)
			if (err != nil) != tt.wantErr {
				t.Errorf("FunctionName() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if !reflect.DeepEqual(got, tt.want) {
				t.Errorf("FunctionName() = %v, want %v", got, tt.want)
			}
		})
	}
}

Output Format

## Test Coverage Report

**Project:** {name}
**Current Coverage:** {percent}%
**Target Coverage:** 80%

### Coverage by Package

| Package | Coverage | Status |
|---------|----------|--------|
| pkg/auth | 85% | ✅ |
| pkg/api | 45% | ⚠️ |
| internal/db | 20% | 🔴 |

### Untested Exported Functions

| Function | File | Priority |
|----------|------|----------|
| `HandleLogin` | pkg/auth/handler.go | High |
| `ValidateToken` | pkg/auth/token.go | High |
| `FormatResponse` | pkg/api/response.go | Medium |

### Recommended Test Cases

#### `HandleLogin` (pkg/auth/handler.go)
1. Valid credentials → successful login
2. Invalid password → 401 error
3. Missing username → validation error
4. Expired account → forbidden error
5. Rate limited → 429 error

### Generated Stubs

Test stubs have been written to:
- `pkg/auth/handler_test.go`
- `pkg/api/response_test.go`

Helper Script

After installation via install.sh, scripts are at .github/skills/scripts/. Run the coverage report script for a formatted summary with gap analysis:

bash .github/skills/scripts/coverage-report.sh [minimum-coverage-percent]

Default minimum is 80%. Configure thresholds in severity configuration at the installed path:

coverage:
  minimum: 80
  per_package_minimum: 60
  below_threshold_severity: warning

Gopher Guides API Integration

Note: API calls send source code to gopherguides.com for analysis. Ensure your organization's policy permits external code analysis.

For full API usage examples, see API Usage Reference.

References

  • Existing gopher-ai command: plugins/go-dev/commands/test-gen.md
  • Go best practices skill: plugins/go-dev/skills/go-best-practices/
  • Go Testing

Powered by Gopher Guides training materials.