[英]Unit testing using library 'unittest' in Python 3
我需要在 Python 中使用單元測試編寫測試用例來測試圈子的創建。
使用方法 init 定義一個 class Circle,它初始化一個具有屬性 radius 的圓,具有以下限制。
- 半徑必須是數值,如果不是引發類型錯誤,錯誤消息為“半徑必須是數字”。
- 兩側的半徑必須在 0 到 1000 之間(含),如果不引發錯誤消息“半徑必須在 0 到 1000(含)之間”的值錯誤
- 定義一個 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)
只需修改代碼如下:
這只是為了跳過不斷令人惱火的默認事情。
您收到錯誤是因為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.