亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

單元測試簡單的方法……完善的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 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號