Table of Contents

    Unit Testing with doctest in Python: Problem 2 and Solutions

    2. Problem 2 - Unit Testing using doctest in Python

     

    Complete the definition of the class 'Circle' with the following specifications:

    • Define doctests for '__init_' which creates a circle 'c1' with radius 2.5, and checks if the accessing attribute 'radius', returns the value 2.5.

    • Define class method 'area' which computes the area of a circle, and returns the value rounded off to 2 decimals. Hint: Use 'pi' value from the 'math' module.

    • Define doctests for 'area which creates a circle 'c1' with radius 2.5, and checks if its computed area is 19.63.

    • Define class method 'circumference' which computes the circumference of a circle, and returns the value rounded off to 2 decimals. Hint: Use 'pi' value from the 'math' module.

    • Define doctests for 'circumference' which creates a circle 'c1' with radius 2.5, and checks if its computed circumference is 15.71.

    Code

    
    import inspect
    import doctest
    import re
    import math
    
    # Define the class 'Circle' and its methods with proper doctests:
    class Circle:
        
        def __init__(self, radius):
            """
            >>> c1 = Circle(2.5)
            >>> c1.radius
            2.5
            """
            self.radius = radius
            
        def area(self):
            """
            >>> c1 = Circle(2.5)
            >>> round(c1.area(), 2)
            19.63
            """
            return math.pi * (self.radius ** 2)
            
            
        def circumference(self):
            """
            >>> c1 = Circle(2.5)
            >>> round(c1.circumference(), 2)
            15.71
            """
            return 2 * math.pi * self.radius
            
    if __name__ == '__main__':
        doctest.testmod()
        
        c2 = Circle(2.5)
        doc1 = inspect.getdoc(c2.__init__)
        doc2 = inspect.getdoc(c2.area)
        doc3 = inspect.getdoc(c2.circumference)
        
        class_count = len(re.findall(r'Circle', doc1))
        func1_count = len(re.findall(r'c1.radius', doc1))
        func1_val = len(re.findall(r'2.5', doc1))
        
        print(str(class_count), str(func1_count), str(func1_val))
        
        class_count = len(re.findall(r'Circle', doc2))
        func1_count = len(re.findall(r'c1.area', doc2))
        func1_val = len(re.findall(r'19.63', doc2)) 
                          
        print(str(class_count), str(func1_count), str(func1_val))
                          
        class_count = len(re.findall(r'Circle', doc3))
        func1_count = len(re.findall(r'c1.circumference', doc3))
        func1_val = len(re.findall(r'15.71', doc3)) 
                          
        print(str(class_count), str(func1_count), str(func1_val))