Unit Testing¶
This document details the unit testing practices in Anya.
Test Structure¶
1. Test Organization¶
#[cfg(test)]
mod tests {
use super::*;
// Test setup
fn setup() -> TestContext {
TestContext::new()
}
// Test cleanup
fn teardown(context: TestContext) {
context.cleanup();
}
#[test]
fn test_basic_functionality() {
let context = setup();
// Test implementation
teardown(context);
}
}
2. Test Categories¶
#[cfg(test)]
mod tests {
// Positive tests
#[test]
fn test_valid_input() {
assert!(process_input("valid").is_ok());
}
// Negative tests
#[test]
fn test_invalid_input() {
assert!(process_input("").is_err());
}
// Edge cases
#[test]
fn test_boundary_conditions() {
assert!(process_input("max_length").is_ok());
}
}
3. Test Utilities¶
// Test helpers
pub mod test_utils {
pub fn create_test_data() -> TestData {
TestData::default()
}
pub fn verify_result(result: TestResult) -> bool {
result.is_valid()
}
pub fn cleanup_test_data(data: TestData) {
data.cleanup();
}
}
Test Implementation¶
1. Basic Tests¶
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_addition() {
assert_eq!(add(2, 2), 4);
}
#[test]
fn test_subtraction() {
assert_eq!(subtract(4, 2), 2);
}
#[test]
fn test_multiplication() {
assert_eq!(multiply(3, 3), 9);
}
}
2. Property Tests¶
use proptest::prelude::*;
proptest! {
#[test]
fn test_addition_properties(a in 0..100i32, b in 0..100i32) {
let result = add(a, b);
prop_assert!(result >= a);
prop_assert!(result >= b);
prop_assert_eq!(result, b + a);
}
}
3. Mock Tests¶
use mockall::automock;
#[automock]
trait Database {
fn query(&self, id: u32) -> Result<String, Error>;
}
#[cfg(test)]
mod tests {
#[test]
fn test_database_query() {
let mut mock = MockDatabase::new();
mock.expect_query()
.with(eq(1))
.returning(|_| Ok("result".to_string()));
assert_eq!(mock.query(1).unwrap(), "result");
}
}
Best Practices¶
1. Test Design¶
- Single responsibility
- Clear naming
- Comprehensive coverage
- Independent tests
2. Test Implementation¶
- Setup and teardown
- Error handling
- Resource cleanup
- Documentation
3. Test Maintenance¶
- Regular updates
- Coverage monitoring
- Performance checks
- Documentation updates