📜  不要忘记边缘案例!

📅  最后修改于: 2021-10-22 03:15:27             🧑  作者: Mango

想象一个场景,您希望将以下函数编写为某个较大项目的一部分:

W¯¯RITE一个函数返回一个三角形的基于三角形的3个边的长度的值的类型。让我们让它更简单一点,假设输入数据类型的测试已经到位,因此您只收到数字值来处理。

情况看起来很简单,您可以继续编写如下所示的函数–

算法 :

Input : 3 numeric values
Output : 1 string stating type of triangle
Function : triangleType(side1, side2, side3)
Start :
1. If side1 == side2 == side3
   Then Return “Equilateral Triangle”
2. Else if side1 == side2 or side1 == side3 or side2 == side3
   Then Return “Isosceles Triangle”
3. Else
   Return “Scalar Triangle”
Stop

完成函数,您将获得几个要执行的断言。令您惊讶的是,您发现只有 50% 的案例通过了。

让我们看看测试语句。通过的是:

1. 断言 if (String_toLowerCase(triangle_type(6,7,8))==”scalar triangle”) =正确
2. 断言 if (String_toLowerCase(triangle_type(6,6,6))==”等边三角形”) =正确
3. assert(String_toLowerCase(triangle_type(6,7,6))==”等腰三角形”) =正确

嗯,到目前为止一切都很好。但失败的是:

4. 断言 if (String_toLowerCase(triangle_type(0,0,0))==”not a triangle”) =不正确
5. 断言 if (String_toLowerCase(triangel_type(-6,-7,-8))==”not a triangle”) =不正确
6. 断言 if (String_toLowerCase(triangle_type(5,3,8))==”not a triangle”) =不正确

  • 在第4 条语句中,输入值为 (0,0,0)。现在我们知道 (0,0,0) 形成一个点而不是一个三角形。事实上,如果任何输入值为零,则三角形是不可能的。但在我们的例子中,它会返回等边三角形!
  • 此外,第5 条语句提醒我们,长度永远不能为负值。您会看到一个 -30 厘米长的秤。因此,如果我们甚至有一个 -ve 的长度值,则三角形是不可能的。但在我们的例子中,根据值,它可能会返回 3 个结果中的任何一个。这里它返回一个标量。
  • 现在,第 6 条语句怎么样。所有值都 >= 0,它肯定是一个标量三角形。或者是吗?请记住,在三角形中,2 条边的总和总是大于第 3 条。

在这里我们看到:

8 + 3 > 5
8 + 5 > 3
5 + 3 > 8

输出 :

True
True
False

它没有通过三角形的测试。因此长度 (3,5,8) 不形成三角形。

所以我们需要的是一种适当的三角形验证,它告诉我们我们所拥有的是否是三角形。作为解决方案的一部分,您编写另一个函数,如下所示:

算法 :

Input : 3 sides of the triangle
Output : Boolean value: True if 3 sides form a triangle, false otherwise
Function : triangleValidator(side1, side2, side3)
Start
1. If (side1 <= 0 or side2 <= 0 or side3 <= 0) and
      (side2 + side3 > side1) and
      (side3 + side1 > side1)
   then return True
3. Return False
Stop

我们之前的函数现在在开头和 wola 中包含了 2 行额外的行!现在所有的测试都在通过。

这只是一个简单的示例场景,提醒我们在编写生产级代码时,即使是简单的事情也要小心。通过记住简单的边缘情况,并使用统一的字符串情况进行检查,我们增加了测试覆盖率并使我们的程序返回在数学上更正确的结果。

以下是上述方法的实现:

# Check if given sides form a triangle or not
def triangleValidator(side1, side2 , side3):
      
    if side1 <= 0 or side2 <= 0 or side3 <= 0:
        return False
          
    elif (side1 + side2 > side3) and\
         (side2 + side3 > side1) and\
         (side3 + side1 > side2):
        return True
    return False
  
# Return the type of trinagle
def triangleType(side1, side2, side3):
      
    # If not a triangle, return "Not a triangle"
    if triangleValidator(side1, side2, side3) == False:
        return "Not A Triangle"
          
    # Else perform type checking
    if side1 == side2 == side3:
        return "Equilateral Triangle"
          
    elif (side1 == side2) or\
         (side2 == side3) or\
         (side3 == side1):
        return "Isoceles Triangle"
          
    return "Scalar Triangle"
  
assert (triangleType(6,7,8).lower() == "scalar triangle")
assert (triangleType(6,6,6).lower() == "equilateral triangle")
assert (triangleType(6,7,6).lower() == "isoceles triangle")
assert (triangleType(0,0,0).lower() == "not a triangle")
assert (triangleType(-6,-7,-8).lower() == "not a triangle")
assert (triangleType(5,3,8).lower() == "not a triangle")

成功完成后,不返回任何输出,表明所有测试均已通过。

输出 :

No output