feat(gotcha): introduce advanced Go test runner with rich CI/CD integration
what
Introducing Gotcha - a sophisticated Go test runner that transforms the testing experience with real-time progress tracking, beautiful terminal output, and comprehensive CI/CD integration.
Core Components
Command-Line Interface
-
gotcha stream- Real-time test execution with TTY-aware output -
gotcha parse- Process existinggo test -jsonoutput files - Intelligent argument passing with
--separator for go test flags - Comprehensive flag system with environment variable support
Terminal User Interface (TUI)
- Interactive progress bars with real-time completion percentage
- Animated spinners during test execution
- Live test counters (passed/failed/skipped)
- Package-level visualization with clear headers
- Subtest analysis with inline statistics
- Graceful TTY detection and degradation
CI/CD Integration
- Native GitHub Actions support with job summaries
- Automated PR comment posting with multiple strategies
- GitLab CI, Bitbucket, Azure DevOps foundations
- Platform-specific context detection
- Adaptive comment sizing for GitHub's limits
Output Formats
- Terminal output with color profiles (TrueColor → ANSI256 → ANSI → NoColor)
- Markdown generation for documentation
- GitHub-flavored markdown with collapsible sections
- JSON output for further processing
- Coverage reports with function-level detail
Test Management
- Smart test filtering with automatic
-runflag detection - Package discovery and organization
- Subtest hierarchy visualization
- Skip reason extraction and reporting
- Build failure detection and reporting
Performance Features
- Intelligent caching system for test counts
- Streaming output with minimal buffering
- Concurrent package execution support
- Memory-efficient JSON parsing
why
Go's native test runner provides minimal feedback during test execution, making it difficult to:
- Track progress in large test suites
- Understand test failures in CI environments
- Generate readable reports for stakeholders
- Integrate with modern CI/CD platforms
Gotcha solves these problems by providing:
- Real-time feedback - Know exactly what's happening during test runs
- CI/CD integration - Automatic GitHub comments, job summaries, and adaptive formatting
- Beautiful output - Clear, organized results that are easy to understand
- Flexible operation - Works as a test runner or result processor
- Cross-platform support - Consistent behavior on Linux, macOS, and Windows
Technical Implementation
Architecture
-
Stream Processing Pipeline - Real-time JSON event processing from
go test -json - Output Abstraction Layer - Unified interface for UI/Data streams with environment-specific routing
- Coverage Analysis Engine - Function and statement-level coverage with mock exclusion
- CI Provider Detection - Automatic platform detection with provider-specific features
- Configuration System - Viper-based with clear precedence (CLI → ENV → Config → Defaults)
Key Technologies
- Bubble Tea - Terminal UI framework for interactive progress tracking
- Lipgloss - Terminal styling with adaptive color profiles
- Cobra/Viper - CLI framework and configuration management
- Go test -json - Streaming test event processing
- GitHub GraphQL API - PR comment management and updates
Testing Infrastructure
- 70+ test files with comprehensive coverage
- Integration tests for all major workflows
- Mock CI providers for testing
- TUI harness for interactive mode testing
- Platform-specific test handling
Features Implemented
✅ Stream Mode
- Real-time test execution with progress tracking
- TTY detection with automatic mode switching
- Interactive TUI with progress bars and spinners
- Headless mode for CI environments
- Package-level organization and visualization
- Subtest statistics and hierarchical display
✅ Parse Mode
- Process existing JSON test output
- Multiple output format generation
- Coverage analysis and reporting
- VCS platform integration
✅ CI/CD Integration
- GitHub Actions with job summaries
- PR comment posting with updates
- Adaptive comment sizing
- Multiple posting strategies (always, on-failure, skip-only)
- Platform-specific context detection
✅ Configuration
- YAML configuration files
- Environment variable support
- CLI flag overrides
- Clear precedence rules
- Cache management for performance
✅ Output Handling
- Unified output interface (
output.Writer) - Environment-specific routing
- Color profile detection
- Format-specific generators
- Skip reason extraction and display
references
- Closes #1431 (original PR with broader initial scope)
- Implements comprehensive Go test runner as discussed in team planning
- Addresses test visibility issues in CI/CD pipelines
Testing
The implementation includes extensive testing:
- Unit tests for all core components
- Integration tests for CLI workflows
- Mock providers for CI testing
- TUI harness for interactive testing
- Cross-platform compatibility tests
- 30,000+ lines of code with comprehensive test coverage
This PR represents a major step forward by providing a test runner that significantly improves the Go testing experience for both local development and CI/CD workflows.
This PR contains the output-related fixes that were part of the larger #1431 PR. The scope has been narrowed to focus specifically on improving test output handling, fixing skip reason parsing, and ensuring proper CI/CD integration.
The main improvements include:
- ✅ Skip reasons now properly appear in GitHub summaries
- ✅ Consistent output handling through the interface
- ✅ Fixed error message placement that was disrupting formatted output
- ✅ Windows compatibility for the ptyrunner tool
- ✅ Prevention of duplicate GitHub job summaries
All changes have been tested comprehensively with new test cases covering various skip reason patterns and output scenarios.
This PR contains the output-related fixes that were part of the larger #1431 PR. The scope has been narrowed to focus specifically on improving test output handling, fixing skip reason parsing, and ensuring proper CI/CD integration.
The main improvements include:
- ✅ Skip reasons now properly appear in GitHub summaries
- ✅ Consistent output handling through the output.Writer interface
- ✅ Fixed error message placement that was disrupting formatted output
- ✅ Windows compatibility for the ptyrunner tool
- ✅ Prevention of duplicate GitHub job summaries
All changes have been tested comprehensively with new test cases covering various skip reason patterns and output scenarios.
[!IMPORTANT]
Cloud Posse Engineering Team Review Required
This pull request modifies files that require Cloud Posse's review. Please be patient, and a core maintainer will review your changes.
To expedite this process, reach out to us on Slack in the
#pr-reviewschannel.
[!WARNING]
This PR exceeds the recommended limit of 1,000 lines.
Large PRs are difficult to review and may be rejected due to their size.
Please verify that this PR does not address multiple issues. Consider refactoring it into smaller, more focused PRs to facilitate a smoother review process.
❌ Test Results (gotcha/ubuntu-latest)
❌ Build Failures (1)
Click to see packages that failed to build
| Package | Error |
|---|---|
| stream | Build failed |
Run locally to debug:
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream
❌ Failed Tests (17)
Click to see failed tests
| Test | Package | Duration |
|---|---|---|
TestAnalyzeProcessFailure |
stream | 0.00s |
TestAnalyzeProcessFailure/build_constraints_exclude |
stream | 0.00s |
TestAnalyzeProcessFailure/cannot_find_module |
stream | 0.00s |
TestAnalyzeProcessFailure/cannot_find_package |
stream | 0.00s |
TestAnalyzeProcessFailure/compilation_error |
stream | 0.00s |
TestAnalyzeProcessFailure/go_command_not_found |
stream | 0.00s |
TestAnalyzeProcessFailure/no_Go_files |
stream | 0.00s |
TestAnalyzeProcessFailure/no_Go_files_alternative |
stream | 0.00s |
TestAnalyzeProcessFailure/normal_test_failure |
stream | 0.00s |
TestAnalyzeProcessFailure/package_not_found |
stream | 0.00s |
TestAnalyzeProcessFailure/permission_denied |
stream | 0.00s |
TestAnalyzeProcessFailure/signal_terminated |
stream | 0.00s |
TestAnalyzeProcessFailure/timeout |
stream | 0.00s |
TestAnalyzeProcessFailure/unknown_error |
stream | 0.00s |
TestExtractExitCode |
stream | 0.00s |
TestExtractExitCode/exit_status_2 |
stream | 0.00s |
TestExtractExitCode/non-exit_error |
stream | 0.00s |
Run locally to reproduce:
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/build_constraints_exclude$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/cannot_find_module$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/cannot_find_package$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/compilation_error$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/go_command_not_found$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/no_Go_files$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/no_Go_files_alternative$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/normal_test_failure$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/package_not_found$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/permission_denied$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/signal_terminated$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/timeout$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/unknown_error$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestExtractExitCode$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestExtractExitCode/exit_status_2$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestExtractExitCode/non-exit_error$ -v
⏭️ Skipped Tests (9)
Click to see skipped tests
| Test | Package | Reason |
|---|---|---|
TestAllTestsFail_ShowFilter |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestAllTestsPass_ShowFilter |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestAnotherSkip |
test | No reason provided |
TestFilteredOutput_ShowsOnlyFailures |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestParser_HandlesEmptyCoverage |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestParser_WithRealGoTestOutput |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestShowFailedFilter_ParsesCorrectly |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestSkipExample |
test | No reason provided |
TestSkipReason |
test | Skipping test: example skip with formatted reason - test number 42 |
📊 Test Coverage
| Metric | Coverage | Details |
|---|---|---|
| Statement Coverage | 51.7% | 🟡 (excluded 103 mock files) |
| Function Coverage | 68.3% | 🟡 278/407 functions covered |
⏱️ Slowest Tests (20)
| Test | Package | Duration | % of Total |
|---|---|---|---|
TestHandleTestComplete |
tui | 6.00s | 14.3% |
TestTUIWithTeatest |
test | 4.01s | 9.6% |
TestRetryLogic |
github | 4.00s | 9.6% |
TestFindExistingCommentErrorCases |
github | 3.00s | 7.2% |
TestFindExistingCommentErrorCases/API_error |
github | 3.00s | 7.2% |
TestRetryLogic/failure_after_all_retries |
github | 3.00s | 7.2% |
TestTUIWithTeatest/process_test_events |
test | 2.01s | 4.8% |
TestHandleTestComplete/sets_exit_code_from_message |
tui | 2.00s | 4.8% |
TestTUIPackageTracking |
test | 2.00s | 4.8% |
TestTUIWithTeatest/test_output_capture |
test | 2.00s | 4.8% |
TestHandleTestComplete/preserves_non-zero_exit_code |
tui | 2.00s | 4.8% |
TestHandleTestComplete/closes_JSON_file_if_open |
tui | 2.00s | 4.8% |
TestParseCoverageProfileEnhanced |
coverage | 1.13s | 2.7% |
TestRetryLogic/success_after_retry |
github | 1.00s | 2.4% |
TestParseCoverageProfile |
coverage | 0.90s | 2.2% |
TestParseCoverageProfileEnhanced/enhanced_coverage_with_mocks_excluded |
coverage | 0.62s | 1.5% |
TestParseTestJSONEnhanced/test_with_coverage_file |
parser | 0.54s | 1.3% |
TestParseTestJSONEnhanced |
parser | 0.54s | 1.3% |
TestParseCoverageProfile/valid_coverage_profile_with_mocks_excluded |
coverage | 0.52s | 1.2% |
TestParseCoverageProfileEnhanced/enhanced_coverage_with_mocks_included |
coverage | 0.51s | 1.2% |
📦 Package Summary (18 packages)
| Package | Tests | Total Duration | Avg Duration |
|---|---|---|---|
| github | 68 | 14.50s | 0.21s |
| tui | 108 | 12.00s | 0.11s |
| test | 50 | 10.02s | 0.20s |
| coverage | 91 | 4.12s | 0.05s |
| parser | 84 | 1.08s | 0.01s |
| markdown | 115 | 0.06s | 0.00s |
| git | 14 | 0.03s | 0.00s |
| gotcha | 321 | 0.03s | 0.00s |
| ci | 19 | 0.00s | 0.00s |
| config | 78 | 0.00s | 0.00s |
| output | 9 | 0.00s | 0.00s |
| types | 31 | 0.00s | 0.00s |
| cache | 9 | 0.00s | 0.00s |
| logger | 16 | 0.00s | 0.00s |
| stream | 151 | 0.00s | 0.00s |
| utils | 101 | 0.00s | 0.00s |
| output | 35 | 0.00s | 0.00s |
| mock | 24 | 0.00s | 0.00s |
Total Time: 7.26s
❌ Test Results (gotcha/macos-latest)
❌ Build Failures (1)
Click to see packages that failed to build
| Package | Error |
|---|---|
| stream | Build failed |
Run locally to debug:
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream
❌ Failed Tests (17)
Click to see failed tests
| Test | Package | Duration |
|---|---|---|
TestAnalyzeProcessFailure |
stream | 0.00s |
TestAnalyzeProcessFailure/build_constraints_exclude |
stream | 0.00s |
TestAnalyzeProcessFailure/cannot_find_module |
stream | 0.00s |
TestAnalyzeProcessFailure/cannot_find_package |
stream | 0.00s |
TestAnalyzeProcessFailure/compilation_error |
stream | 0.00s |
TestAnalyzeProcessFailure/go_command_not_found |
stream | 0.00s |
TestAnalyzeProcessFailure/no_Go_files |
stream | 0.00s |
TestAnalyzeProcessFailure/no_Go_files_alternative |
stream | 0.00s |
TestAnalyzeProcessFailure/normal_test_failure |
stream | 0.00s |
TestAnalyzeProcessFailure/package_not_found |
stream | 0.00s |
TestAnalyzeProcessFailure/permission_denied |
stream | 0.00s |
TestAnalyzeProcessFailure/signal_terminated |
stream | 0.00s |
TestAnalyzeProcessFailure/timeout |
stream | 0.00s |
TestAnalyzeProcessFailure/unknown_error |
stream | 0.00s |
TestExtractExitCode |
stream | 0.00s |
TestExtractExitCode/exit_status_2 |
stream | 0.00s |
TestExtractExitCode/non-exit_error |
stream | 0.00s |
Run locally to reproduce:
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/build_constraints_exclude$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/cannot_find_module$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/cannot_find_package$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/compilation_error$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/go_command_not_found$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/no_Go_files$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/no_Go_files_alternative$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/normal_test_failure$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/package_not_found$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/permission_denied$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/signal_terminated$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/timeout$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/unknown_error$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestExtractExitCode$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestExtractExitCode/exit_status_2$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestExtractExitCode/non-exit_error$ -v
⏭️ Skipped Tests (9)
Click to see skipped tests
| Test | Package | Reason |
|---|---|---|
TestAllTestsFail_ShowFilter |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestAllTestsPass_ShowFilter |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestAnotherSkip |
test | No reason provided |
TestFilteredOutput_ShowsOnlyFailures |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestParser_HandlesEmptyCoverage |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestParser_WithRealGoTestOutput |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestShowFailedFilter_ParsesCorrectly |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestSkipExample |
test | No reason provided |
TestSkipReason |
test | Skipping test: example skip with formatted reason - test number 42 |
📊 Test Coverage
| Metric | Coverage | Details |
|---|---|---|
| Statement Coverage | 51.7% | 🟡 (excluded 103 mock files) |
| Function Coverage | 68.3% | 🟡 278/407 functions covered |
⏱️ Slowest Tests (20)
| Test | Package | Duration | % of Total |
|---|---|---|---|
TestHandleTestComplete |
tui | 6.01s | 13.7% |
TestTUIWithTeatest |
test | 4.02s | 9.2% |
TestRetryLogic |
github | 4.01s | 9.2% |
TestFindExistingCommentErrorCases |
github | 3.00s | 6.9% |
TestFindExistingCommentErrorCases/API_error |
github | 3.00s | 6.9% |
TestRetryLogic/failure_after_all_retries |
github | 3.00s | 6.9% |
TestTUIWithTeatest/process_test_events |
test | 2.01s | 4.6% |
TestHandleTestComplete/sets_exit_code_from_message |
tui | 2.00s | 4.6% |
TestHandleTestComplete/preserves_non-zero_exit_code |
tui | 2.00s | 4.6% |
TestTUIWithTeatest/test_output_capture |
test | 2.00s | 4.6% |
TestTUIPackageTracking |
test | 2.00s | 4.6% |
TestHandleTestComplete/closes_JSON_file_if_open |
tui | 2.00s | 4.6% |
TestParseCoverageProfileEnhanced |
coverage | 1.04s | 2.4% |
TestRetryLogic/success_after_retry |
github | 1.00s | 2.3% |
TestRealClientMethods |
github | 1.00s | 2.3% |
TestParseCoverageProfile |
coverage | 0.75s | 1.7% |
TestParseCoverageProfileEnhanced/enhanced_coverage_with_mocks_excluded |
coverage | 0.57s | 1.3% |
TestRealClientMethods/ListIssueComments_method_exists |
github | 0.51s | 1.2% |
TestClientInterface |
github | 0.51s | 1.2% |
TestClientInterface/client_0 |
github | 0.51s | 1.2% |
📦 Package Summary (18 packages)
| Package | Tests | Total Duration | Avg Duration |
|---|---|---|---|
| github | 68 | 17.02s | 0.25s |
| tui | 108 | 12.01s | 0.11s |
| test | 50 | 10.03s | 0.20s |
| coverage | 91 | 3.70s | 0.04s |
| parser | 84 | 0.68s | 0.01s |
| markdown | 115 | 0.20s | 0.00s |
| git | 14 | 0.12s | 0.01s |
| gotcha | 321 | 0.02s | 0.00s |
| ci | 19 | 0.01s | 0.00s |
| logger | 16 | 0.00s | 0.00s |
| cache | 9 | 0.00s | 0.00s |
| utils | 101 | 0.00s | 0.00s |
| mock | 24 | 0.00s | 0.00s |
| stream | 151 | 0.00s | 0.00s |
| output | 35 | 0.00s | 0.00s |
| config | 78 | 0.00s | 0.00s |
| output | 9 | 0.00s | 0.00s |
| types | 31 | 0.00s | 0.00s |
Total Time: 8.54s
✅ Commit history has been cleaned up!
Successfully squashed 229 commits into 8 logical, well-organized commits:
- Initial setup - Tool infrastructure and configuration
- CLI commands - Core stream and parse commands
- Package implementations - All pkg/ modules
- Internal components - TUI, parser, markdown, coverage
- Test suite - Comprehensive tests and fixtures
- Documentation - PRD and development guides
- CI/CD integration - GitHub workflows and project integration
- Demo and guides - Usage examples and additional docs
The PR is now much cleaner and easier to review!
❌ Test Results (atmos/windows)
❌ Build Failures (2)
Click to see packages that failed to build
| Package | Error |
|---|---|
| exec | Build failed |
| tests | Build failed |
Run locally to debug:
go test github.com/cloudposse/atmos/internal/exec
go test github.com/cloudposse/atmos/tests
❌ Failed Tests (3)
Click to see failed tests
| Test | Package | Duration |
|---|---|---|
TestYamlFuncTerraformOutput |
exec | 1.81s |
TestCLICommands |
tests | 127.87s |
TestCLICommands/!terraform.output_from_component_with_!env_function_test |
tests | 1.30s |
Run locally to reproduce:
go test github.com/cloudposse/atmos/internal/exec -run ^TestYamlFuncTerraformOutput$ -v
go test github.com/cloudposse/atmos/tests -run ^TestCLICommands$ -v
go test github.com/cloudposse/atmos/tests -run ^TestCLICommands/!terraform.output_from_component_with_!env_function_test$ -v
⏭️ Skipped Tests (28)
Click to see skipped tests
| Test | Package | Reason |
|---|---|---|
TestCollectComponentsDirectoryObjects_WithDuplicatePaths |
exec | Skipping integration test that requires file system setup |
TestCopyFile_FailChmod |
exec | Skipping test: os.Chmod not effective on this platform |
TestCreateTempDirectory |
exec | Skipping permission check on Windows: Unix permissions not applicable |
TestGetMatchesForPattern_ShallowNoMatch |
exec | Skipping shallow no-match test on Windows: glob behavior differs |
TestProcessDirEntry_Symlink |
exec | Skipping symlink test on Windows: symlinks require special privileges |
TestShouldExcludePath_Directory |
exec | Skipping directory exclusion test on Windows: path handling differs |
TestCustomGitGetter_Get_RemoveSymlinkError |
downloader | Skipping read-only directory test on Windows: read-only semantics differ |
TestGoGetterGet_File |
downloader | Skipping file copying test on Windows: file system differences may cause issues |
TestRemoveSymlinks |
downloader | Skipping symlink tests on Windows: symlinks require special privileges |
TestRemoveSymlinks_WalkError_Propagates |
downloader | Skipping permission-based Walk error test on Windows: permissions work differently |
TestExecuteListInstancesCmd/basic_command_execution |
list | No reason provided |
TestExecuteListInstancesCmd/command_with_upload_flag |
list | No reason provided |
TestProcessInstances/empty_config |
list | No reason provided |
TestProcessInstances/successful_processing |
list | No reason provided |
TestUploadInstances/empty_instances |
list | No reason provided |
TestUploadInstances/successful_upload |
list | No reason provided |
TestOriginalBehaviorWouldPrint |
merge | No reason provided |
TestNewGSMStore/with_credentials_from_env |
store | No reason provided |
TestGetComponentPath/sandbox_scenario_with_absolute_override |
utils | Skipping test on Windows |
TestPreconditionSkipping/EnvVar_missing_causes_skip |
tests | No reason provided |
TestPreconditionSkipping/Executable_missing_causes_skip |
tests | No reason provided |
TestPreconditionSkipping/File_path_missing_causes_skip |
tests | No reason provided |
TestRequireAWSProfile_NonExistent |
tests | No reason provided |
TestRequireGitRemoteWithValidURL_InvalidRemote |
tests | No reason provided |
TestRequireGitRemoteWithValidURL_NoRemotes |
tests | No reason provided |
TestRequireGitRepository_NotInRepo |
tests | No reason provided |
TestRequireNetworkAccess_InvalidURL |
tests | No reason provided |
TestRequireOCIAuthentication_WithoutToken |
tests | No reason provided |
📊 Test Coverage
| Metric | Coverage | Details |
|---|---|---|
| Statement Coverage | 4.8% | 🔴 (excluded 4436 mock files) |
| Function Coverage | 79.3% | 🟡 1052/1326 functions covered |
⏱️ Slowest Tests (20)
| Test | Package | Duration | % of Total |
|---|---|---|---|
TestDescribeAffectedWithTargetRefClone |
describe | 27.69s | 6.4% |
TestExecuteVendorPull |
exec | 24.52s | 5.6% |
TestExecuteAtlantisGenerateRepoConfigAffectedOnly |
exec | 24.07s | 5.5% |
TestExecuteTerraformAffectedWithDependents |
exec | 23.03s | 5.3% |
TestCLICommands/atmos_vendor_pull_with_globs |
tests | 20.96s | 4.8% |
TestCLICommands/atmos_vendor_pull_no_tty |
tests | 20.51s | 4.7% |
TestCLICommands/atmos_vendor_pull |
tests | 17.14s | 3.9% |
TestReadTerraformBackendS3_InvalidConfig |
terraform_backend | 16.17s | 3.7% |
Test_ReadTerraformBackendS3Internal_Errors |
terraform_backend | 16.01s | 3.7% |
TestVendorComponentPullCommand |
vender | 12.96s | 3.0% |
TestExecuteVendorPullCommand |
exec | 8.04s | 1.8% |
TestDescribeAffectedScenarios |
exec | 7.01s | 1.6% |
TestExecuteTerraformGeneratePlanfile |
exec | 5.86s | 1.3% |
TestCLITerraformClean |
tests | 5.81s | 1.3% |
TestValidateStacksCommandWithRemoteAtmosManifestJsonSchema |
validate | 5.16s | 1.2% |
TestExecuteTerraform_DeploymentStatus |
exec | 4.25s | 1.0% |
TestReadTerraformBackendS3_InvalidConfig/invalid_backend_info_-_missing_bucket |
terraform_backend | 4.08s | 0.9% |
TestReadTerraformBackendS3_InvalidConfig/invalid_backend_info_-_missing_region |
terraform_backend | 4.03s | 0.9% |
TestReadTerraformBackendS3_InvalidConfig/backend_info_without_role_arn |
terraform_backend | 4.03s | 0.9% |
TestReadTerraformBackendS3_InvalidConfig/backend_info_with_role_arn |
terraform_backend | 4.02s | 0.9% |
📦 Package Summary (45 packages)
| Package | Tests | Total Duration | Avg Duration |
|---|---|---|---|
| tests | 279 | 263.65s | 0.94s |
| exec | 556 | 133.49s | 0.24s |
| terraform_backend | 35 | 64.38s | 1.84s |
| describe | 25 | 45.73s | 1.83s |
| vender | 6 | 12.97s | 2.16s |
| validate | 7 | 8.31s | 1.19s |
| atmos | 2 | 6.72s | 3.36s |
| pro | 58 | 5.84s | 0.10s |
| component | 6 | 4.10s | 0.68s |
| cmd | 98 | 4.06s | 0.04s |
| atlantis | 4 | 3.46s | 0.86s |
| downloader | 84 | 2.88s | 0.03s |
| list | 205 | 2.47s | 0.01s |
| testhelpers | 23 | 2.20s | 0.10s |
| spacelift | 2 | 1.52s | 0.76s |
| config | 169 | 1.15s | 0.01s |
| generate | 1 | 1.03s | 1.03s |
| stack | 7 | 0.60s | 0.09s |
| telemetry | 87 | 0.56s | 0.01s |
| git | 17 | 0.43s | 0.03s |
| utils | 161 | 0.41s | 0.00s |
| errors | 5 | 0.27s | 0.05s |
| datafetcher | 12 | 0.19s | 0.02s |
| utils | 35 | 0.14s | 0.00s |
| retry | 12 | 0.11s | 0.01s |
| flags | 8 | 0.10s | 0.01s |
| store | 185 | 0.02s | 0.00s |
| templates | 6 | 0.02s | 0.00s |
| aws | 1 | 0.02s | 0.02s |
| filetype | 184 | 0.01s | 0.00s |
| filematch | 9 | 0.01s | 0.00s |
| pager | 82 | 0.01s | 0.00s |
| format | 23 | 0.01s | 0.00s |
| validator | 7 | 0.00s | 0.00s |
| hooks | 2 | 0.00s | 0.00s |
| markdown | 6 | 0.00s | 0.00s |
| aws_utils | 3 | 0.00s | 0.00s |
| go-homedir | 2 | 0.00s | 0.00s |
| utils | 13 | 0.00s | 0.00s |
| schema | 25 | 0.00s | 0.00s |
| logger | 60 | 0.00s | 0.00s |
| dtos | 22 | 0.00s | 0.00s |
| version | 8 | 0.00s | 0.00s |
| merge | 38 | 0.00s | 0.00s |
| convert | 41 | 0.00s | 0.00s |
Total Time: 136.37s
Codecov Report
:x: Patch coverage is 75.47170% with 13 lines in your changes missing coverage. Please review.
:white_check_mark: Project coverage is 57.07%. Comparing base (e0d7cd7) to head (f00e625).
:warning: Report is 3 commits behind head on main.
Additional details and impacted files
@@ Coverage Diff @@
## main #1483 +/- ##
==========================================
+ Coverage 56.94% 57.07% +0.13%
==========================================
Files 286 291 +5
Lines 30592 30648 +56
==========================================
+ Hits 17420 17493 +73
+ Misses 11334 11311 -23
- Partials 1838 1844 +6
| Flag | Coverage Δ | |
|---|---|---|
| unittests | 57.07% <75.47%> (+0.13%) |
:arrow_up: |
Flags with carried forward coverage won't be shown. Click here to find out more.
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
:rocket: New features to boost your workflow:
- :snowflake: Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
❌ Test Results (gotcha/windows-latest)
❌ Build Failures (2)
Click to see packages that failed to build
| Package | Error |
|---|---|
| stream | Build failed |
| test | Build failed |
Run locally to debug:
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream
go test github.com/cloudposse/atmos/tools/gotcha/test
❌ Failed Tests (19)
Click to see failed tests
| Test | Package | Duration |
|---|---|---|
TestAnalyzeProcessFailure |
stream | 0.00s |
TestAnalyzeProcessFailure/build_constraints_exclude |
stream | 0.00s |
TestAnalyzeProcessFailure/cannot_find_module |
stream | 0.00s |
TestAnalyzeProcessFailure/cannot_find_package |
stream | 0.00s |
TestAnalyzeProcessFailure/compilation_error |
stream | 0.00s |
TestAnalyzeProcessFailure/go_command_not_found |
stream | 0.00s |
TestAnalyzeProcessFailure/no_Go_files |
stream | 0.00s |
TestAnalyzeProcessFailure/no_Go_files_alternative |
stream | 0.00s |
TestAnalyzeProcessFailure/normal_test_failure |
stream | 0.00s |
TestAnalyzeProcessFailure/package_not_found |
stream | 0.00s |
TestAnalyzeProcessFailure/permission_denied |
stream | 0.00s |
TestAnalyzeProcessFailure/signal_terminated |
stream | 0.00s |
TestAnalyzeProcessFailure/timeout |
stream | 0.00s |
TestAnalyzeProcessFailure/unknown_error |
stream | 0.00s |
TestExtractExitCode |
stream | 0.00s |
TestExtractExitCode/exit_status_2 |
stream | 0.00s |
TestExtractExitCode/non-exit_error |
stream | 0.00s |
TestTUIWithTeatest |
test | 4.10s |
TestTUIWithTeatest/process_test_events |
test | 2.10s |
Run locally to reproduce:
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/build_constraints_exclude$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/cannot_find_module$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/cannot_find_package$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/compilation_error$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/go_command_not_found$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/no_Go_files$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/no_Go_files_alternative$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/normal_test_failure$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/package_not_found$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/permission_denied$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/signal_terminated$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/timeout$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestAnalyzeProcessFailure/unknown_error$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestExtractExitCode$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestExtractExitCode/exit_status_2$ -v
go test github.com/cloudposse/atmos/tools/gotcha/pkg/stream -run ^TestExtractExitCode/non-exit_error$ -v
go test github.com/cloudposse/atmos/tools/gotcha/test -run ^TestTUIWithTeatest$ -v
go test github.com/cloudposse/atmos/tools/gotcha/test -run ^TestTUIWithTeatest/process_test_events$ -v
⏭️ Skipped Tests (10)
Click to see skipped tests
| Test | Package | Reason |
|---|---|---|
TestAllTestsFail_ShowFilter |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestAllTestsPass_ShowFilter |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestAnotherSkip |
test | No reason provided |
TestFilteredOutput_ShowsOnlyFailures |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestParser_HandlesEmptyCoverage |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestParser_WithRealGoTestOutput |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestShowFailedFilter_ParsesCorrectly |
test | Skipping integration test: set GOTCHA_ENABLE_INTEGRATION_TESTS=1 to run |
TestSkipExample |
test | No reason provided |
TestSkipReason |
test | Skipping test: example skip with formatted reason - test number 42 |
TestSkipWindows |
test | Skipping test on Windows: requires Unix-like file system |
📊 Test Coverage
| Metric | Coverage | Details |
|---|---|---|
| Statement Coverage | 51.6% | 🟡 (excluded 103 mock files) |
| Function Coverage | 68.1% | 🟡 277/407 functions covered |
⏱️ Slowest Tests (20)
| Test | Package | Duration | % of Total |
|---|---|---|---|
TestHandleTestComplete |
tui | 6.01s | 11.6% |
TestRetryLogic |
github | 4.00s | 7.7% |
TestParseCoverageProfileEnhanced |
coverage | 3.31s | 6.4% |
TestFindExistingCommentErrorCases/API_error |
github | 3.00s | 5.8% |
TestRetryLogic/failure_after_all_retries |
github | 3.00s | 5.8% |
TestFindExistingCommentErrorCases |
github | 3.00s | 5.8% |
TestParseCoverageProfile |
coverage | 2.81s | 5.4% |
TestHandleTestComplete/sets_exit_code_from_message |
tui | 2.00s | 3.9% |
TestTUIPackageTracking |
test | 2.00s | 3.9% |
TestTUIWithTeatest/test_output_capture |
test | 2.00s | 3.9% |
TestHandleTestComplete/preserves_non-zero_exit_code |
tui | 2.00s | 3.9% |
TestHandleTestComplete/closes_JSON_file_if_open |
tui | 2.00s | 3.9% |
TestParseCoverageProfileEnhanced/enhanced_coverage_with_mocks_included |
coverage | 1.81s | 3.5% |
TestParseCoverageProfile/valid_coverage_profile_with_mocks_excluded |
coverage | 1.79s | 3.5% |
TestParseTestJSONEnhanced/test_with_coverage_file |
parser | 1.58s | 3.1% |
TestParseTestJSONEnhanced |
parser | 1.58s | 3.1% |
TestParseCoverageProfileEnhanced/enhanced_coverage_with_mocks_excluded |
coverage | 1.49s | 2.9% |
TestParseCoverageProfile/valid_coverage_profile_with_mocks_included |
coverage | 1.02s | 2.0% |
TestRetryLogic/success_after_retry |
github | 1.00s | 1.9% |
TestRealClientMethods |
github | 0.86s | 1.7% |
📦 Package Summary (18 packages)
| Package | Tests | Total Duration | Avg Duration |
|---|---|---|---|
| github | 68 | 16.37s | 0.24s |
| coverage | 91 | 12.83s | 0.14s |
| tui | 108 | 12.05s | 0.11s |
| test | 50 | 10.32s | 0.21s |
| parser | 84 | 3.30s | 0.04s |
| markdown | 115 | 1.35s | 0.01s |
| git | 14 | 0.89s | 0.06s |
| gotcha | 321 | 0.31s | 0.00s |
| stream | 151 | 0.16s | 0.00s |
| output | 35 | 0.13s | 0.00s |
| cache | 9 | 0.11s | 0.01s |
| ci | 19 | 0.01s | 0.00s |
| config | 78 | 0.01s | 0.00s |
| output | 9 | 0.00s | 0.00s |
| types | 31 | 0.00s | 0.00s |
| utils | 101 | 0.00s | 0.00s |
| logger | 16 | 0.00s | 0.00s |
| mock | 24 | 0.00s | 0.00s |
Total Time: 8.43s
💥 This pull request now has conflicts. Could you fix it @osterman? 🙏
💥 This pull request now has conflicts. Could you fix it @osterman? 🙏
💥 This pull request now has conflicts. Could you fix it @osterman? 🙏