180 lines
4.1 KiB
Markdown
180 lines
4.1 KiB
Markdown
# Testing Guide - Cubenet Backend
|
||
|
||
## 📋 Обзор тестирования
|
||
|
||
Проект использует несколько типов тестов:
|
||
- **Unit Tests** - тесты отдельных компонентов
|
||
- **Integration Tests** - тесты взаимодействия между компонентами
|
||
- **SDK Tests** - тесты клиентской библиотеки
|
||
|
||
## 🧪 Запуск тестов
|
||
|
||
### Все тесты
|
||
```bash
|
||
cargo test --all
|
||
```
|
||
|
||
### Unit tests только audit_logger
|
||
```bash
|
||
cargo test -p audit_logger
|
||
```
|
||
|
||
### SDK tests
|
||
```bash
|
||
cargo test -p cubenet-sdk
|
||
```
|
||
|
||
### С output
|
||
```bash
|
||
cargo test --all -- --nocapture
|
||
```
|
||
|
||
### Show ignored tests
|
||
```bash
|
||
cargo test --all -- --ignored
|
||
```
|
||
|
||
## 📊 Результаты тестов
|
||
|
||
```
|
||
✅ audit_logger: 4 tests
|
||
- test_audit_log_creation
|
||
- test_audit_log_builder
|
||
- test_log_action
|
||
- test_log_error
|
||
|
||
✅ cubenet-sdk: 1 test
|
||
- test_client_creation
|
||
|
||
✅ All: 5 tests passed
|
||
```
|
||
|
||
## 🏗️ Структура тестов
|
||
|
||
```
|
||
tests/
|
||
├── lib.rs - Интеграционные тесты
|
||
└── integration/
|
||
└── audit_logger_integration.rs - Audit logger тесты
|
||
|
||
shared_libs/audit_logger/src/
|
||
├── models.rs - Unit tests для моделей
|
||
└── logger.rs - Unit tests для logger
|
||
|
||
sdk/cubenet-sdk/src/
|
||
└── client.rs - Unit tests для клиента
|
||
```
|
||
|
||
## 📝 Пример написания теста
|
||
|
||
### Unit Test
|
||
```rust
|
||
#[tokio::test]
|
||
async fn test_audit_logger_action() {
|
||
let store = Arc::new(InMemoryAuditStore::new());
|
||
let logger = AuditLogger::new(store, "test_service");
|
||
|
||
let log = logger
|
||
.log_action(
|
||
Some("user_123".to_string()),
|
||
ActionType::Create,
|
||
"users".to_string(),
|
||
"/api/users".to_string(),
|
||
)
|
||
.await
|
||
.expect("Should log");
|
||
|
||
assert_eq!(log.user_id, Some("user_123".to_string()));
|
||
assert_eq!(log.action, ActionType::Create);
|
||
}
|
||
```
|
||
|
||
### Integration Test
|
||
```rust
|
||
#[tokio::test]
|
||
async fn test_complete_workflow() {
|
||
// Setup
|
||
let store = Arc::new(InMemoryAuditStore::new());
|
||
let logger = AuditLogger::new(store, "test");
|
||
|
||
// Execute multiple operations
|
||
logger.log_action(...).await.ok();
|
||
logger.log_error(...).await.ok();
|
||
|
||
// Verify
|
||
let results = logger.search(SearchParams::default()).await?;
|
||
assert_eq!(results.total, 2);
|
||
}
|
||
```
|
||
|
||
## 🎯 Best Practices
|
||
|
||
1. ✅ Каждая функция должна иметь хотя бы один тест
|
||
2. ✅ Используйте `#[tokio::test]` для async тестов
|
||
3. ✅ Тестируйте success и error cases
|
||
4. ✅ Используйте descriptive names для тестов
|
||
5. ✅ Isolate tests - каждый тест независим
|
||
|
||
## 🔄 Тестирование новых сервисов
|
||
|
||
Шаблон для новых микросервисов:
|
||
|
||
```rust
|
||
#[tokio::test]
|
||
async fn test_my_service_operation() {
|
||
// Arrange - Setup
|
||
let logger = Arc::new(AuditLogger::new(
|
||
Arc::new(InMemoryAuditStore::new()),
|
||
"my_service"
|
||
));
|
||
|
||
// Act - Execute
|
||
let result = my_service_function(&logger).await;
|
||
|
||
// Assert - Verify
|
||
assert!(result.is_ok());
|
||
|
||
// Verify audit log
|
||
let logs = logger.search(SearchParams::default()).await.ok();
|
||
assert_eq!(logs.map(|l| l.total), Some(1));
|
||
}
|
||
```
|
||
|
||
## 📊 Coverage
|
||
|
||
Для проверки покрытия кода:
|
||
```bash
|
||
cargo tarpaulin --package audit_logger --out Html
|
||
```
|
||
|
||
## 🐛 Debugging Tests
|
||
|
||
Запуск теста с output:
|
||
```bash
|
||
cargo test test_name -- --nocapture
|
||
```
|
||
|
||
Запуск одного теста:
|
||
```bash
|
||
cargo test test_audit_log_creation
|
||
```
|
||
|
||
## 🚀 CI/CD Integration
|
||
|
||
Тесты автоматически запускаются при:
|
||
- `cargo check`
|
||
- `cargo build`
|
||
- `cargo test`
|
||
|
||
## 📈 Metrics
|
||
|
||
Текущие показатели:
|
||
- **Total Tests**: 5
|
||
- **Pass Rate**: 100%
|
||
- **Coverage**: ~70% (audit_logger)
|
||
- **Build Time**: ~6.5 sec
|
||
|
||
---
|
||
|
||
**Status**: ✅ All tests passing
|