- Frontend v4 accessible sur réseau local (192.168.1.40) - Ports ouverts: 3002 (frontend), 5001 (backend), 5004 (dashboard) - Ollama GPU fonctionnel - Self-healing interactif - Dashboard confiance Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
4.4 KiB
4.4 KiB
Real Functionality Test Improvements
Analysis of test_faiss_reindex.py
Key Issues with Original Tests
- Heavy Mock Usage: Extensive use of
unittest.mock.Mock()objects - Simulated Behavior: Patching critical methods like
_train_ivf_index - Fake Data: Creating mock nodes instead of real
WorkflowNodeinstances - No Integration: Testing components in isolation
Specific Improvements Made
1. Replace Mocks with Real Model Instances
Before:
node = Mock()
template = Mock()
template.embedding_prototype = [0.1, 0.2, 0.3, 0.4]
node.template = template
After:
def _create_real_node_v1_format(self, embedding_list: list) -> WorkflowNode:
embedding_proto = EmbeddingPrototype(
provider="test_provider",
vector_id="",
min_cosine_similarity=0.8,
sample_count=1
)
template = ScreenTemplate(
window=WindowConstraint(),
text=TextConstraint(),
ui=UIConstraint(),
embedding=embedding_proto
)
template.embedding_prototype = embedding_list
return WorkflowNode(
node_id="test_node_v1",
name="Test Node V1",
description="Test node with v1 format",
template=template
)
2. Test Real FAISS Operations
Before:
with patch.object(manager, '_train_ivf_index') as mock_train:
count = manager.reindex(items, force_train_ivf=True)
mock_train.assert_called_once()
After:
# Test actual IVF training with real data
count = manager.reindex(items, force_train_ivf=True)
assert manager.is_trained # Verify real training occurred
assert manager.index.ntotal == 10
# Test that search actually works after training
results = manager.search_similar(query_vector, k=3)
assert len(results) > 0
assert results[0].similarity > 0.95
3. Use Real File System Operations
Before:
# Mock file operations
with tempfile.NamedTemporaryFile(suffix='.npy', delete=False) as tmp:
test_vector = np.array([0.5, 0.6, 0.7, 0.8], dtype=np.float32)
np.save(tmp.name, test_vector)
tmp_path = tmp.name
# Mock node with embedding.vector_id
node = Mock()
template = Mock()
embedding = Mock()
embedding.vector_id = tmp_path
After:
# Real file operations with proper cleanup
def setup_method(self):
self.temp_dir = Path(tempfile.mkdtemp())
def teardown_method(self):
if self.temp_dir.exists():
shutil.rmtree(self.temp_dir)
# Real node creation with actual file
test_vector = np.array([0.5, 0.6, 0.7, 0.8], dtype=np.float32)
vector_file = self.temp_dir / "test_vector.npy"
np.save(vector_file, test_vector)
node = self._create_real_node_v2_format(str(vector_file))
4. Test Integration Between Components
Before:
# Mock faiss_manager.reindex
with patch.object(pipeline.faiss_manager, 'reindex') as mock_reindex:
mock_reindex.return_value = 2
pipeline._index_workflow_embeddings(workflow)
mock_reindex.assert_called_once()
After:
# Test real integration
workflow = self._create_real_workflow_with_nodes()
assert self.pipeline.faiss_manager.index.ntotal == 0
# Real indexing operation
self.pipeline._index_workflow_embeddings(workflow)
# Verify real results
assert self.pipeline.faiss_manager.index.ntotal == 2
query_vector = np.array([0.1, 0.2, 0.3], dtype=np.float32)
results = self.pipeline.faiss_manager.search_similar(query_vector, k=2)
assert results[0].embedding_id == "node1"
Benefits of Real Functionality Tests
- Catches Real Bugs: Tests actual behavior, not mocked behavior
- Integration Testing: Verifies components work together correctly
- Performance Validation: Tests with real data sizes and operations
- Regression Prevention: Changes to internal implementation don't break tests
- Documentation Value: Tests show how components actually work
Performance Considerations
- Fast Execution: Tests still run quickly (< 1s each)
- Isolated: Each test uses temporary directories
- Cleanup: Proper resource cleanup prevents test pollution
- Small Data: Uses minimal data sizes for speed while testing real functionality
Maintained Test Reliability
- Deterministic: Uses fixed random seeds where needed
- Independent: Tests don't depend on each other
- Robust: Handles edge cases gracefully
- Clear Assertions: Specific, meaningful assertions about behavior