如何在Python中成功地进行单元测试?

2024-10-03 15:34:07 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试着运行一个单元测试,在这个测试中只有一个正确的解决方案通过,而其他所有不正确的解决方案都需要失败。但是,问题是单元测试必须考虑广泛的测试用例甚至负值。如果只有一个解决方案通过,而其他解决方案都失败了,我怎么做呢?我听说有人通过使用哈希表高效地实现了这一点,其中输入是键,输出是值

我下面所做的显然不足以作为一个单元测试,并且被标记为不正确

单元测试/讲座/MainObject.py

def computeShippingCost(input):
    if (0 < input <= 30):
        return 5
    elif (input > 30):
        return ((input - 30) * 0.25) + 5

单元测试/tests/Testing.py

from lecture.MainObject import computeShippingCost

class Testing(object):
    def Test(self):
        assert computeShippingCost(20) == 3 #incorrect
        assert computeShippingCost(-30) == -8 #incorrect
        assert computeShippingCost(40) == -20 #incorrect
        assert computeShippingCost(50) == 10 #correct

Tags: py标记inputreturndef测试用例assert单元测试
1条回答
网友
1楼 · 发布于 2024-10-03 15:34:07

从你的例子和描述中,我认为可能有一个关于测试应该是什么样子的基本误解。每个测试都会以某种方式刺激它的主体(被测试的系统,又称SUT),然后验证结果是否符合预期

在一个非常抽象的层次上,测试如下所示:

def myTest():
    <Prepare the SUT for the test>
    <Stimulate the SUT>
    <check if the result matches the expectation>

其目的是,失败的测试将表明SUT中存在bug。正确实现的代码不会导致测试失败。(*)

在您的代码示例中,您刺激了SUT并按以下方式检查了结果:

assert computeShippingCost(20) == 3 #incorrect

computeShippingCost的实现可以清楚地看出,这种情况下的结果将是5,而不是3。现在有两种可能性:

A)computeShippingCost实现正确。那么,这种情况下的期望值应该是5。针对5以外的任何内容的断言都将失败。这违反了上述目标(*),因为尽管代码实现正确,但测试仍将失败

B)computeShippingCost有一个bug,在这种情况下它实际上应该提供3。然后,这个断言表示一个有用的测试,它失败的事实向您表明您的函数有一个bug

相关问题 更多 >