File size: 3,564 Bytes
7166038 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
import unittest
import numpy as np
import pandas as pd
from src.data_preprocessing import DataPreprocessor
from src.model_training import ModelTrainer
from src.prediction import DiabetesPrediction
from src.health_recommendations import HealthRecommendations
import os
import json
class TestDataPreprocessor(unittest.TestCase):
def setUp(self):
self.preprocessor = DataPreprocessor()
self.sample_data = pd.DataFrame({
'Pregnancies': [1, 2, 3],
'Glucose': [85, 0, 90],
'BloodPressure': [66, 0, 70],
'SkinThickness': [29, 0, 30],
'Insulin': [0, 0, 155],
'BMI': [26.6, 0, 30.1],
'DiabetesPedigreeFunction': [0.351, 0.427, 0.672],
'Age': [31, 22, 45],
'Outcome': [0, 1, 1]
})
def test_preprocess_data(self):
processed_df = self.preprocessor.preprocess_data(self.sample_data.copy())
# Check that there are no zeros in specific columns
for col in ['Glucose', 'BloodPressure', 'SkinThickness', 'BMI', 'Insulin']:
self.assertTrue((processed_df[col] != 0).all())
def test_scale_features(self):
processed_df = self.preprocessor.preprocess_data(self.sample_data.copy())
scaled_features = self.preprocessor.scale_features(processed_df, is_training=True)
self.assertEqual(scaled_features.shape[1], 8) # All features except Outcome
self.assertTrue(np.abs(scaled_features.mean()).mean() < 1e-10) # Centered around 0
class TestModelTrainer(unittest.TestCase):
def setUp(self):
self.trainer = ModelTrainer()
self.preprocessor = DataPreprocessor()
# Create sample data
self.X = np.random.randn(100, 8)
self.y = np.random.randint(0, 2, 100)
def test_train_model(self):
model = self.trainer.train_model(self.X, self.y)
self.assertIsNotNone(model)
# Test prediction shape
pred = model.predict(self.X[:1])
self.assertEqual(len(pred), 1)
class TestDiabetesPrediction(unittest.TestCase):
def setUp(self):
self.predictor = DiabetesPrediction()
self.sample_input = [1, 85, 66, 29, 0, 26.6, 0.351, 31]
def test_prediction_format(self):
result = self.predictor.predict(self.sample_input)
self.assertIn('is_diabetic', result)
self.assertIn('probability', result)
self.assertIsInstance(result['is_diabetic'], bool)
self.assertIsInstance(result['probability'], float)
class TestHealthRecommendations(unittest.TestCase):
def setUp(self):
# Use a dummy API key for testing
self.health_advisor = HealthRecommendations(api_key="dummy_key")
self.sample_patient_data = {
'Glucose': 85,
'BloodPressure': 66,
'BMI': 26.6,
'Age': 31
}
self.sample_prediction = {
'is_diabetic': False,
'probability': 0.3
}
def test_fallback_recommendations(self):
recommendations = self.health_advisor._get_fallback_recommendations(is_diabetic=False)
expected_categories = [
'Diet and Nutrition',
'Physical Activity',
'Lifestyle Changes',
'Monitoring and Prevention'
]
self.assertEqual(sorted(recommendations.keys()), sorted(expected_categories))
for category in expected_categories:
self.assertGreater(len(recommendations[category]), 0)
def run_tests():
unittest.main()
if __name__ == '__main__':
run_tests()
|