import unittest
class DefectMetrics:
@staticmethod
def calculate_defect_density(defects_found: int, module_size_loc: int) -> float:
# Convert lines of code to KLOC
kloc = module_size_loc / 1000
if kloc == 0:
return 0.0
return defects_found / kloc
@staticmethod
def calculate_detection_rate(defects_found: int, total_defects_injected: int) -> float:
if total_defects_injected == 0:
return 0.0
return defects_found / total_defects_injected
class TestDefectMetrics(unittest.TestCase):
def test_defect_density(self):
defects_found = 50
module_size_loc = 10000 # 10 KLOC
expected_density = 5.0 # 50 / 10
density = DefectMetrics.calculate_defect_density(defects_found, module_size_loc)
self.assertAlmostEqual(density, expected_density, places=5)
def test_detection_rate(self):
defects_found = 40
total_defects_injected = 50
expected_rate = 0.8 # 40 / 50
rate = DefectMetrics.calculate_detection_rate(defects_found, total_defects_injected)
self.assertAlmostEqual(rate, expected_rate, places=5)
def test_zero_module_size(self):
density = DefectMetrics.calculate_defect_density(10, 0)
self.assertEqual(density, 0.0)
def test_zero_total_defects(self):
rate = DefectMetrics.calculate_detection_rate(10, 0)
self.assertEqual(rate, 0.0)
if __name__ == '__main__':
unittest.main()The DefectMetrics class has two static methods to calculate defect density and detection rate. We convert lines of code to KLOC for defect density calculation. We handle zero division by returning 0.0 if module size or total defects are zero.
The TestDefectMetrics class uses Python's unittest framework. It tests normal cases and edge cases (zero module size and zero total defects). We use assertAlmostEqual for floating point checks to avoid precision issues.
This structure keeps calculations separate from tests, making the code clear and maintainable.