logos-storage-docs-obsidian/10 Notes/Running tests with gotestsum.md

158 lines
6.4 KiB
Markdown
Raw Normal View History

2025-10-27 13:57:38 +01:00
A summary of running different test scenarios with `gotestsum` based on an example
## gotestsum Command Patterns
### 1. **Only Selected Test**
```bash
# Run a specific test function
gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloader_BasicSingleArchive$" -count 1
# Run specific testify test
gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloader_BasicSingleArchive_Testify$" -count 1
# Run multiple archives testify test
gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloader_MultipleArchives_Testify$" -count 1
```
### 2. **Only Selected Test Suite**
```bash
# Run the entire testify suite (all methods in the suite)
gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloaderSuite" -count 1
# Run a specific test method within the suite
gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloaderSuite/TestBasicSingleArchive" -count 1
```
### 3. **All Tests for Given Package**
```bash
# Run all tests in communities package
gotestsum --packages="./communities" -f testname --rerun-fails -- -count 1
# Alternative syntax (same result)
gotestsum --packages="./communities" -f testname --rerun-fails
# Run all tests with verbose output
gotestsum --packages="./communities" -f testname --rerun-fails -- -v -count 1
```
### 4. **Integration Tests**
```bash
# Run only integration tests (using build tags)
gotestsum --packages="./communities" -f testname --rerun-fails -- -tags=integration -run "Integration" -count 1
# Run integration tests with timeout (since they may take longer)
gotestsum --packages="./communities" -f testname --rerun-fails -- -tags=integration -run "Integration" -timeout=60s -count 1
# Run integration tests with specific environment variables
CODEX_HOST=localhost CODEX_API_PORT=8080 gotestsum --packages="./communities" -f testname --rerun-fails -- -tags=integration -run "Integration" -count 1
```
## Advanced gotestsum Patterns
### **Filter by Pattern (Multiple Tests)**
```bash
# Run all archive downloader tests (both standard and testify)
gotestsum --packages="./communities" -f testname --rerun-fails -- -run "ArchiveDownloader" -count 1
# Run only testify tests
gotestsum --packages="./communities" -f testname --rerun-fails -- -run "Testify" -count 1
# Run all CodexClient tests
gotestsum --packages="./communities" -f testname --rerun-fails -- -run "CodexClient" -count 1
```
### **Output Formats**
```bash
# Different output formats
gotestsum --packages="./communities" -f dots # Dots progress
gotestsum --packages="./communities" -f pkgname # Show package names
gotestsum --packages="./communities" -f testname # Show test names (recommended)
gotestsum --packages="./communities" -f standard-quiet # Minimal output
```
### **Multiple Packages**
```bash
# Run tests across multiple packages
gotestsum --packages="./communities,./cmd/upload,./cmd/download" -f testname --rerun-fails -- -count 1
# Run all packages recursively
gotestsum --packages="./..." -f testname --rerun-fails -- -count 1
```
### **Race Detection and Coverage**
```bash
# Run with race detection
gotestsum --packages="./communities" -f testname --rerun-fails -- -race -count 1
# Run with coverage
gotestsum --packages="./communities" -f testname --rerun-fails -- -cover -count 1
# Run with both race detection and coverage
gotestsum --packages="./communities" -f testname --rerun-fails -- -race -cover -count 1
```
## Key gotestsum Advantages
1. **Better Output Formatting**: Clean, colored output with test names
2. **Automatic Retry**: `--rerun-fails` reruns failed tests automatically
3. **JUnit XML Output**: `--junitfile=results.xml` for CI/CD integration
4. **JSON Output**: `--jsonfile=results.json` for parsing
5. **Watch Mode**: `--watch` to rerun tests on file changes
6. **Parallel Execution**: Better handling of parallel test output
## Complete Examples for Your Project
```bash
# Quick test of archive downloader functionality
gotestsum --packages="./communities" -f testname --rerun-fails -- -run "ArchiveDownloader" -count 1
# Full test suite with coverage
gotestsum --packages="./communities" -f testname --rerun-fails -- -cover -count 1
# Integration tests (when you have a Codex node running)
gotestsum --packages="./communities" -f testname --rerun-fails -- -tags=integration -timeout=60s -count 1
# Development workflow with watch mode
gotestsum --packages="./communities" -f testname --watch -- -count 1
```
The key difference from `go test` is that `gotestsum` provides much better visual feedback, automatic retry capabilities, and better CI/CD integration options while using the same underlying Go test infrastructure.
## Logs
In your tests you can include custom logs.
`go test -v` prints them without an issue, but for `gotestsum` to do the same you have to use `standard-verbose` format option:
```bash
gotestsum --packages="./communities" -f standard-verbose --rerun-fails -- -run "TestCodexArchiveDownloaderSuite" -v -count 1
=== RUN TestCodexArchiveDownloaderSuite
=== RUN TestCodexArchiveDownloaderSuite/TestBasicSingleArchive
codex_archive_downloader_testify_test.go:112: ✅ Basic single archive download test passed (testify version)
codex_archive_downloader_testify_test.go:113: - All mock expectations satisfied
codex_archive_downloader_testify_test.go:114: - Callback invoked: true
=== RUN TestCodexArchiveDownloaderSuite/TestMultipleArchives
codex_archive_downloader_testify_test.go:190: ✅ Multiple archives test passed (suite version)
codex_archive_downloader_testify_test.go:191: - Completed 3 out of 3 archives
--- PASS: TestCodexArchiveDownloaderSuite (0.20s)
--- PASS: TestCodexArchiveDownloaderSuite/TestBasicSingleArchive (0.10s)
--- PASS: TestCodexArchiveDownloaderSuite/TestMultipleArchives (0.10s)
PASS
ok go-codex-client/communities 0.205s
DONE 3 tests in 0.205s
```
Compare this output with `-f testname`:
```bash
gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloaderSuite" -count 1
PASS communities.TestCodexArchiveDownloaderSuite/TestBasicSingleArchive (0.10s)
PASS communities.TestCodexArchiveDownloaderSuite/TestMultipleArchives (0.10s)
PASS communities.TestCodexArchiveDownloaderSuite (0.20s)
PASS communities
DONE 3 tests in 0.205s
```
> Notice that the test suite itself is also counted as a test - this is one we see `DONE 3 tests` instead of `DONE 2 tests`.