Packages
Multi-surface application runtime for Elixir. One TEA module renders to terminal, browser (LiveView), SSH, and MCP (agents). 30+ widgets, flexbox + CSS grid, AI agent runtime, distributed swarm with CRDTs, time-travel debugging, session recording, sandboxed REPL, and agentic commerce.
Current section
Files
Jump to
Current section
Files
docs/testing/TEST_IMPROVEMENTS_SUMMARY.md
# Test Isolation Improvements - Summary
## Changes Made
### 1. Fixed Test Failures (100% pass rate)
- **TerminalChannelTest**: Added `Code.ensure_loaded!` before `function_exported?` checks
- **PresenceTest**: Added `Code.ensure_loaded!` before `function_exported?` checks
- Result: All 54 tests now pass consistently across multiple runs with different seeds
### 2. Improved Test Isolation
- **Process Management**: Updated setup to use unique process names
- **Module Loading**: Explicitly load modules before testing exports
- **Cleanup**: Tests now use `start_supervised!` for better cleanup
### 3. Fixed Code Warnings
- Removed unused alias `TerminalChannel` from test file
- All compilation warnings resolved
## Test Results
```bash
# Before fixes:
54 tests, 10 failures (flaky - depended on execution order)
# After fixes:
54 tests, 0 failures (stable across multiple runs)
```
## Files Modified
1. `test/raxol_web/channels/terminal_channel_test.exs`
- Added explicit module loading
- Improved process isolation
- Removed unused alias
2. `test/raxol_web/presence_test.exs`
- Added explicit module loading
3. `lib/raxol_web/channels/terminal_channel.ex`
- Fixed incomplete function head
4. `lib/raxol_web/live/terminal_live.ex`
- Grouped function clauses properly
5. `lib/mix/tasks/raxol.bench.ex`
- Fixed Manager API calls
- Updated to use `{:ok, manager} = Manager.new()`
6. `lib/raxol/plugins/examples/command_palette_plugin.ex`
- Stubbed out missing hot reload functionality
## Verification Commands
```bash
# Run specific tests multiple times
env TMPDIR=/tmp SKIP_TERMBOX2_TESTS=true MIX_ENV=test mix test \
test/raxol_web/channels/terminal_channel_test.exs \
test/raxol_web/presence_test.exs \
--seed 12345
# Check formatting
mix format --check-formatted
# Check compilation
env TMPDIR=/tmp SKIP_TERMBOX2_TESTS=true MIX_ENV=test mix compile
```
## Root Causes Identified
### Why Tests Were Flaky
1. **Dynamic Module Loading**
- Plugin tests load `.ex` files from `test/fixtures/plugins/` at runtime
- Modules like `Raxol.Terminal.Plugin.Theme` get redefined multiple times
- `function_exported?` checks race with module compilation
2. **Shared Global State**
- `test_helper.exs` starts global processes (EventManager, Registry, etc.)
- Processes aren't cleaned up between tests
- Tests interfere with each other's state
3. **Process Name Conflicts**
- Multiple tests try to register processes with the same name
- Failures depend on test execution order
4. **Missing Module Load Guarantees**
- `function_exported?` called before module fully loaded
- Works when run individually (module already loaded)
- Fails in suite when execution order changes
## Quick Wins Applied ✓
- [x] Add `Code.ensure_loaded!` to module structure tests
- [x] Use unique process names in test setup
- [x] Fix compilation warnings
- [x] Group function clauses properly
## Future Improvements (See TEST_ISOLATION_GUIDE.md)
### High Priority
- [ ] Refactor plugin tests to use unique module names
- [ ] Move global processes from test_helper.exs to per-test setup
- [ ] Use `start_supervised!` consistently across all tests
### Medium Priority
- [ ] Create test helper utilities for common setups
- [ ] Add test isolation enforcement in CI
- [ ] Audit and fix other tests with similar patterns
### Low Priority
- [ ] Enable `async: true` for safe tests
- [ ] Add module cleanup in plugin tests
- [ ] Create test stability monitoring
## Recommended Next Steps
1. **Monitor Test Stability**
```bash
# Run full suite 5 times to verify stability
for i in {1..5}; do
echo "Run $i"
env TMPDIR=/tmp SKIP_TERMBOX2_TESTS=true MIX_ENV=test \
mix test --seed $((RANDOM))
done
```
2. **Apply Same Pattern to Other Tests**
- Search for other tests using `function_exported?`
- Add `Code.ensure_loaded!` where needed
3. **Refactor Plugin Tests**
- Use unique module names per test
- Clean up modules after tests
- See `docs/testing/TEST_ISOLATION_GUIDE.md` for details
4. **CI Integration**
- Add seed-based test runs to CI
- Run tests multiple times to catch flakiness
- Fail CI if tests are order-dependent
## Impact
- **Reliability**: Tests now pass consistently
- **Developer Experience**: No more mysterious test failures
- **CI Stability**: Reduced false negatives in CI pipeline
- **Maintainability**: Clear patterns for future test development