【问题标题】:Error while testing the TestAreaCreation in Python using Unittest使用 Unittest 在 Python 中测试 TestAreaCreation 时出错
【发布时间】:2020-01-23 10:22:01
【问题描述】:

问题:

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

  1. 半径必须是数值,如果不引发类型错误,错误消息“半径必须是数字”。
  2. 两边的半径必须在 0 到 1000 之间,如果不引发错误消息“radius must be between 0 and 1000 包”
  3. 定义一个类方法 area 和圆周,它必须返回四舍五入到小数点后 2 位的值。

完成测试类TestCircleArea的定义 area 方法的行为如下规范。

定义测试方法test_circlearea_with_random_numeric_radius 它创建半径为 2.5 的圆 c1 并检查其计算面积是否 匹配值 19.63

定义创建的测试方法 test_circlearea_with_min_radius 半径为 0 的圆 c2 并检查其计算面积是否与值匹配 0

定义创建的测试方法 test_circlearea_with_max_radius 半径为 1000 的圆 c3 并检查其计算面积是否与 值 3141592.65

尝试过的解决方案:

import inspect
import re
import unittest
import math

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>1000 or self.radius<0):
            raise ValueError("radius must be between 0 and 1000 inclusive")
        else:
            pass
    def area(self):
        # Define the area functionality below
        return math.pi*(self.radius**2)
    def circumference(self):
        return 2*math.pi*self.radius
        # Define the circumference functionality below

class TestCircleArea(unittest.TestCase):

    def test_circlearea_with_random_numeric_radius(self):
        # Define a circle 'c1' with radius 2.5, and check if 
        # its area is 19.63.
        c1=Circle(2.5)
        self.assertEqual(c1.area(), 2.5)

    def test_circlearea_with_min_radius(self):
        # Define a circle 'c2' with radius 0, and check if 
        # its area is 0.
        c2=Circle(0)
        self.assertEqual(c2.area(), 0)

    def test_circlearea_with_max_radius(self):
        # Define a circle 'c3' with radius 1000.1. and check if 
        # its area is 3141592.65.
        c3=Circle(1000)
        self.assertEqual(c3.area(), 3141592.65)

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 "Solution.py", line 61, in <module>
    pass_count = pass_count[0]
IndexError: list index out of range

请协助解决问题。

【问题讨论】:

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


    【解决方案1】:

    我刚刚修改了 init 方法,它在黑客级别上对我有用。

    类圈子:

    def __init__(self, radius):
        # Define the initialization method below
        pattern=re.compile("^\\-?[0-9]")
        if(pattern.math(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 math.pi*(self.radius**2)
    def circumference(self):
        return 2*math.pi*self.radius
        # Define the circumference functionality below
    

    【讨论】:

      【解决方案2】:

      您必须指定返回语句

      类TestCircleArea(unittest.TestCase):

      def test_circlearea_with_random_numeric_radius(self):
          # Define a circle 'c1' with radius 2.5, and check if 
          # its area is 19.63.
          c1=Circle(2.5)
          return c1.area
          return self.assertEqual(c1.area,19.3)
      def test_circlearea_with_min_radius(self):
          # Define a circle 'c2' with radius 0, and check if 
          # its area is 0.
          c2=Circle(0)
          return c2.area
          return self.assertEqual(c2.area,0)
      def test_circlearea_with_max_radius(self):
          # Define a circle 'c3' with radius 1000.1. and check if 
          # its area is 3141592.65.   
          c3=Circle(1000)
          return c3.area
          return self.assertEqual(c3.area,3141592.65)
      

      【讨论】:

        【解决方案3】:

        修改驱动代码:

        • 移除/删除密码行
        • 直接赋值,即要执行的测试总数。(pass_count = 3)。

        【讨论】:

        • 用提供的代码来回答会更好。
        猜你喜欢
        • 1970-01-01
        • 2014-01-04
        • 2016-12-25
        • 1970-01-01
        • 1970-01-01
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 2013-06-21
        相关资源
        最近更新 更多