在python3中使用unittest进行单元测试

时间:2019-08-25 08:52:13

标签: python python-3.x unit-testing python-3.6 python-unittest

我需要在python中使用单元测试编写测试用例,以测试圈子的创建。

  

使用方法init定义一个Circle类,该方法使用以下方法初始化cicle   属性半径,具有以下限制。

     
      
  1. 半径必须为数字值,如果不是,则引发类型错误,并显示错误消息“半径必须为数字”。
  2.   
  3. 半径两边都必须在0到1000之间(含0和1000),如果没有提高数值,则会显示错误消息“半径必须在0到1000之间   1000含”
  4.   
  5. 定义类方法的区域和周长,必须将其值四舍五入到小数点后两位。
  6.   
     

完成类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。

如果名称 =='主要':

    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

5 个答案:

答案 0 :(得分:0)

我可以使用下面的类和“测试类方法”解决给定的问题。

班级圈子:

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)

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)

答案 1 :(得分:0)

只需修改以下代码:

  1. 删除/删除密码行
  2. 直接分配值,即要执行的测试总数。
  3. 享受,没有更多的错误。

这只是跳过默认的令人烦恼的事情。

答案 2 :(得分:0)

由于在 init 方法中添加了条件,因此未初始化C3的值,因此出现错误。

如果要初始化1000.1,请删除它

班级圈子:

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,不是您要测试的值,请打印并检查一次。

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)

我希望这能解决您的问题。

答案 3 :(得分:0)

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

我确认这工作正常。数字是 1000,而不是 1000.1。输入建议似乎有问题。

答案 4 :(得分:0)

类圆:

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)

    

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)
    self.assertEqual(c3.area(), 3141592.65)
相关问题