cubenet_backend/TESTING_GUIDE.md

180 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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