簡體   English   中英

在 Python 3 中使用庫“unittest”進行單元測試

[英]Unit testing using library 'unittest' in Python 3

我需要在 Python 中使用單元測試編寫測試用例來測試圈子的創建。

使用方法 init 定義一個 class Circle,它初始化一個具有屬性 radius 的圓,具有以下限制。

  1. 半徑必須是數值,如果不是引發類型錯誤,錯誤消息為“半徑必須是數字”。
  2. 兩側的半徑必須在 0 到 1000 之間(含),如果不引發錯誤消息“半徑必須在 0 到 1000(含)之間”的值錯誤
  3. 定義一個 class 方法 area and circumference ,它必須返回四舍五入到兩位小數的值。

完成 class TestingCircleCircumference 的定義,它測試圓周方法的行為,如下所述。

定義測試方法 test_circlecircum_with_random_numerical_radius 創建半徑為 2.5 的圓 c1 並檢查其計算的周長是否與值 15.71 匹配

定義測試方法 test_circlecircum_with__min_radius 創建半徑為 0 的圓 c2 並檢查其計算的周長是否與值 0 匹配

定義測試方法 test_circlecircum_with_max_radius,它創建半徑為 1000 的圓 c3,並檢查其計算的周長是否與值 6283.19 匹配

我的代碼是:

import inspect
import re
import unittest
import math

class Circle:

    def __init__(self, radius):

        try:
            if not isinstance(radius, (int, float)):
                raise TypeError
            elif 1000 >= radius >= 0:
                self.radius=radius
            else:
                raise ValueError
        except ValueError:
            raise ValueError("radius must be between 0 and 1000 inclusive")
        except TypeError:
            raise TypeError("radius must be a number")

def area(self):

    y = math.pi*(self.radius**2)
    return round(y, 2)

def circumference(self):

    x = math.pi*2*self.radius
    return round(x, 2)

class TestCircleArea(unittest.TestCase):

    def test_circlearea_with_random_numeric_radius(self):

        c1 = Circle(2.5)
        self.assertEqual(c1.area(), 19.63)


    def test_circlearea_with_min_radius(self):

        c2 = Circle(0)
        self.assertEqual(c2.area(), 0)

    def test_circlearea_with_max_radius(self):

        c3 = Circle(1000.1)
        self.assertEqual(c3.area(), 3141592.65)

下面的代碼是系統生成的,我無法編輯。 此代碼來自HackerRank

if __name__ == '__main__':

    fptr = open('output.txt', 'w')

    runner = unittest.TextTestRunner(fptr)

    unittest.main(testRunner=runner, exit=False)

    fptr.close()

    with open('output.txt') as fp:
        output_lines = fp.readlines()


    pass_count = [len(re.findall(r'\.', line)) for line in output_lines if line.startswith('.')
                     and line.endswith('.\n')]

    pass_count = pass_count[0]

    print(str(pass_count))

    doc1 = inspect.getsource(TestCircleArea.test_circlearea_with_random_numeric_radius)
    doc2 = inspect.getsource(TestCircleArea.test_circlearea_with_min_radius)
    doc3 = inspect.getsource(TestCircleArea.test_circlearea_with_max_radius)

    assert1_count = len(re.findall(r'assertEqual', doc1))

    print(str(assert1_count))

    assert1_count = len(re.findall(r'assertEqual', doc2))

    print(str(assert1_count))

    assert1_count = len(re.findall(r'assertEqual', doc3))

    print(str(assert1_count))

我得到的錯誤是:

Traceback (most recent call last):
  File "main.py", line 75, in <module>
    pass_count = pass_count[0]
IndexError: list index out of range

我能夠使用下面的類和測試類方法解決給定的問題。

class Circle:
    
    def __init__(self, radius):
        # Define the initialization method below
        self.radius = radius
        if not isinstance(self.radius, (int, float)):
            raise TypeError("radius must be a number")
        elif self.radius < 0 or self.radius > 1000:
            raise ValueError("radius must be between 0 and 1000 inclusive")
        else:
            pass
        
    def area(self):
        # Define the area functionality below
        return round(math.pi*(self.radius**2), 2)
               
    def circumference(self):
        # Define the circumference functionality below
        return round(2*math.pi*self.radius, 2)
        
