想象一个场景,您希望将以下函数编写为某个较大项目的一部分:
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