Testing Guidelines
This page covers language-agnostic testing conventions.
For Rust-specific assertion policy (assert! vs debug_assert!), see
Rust Guidelines — Defensive Programming.
Add regression tests for every bug fix (add-regression-tests)
When a bug is fixed, a test that would have caught the bug should accompany the fix. Include a reference to the issue number in a comment so future readers can recover the original context.
See also: PR #2962.
Test user-visible behavior, not internals (test-visible-behavior)
Tests should validate observable, user-facing outcomes. Prefer testing through public APIs rather than exposing internal constants in test code.
Name tests after the behavior or specification concept being verified, not after internal implementation details. Using kernel-internal names in user-space regression tests creates unnecessary coupling.
See also: PR #2926.
Use assertion macros, not manual inspection (use-assertions)
Use language- or framework-provided assertion helpers instead of printing values and manually inspecting output. Assertions provide clear failure messages and make tests self-checking.
Clean up resources after every test (test-cleanup)
Always clean up resources after a test:
close file descriptors, unlink temporary files,
and call waitpid on child processes.
Leftover resources can cause flaky failures
in subsequent tests.
// Good — cleanup after use
int fd = open("/tmp/test_file", O_CREAT | O_RDWR, 0644);
// ... test logic ...
close(fd);
unlink("/tmp/test_file");