class TestCircleCircumference(unittest.TestCase):
    
    def test_circlecircum_with_random_numeric_radius(self):
        # Define a circle 'c1' with radius 2.5 and check if 
        # its circumference is 15.71
        c1 = Circle(2.5)
        self.assertEqual(c1.circumference(), 15.71)

        
    def test_circlecircum_with_min_radius(self):
        # Define a circle 'c2' with radius 0 and check if 
        # it's circumference is 0.
        c2 = Circle(0)
        self.assertEqual(c2.circumference(),0)
                
    def test_circlecircum_with_max_radius(self):
        # Define a circle 'c3' with radius 1000 and check if 
        # it's circumference is 6283.19.
        c3 = Circle(1000)
        self.assertEqual(c3.circumference(),6283.19)

只需修改代碼如下:

  1. 移除/刪除 passcount 行
  2. 直接分配值,即要執行的測試總數。
  3. 享受,沒有更多的錯誤。

這只是為了跳過不斷令人惱火的默認事情。

您收到錯誤是因為c3的值由於您在__init__方法中放置的條件而未初始化。

如果要將其初始化為 1000.1,請將其刪除:

class Circle:
    
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return round((math.pi*(self.radius)**2), 2)
        
               
    def circumference(self):
        return round((math.pi*(self.radius)*2), 2)

還有一件事:c3的面積是3142221.0,不是你測試的值。 請打印並檢查一次。

class TestCircleArea(unittest.TestCase):
    
    def test_circlearea_with_random_numeric_radius(self):
        c1 = Circle(2.5)
        self.assertEqual(c1.area(), 19.63)
        
    def test_circlearea_with_min_radius(self):
        c2 = Circle(0)
        self.assertEqual(c2.area(), 0.0)

    def test_circlearea_with_max_radius(self):
        c3 = Circle(1000.1)
        #print(c3.area())
        self.assertEqual(c3.area(), 3142221.0)
def test_circlearea_with_max_radius(self):
    c3 = Circle(1000)
    #print(c3.area())
    self.assertEqual(c3.area(), 3141592.65)

我驗證這工作正常。 數字是 1000,而不是 1000.1。 輸入建議似乎有問題。

班級圈:

def __init__(self, radius):
  
    self.radius = 0
    if not isinstance(radius,(int,float)):
        raise TypeError("radius must be a number")
    elif radius < 0 or radius > 1000:
        raise ValueError("radius must be between 0 and 1000 inclusive")
    else:
        self.radius = radius
    
def area(self):
    
    return round(math.pi*(self.radius**2),2) 
           
def circumference(self):
 
    return round((math.pi*self.radius*2),2)

    

類 TestCircleArea(unittest.TestCase):

def test_circlearea_with_random_numeric_radius(self):
    
    c1 = Circle(2.5)
    self.assertEqual(c1.area(), 19.63)
    
def test_circlearea_with_min_radius(self):
    
    c2 = Circle(0)
    self.assertEqual(c2.area(), 0)
    
def test_circlearea_with_max_radius(self):
    
    c3 = Circle(1000)
    self.assertEqual(c3.area(), 3141592.65)

可以參考這個GitHub文件

或者

# Define below the class 'Circle' and it's methods.
class Circle:
    
    def __init__(self, radius):
        # Define the initialization method below
        pattern = re.compile("^\\-?[0-9]")
        if(pattern.match(str(radius))):
            if(radius >= 0 and radius <= 1000):
                self.radius = radius
            else:
                raise ValueError("radius must be between 0 and 1000 inclusive")
        else:
            raise TypeError("radius must be a number")
        
        
    def area(self):
        # Define the area functionality below
        return round(((self.radius ** 2) * math.pi),2)

    def circumference(self):
        # Define the circumference functionality below
        return round((self.radius * 2 * math.pi),2)
        
class TestCircleCircumference(unittest.TestCase):
    
    def test_circlecircum_with_random_numeric_radius(self):
        # Define a circle 'c1' with radius 2.5 and check if 
        # it's circumference is 15.71
        c1= Circle(2.5)
        self.assertEqual(c1.circumference(), 15.71)
        
    def test_circlecircum_with_min_radius(self):
        # Define a circle 'c2' with radius 0 and check if 
        # it's circumference is 0.
        c2= Circle(0)
        self.assertEqual(c2.circumference(), 0)
        
    def test_circlecircum_with_max_radius(self):
        # Define a circle 'c3' with radius 1000 and check if 
        # it's circumference is 6283.19.
        c3= Circle(1000)
        self.assertEqual(c3.circumference(), 6283.19)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM