为了账号安全,请及时绑定邮箱和手机立即绑定

单元测试简单的方法……完善的OOP / pythonic解决方案?

单元测试简单的方法……完善的OOP / pythonic解决方案?

大话西游666 2021-03-20 15:15:14
我正在尝试以一种良好的面向对象的方式设计和测试类似于以下代码的代码吗?(或以Python方式?)这是一个工厂类,它决定一个人的名字是长还是短:class NameLengthEvaluator(object):    def __init__(self, cutoff=10)        self.cutoff = cutoff    def evaluate(self, name):        if len(self.name) > cutoff:            return 'long'        else:            return 'short'这是一个对自己的名字长度有意见的人类: class Person(object):     def __init__(self, name=None, long_name_opinion=8):         self.name = name     def name_length_opinion(self):         return 'My names is ' + \                    NameLengthEvaluator(long_name_opinion).evaluate(self.name)几个问题:该Person方法是否name_length_opinion()值得进行单元测试,如果可以,它将是什么样?通常,是否有一种很好的方法来测试具有完全外部功能的类的简单方法?似乎对该方法的任何测试都只会重述其实现,并且该测试只是为了确认没有人触摸代码而存在。
查看完整描述

4 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

单元测试

Person方法name_length_opinion()是否值得进行单元测试,如果是的话,它将是什么样?

您是否要确保它按照您的想法做,并确保将来不会损坏?如果是这样,请为此编写一个单元测试。

并且该测试只是为了确认没有人触摸代码而存在

单元测试更多是关于确保类符合其指定的合同。您不必为所有内容编写单元测试,但是,如果这是一种简单的方法,无论如何,它都应该是一个简单的单元测试。

重复

似乎对此方法进行的任何测试都只会重述其实现

您不应该重复算法,而应该使用用例。例如,NameLengthEvaluator截止值为的a10应该是以下简称:

  • 乔治

  • 玛丽

这些是长名称:

  • 麦克刀

  • 开膛手杰克

因此,您应该验证该方法正确报告了这些名称的缩写。您还应该测试NameLengthEvaluator截断为的a4将报告Mary为短而其他报告为长。

丢码?

如果您曾经编写过一个类,然后编写了一个主方法,该方法只是运行该类以确保其执行了预期的工作(然后在移至另一个类时就将该主方法扔掉了),那么您已经编写了单元测试。但是不要丢掉它,而要保存并将其转换为单元测试,以便将来可以确保您没有破坏任何东西。

外部代码

通常,是否有一种很好的方法来测试具有完全外部功能的类的简单方法

好吧,如果它完全是外部的,那么为什么要在该类上使用它呢?通常,您至少有一些可以测试的逻辑。在这种情况下,您可以测试name_length_opinion返回的结果My names is longMy names is short正确的情况。


查看完整回答
反对 回复 2021-03-31
?
偶然的你

TA贡献1841条经验 获得超3个赞

这实际上取决于该代码的生命周期。显然,在当前状态下,该方法显然是正确的,并且单元测试更多地是关于其行为方式的规范。如果您打算在将来进行更改(NameLengthEvaluator例如,以某种方式重新实现),那么进行单元测试就很好了,因为运行测试会捕获任何回归。但是在这种情况下,您似乎不太可能进行任何更改,因此测试可能过度(尽管进行了健全的检查)。


查看完整回答
反对 回复 2021-03-31
  • 4 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号