Unit Tests - RobotNet10.NavigationTune
Thư mục này chứa các unit tests cho project RobotNet10.NavigationTune.
📁 Cấu trúc Tests
RobotNet10.NavigationTune.Test/
├── Helpers/
│ └── TestHelpers.cs # Helper methods để tạo test data
├── Navigation/
│ └── Core/
│ ├── PIDTests.cs # Tests cho PID controller
│ ├── MotorDynamicsModelTests.cs # Tests cho Motor Dynamics Model
│ └── PurePursuitSimplifiedTests.cs # Tests cho Pure Pursuit
├── Services/
│ ├── MetricsCalculatorTests.cs # Tests cho Metrics Calculator
│ └── ParameterManagerTests.cs # Tests cho Parameter Manager
├── Scenarios/
│ ├── StraightLineScenarioTests.cs # Tests cho Straight Line Scenario
│ └── CircleScenarioTests.cs # Tests cho Circle Scenario
└── README.md # File này
🧪 Test Coverage
✅ Đã được test
-
PID Controller
- Constructor với config
- PID_step với zero error
- Proportional term
- Integral term accumulation
- Derivative term
- Clamping to max/min
- Reset functionality
- WithKp, WithKi, WithKd methods
-
Motor Dynamics Model
- Constructor với default và config values
- PredictVelocity với time before/after delay
- PredictVelocity với long time
- GetSettlingTime calculation
- GetRiseTime calculation
- Decreasing command velocity
- ToString method
-
Pure Pursuit Simplified
- Constructor và SetPath
- CalculateAngularVelocity với straight path
- CalculateAngularVelocity với curved path
- GetCurrentLookahead với low/high velocity
- Low confidence handling
-
Metrics Calculator
- CalculateMetrics với empty telemetry
- Perfect tracking scenario
- Tracking errors calculation
- Smoothness metrics
- Efficiency metrics
- Overall score calculation
- Goal errors calculation
-
Parameter Manager
- Validate với valid parameters
- Validate với negative Kp/Ki
- Validate với invalid lookahead range
- GetDefaultPreset
- GetAggressivePreset
- GetSmoothPreset
- Validate với invalid blend ratio
- Validate với invalid velocity limits
-
Test Scenarios
- StraightLineScenario: GenerateReferencePath, IsGoalReached, GetGoalPose
- CircleScenario: GenerateReferencePath, IsGoalReached, GetGoalPose, radius validation
🚀 Chạy Tests
Sử dụng Visual Studio
- Mở Test Explorer (Test → Test Explorer)
- Build solution
- Chọn tests cần chạy và click "Run"
Sử dụng dotnet CLI
cd srcs/RobotNet10/Tests/RobotNet10.NavigationTune.Test
dotnet test
Chạy tests cụ thể
dotnet test --filter "FullyQualifiedName~PIDTests"
dotnet test --filter "FullyQualifiedName~MetricsCalculatorTests"
Chạy với coverage
dotnet test --collect:"XPlat Code Coverage"
📊 Test Statistics
- Total Tests: 40+ test cases
- Test Framework: xUnit
- Assertion Library: FluentAssertions
- Mocking Framework: Moq (for future use)
- Coverage Areas:
- Core navigation controllers
- Metrics calculation
- Parameter validation
- Test scenarios
🛠️ Test Helpers
TestHelpers.cs cung cấp các helper methods để tạo test data:
CreateDefaultParameterSet()- Default parameter setCreateCustomParameterSet()- Custom parameter set với specified valuesCreateStraightLineScenario()- Straight line scenarioCreateCircleScenario()- Circle scenarioCreateSimplePath()- Simple reference pathCreateTelemetryData()- Single telemetry data pointCreateTelemetryHistory()- List of telemetry data points
📝 Best Practices
- AAA Pattern: Arrange, Act, Assert
- Test Isolation: Mỗi test độc lập, không phụ thuộc vào test khác
- Meaningful Names: Tên test mô tả rõ behavior được test
- Test Data: Sử dụng TestHelpers để tạo consistent test data
- Edge Cases: Test cả success và failure scenarios
- Floating Point: Sử dụng
BeApproximatelycho floating point comparisons
🔍 Test Categories
Unit Tests
- Test từng component riêng biệt
- Mock dependencies nếu cần
- Fast execution
Integration Tests (Future)
- Test interaction giữa các components
- Test với real data
- Test end-to-end scenarios
📈 Coverage Goals
- PID Controller: ~90%
- Motor Dynamics Model: ~90%
- Pure Pursuit Simplified: ~80%
- Metrics Calculator: ~85%
- Parameter Manager: ~90%
- Test Scenarios: ~90%
- Velocity Estimator Simplified: Pending
- Safety Monitor: Pending
- Test Executor: Pending (requires mocking)
- Tuning Navigation: Pending (requires mocking)
🐛 Known Issues
- Một số tests phụ thuộc vào floating point precision
- Tests cho TestExecutor và TuningNavigation cần mocking của ILocalizationProvider và IVelocityProvider
🤝 Contributing
Khi thêm tests mới:
- Follow naming convention:
MethodName_Scenario_ExpectedBehavior - Sử dụng TestHelpers cho test data
- Sử dụng FluentAssertions cho assertions
- Test cả success và failure cases
- Document any special test setup requirements