計算測試數量的Python單元測試

更新時間:2024-04-02 14:10:37

問題闡述

這是我第一次為了學校的作業而玩弄Python的❀單元測試。我基本上有一個Circle對象,我在其中使用pyunit來確保數據被正確存儲。

我注意到,Python只計算作為測試用例的方法的數量,而不是Assert語句的數量。

例如,我想測試方法是否正常工作,盡管有4條Assert語句,但Python只將以下內容計為2個測試。它真的讓我措手不及,因為對于Java的JUnit,它將計算Assert語句的數量。

def test_xcrd(self): 
    self.assertTrue(self.point.xcrd() == 1) 
    self.assertFalse(self.point.xcrd() == 5)

def test_ycrd(self): 
    self.assertTrue(self.point.ycrd() == 2) 
    self.assertFalse(self.point.ycrd() == 10)

Python中的"規范"是什么?每個方法是否應該只有一條Assert語句?

Python

精準答案的unittest包允許您以您所注意到的不同方法來組織您的單元測試。🌜這在您想要測試密切相關且不需要單獨的單元測試的情𒆙況下很有用。

unittest測試從unittest.Testღ子類化開始,然后向子類化添加方法。因此,您可以在不同的單元測試之間添加幾個層間隔🌱,這些層之間的相關性更高,相關性更小。

Python Docs中的一個示例演示了被認為是Python單元測試的最佳實踐:

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()

您可以在此處觀察到以下幾點:

  1. TestStringMethods的三種方法是單獨的單元測試。
  2. test_isuppertest_split都包含兩個斷言,因為它們關系非常密切。為test_isupper中的兩個斷言添加單獨的測試將給代碼添加大量膨脹,并可能導致非常奇怪的問題。

例如,如果str.isupper()以一種奇怪的方式中斷,則覆蓋此單一函數的單一單元測試將中斷。但是,如果"FOO""Foo"的兩個測試是分開的,則一個測試可能通過,而另一個測試可能失敗。因此,測試單個函數的功能更好地保存在帶有多個斷言的單個單🐽元測試中。

同樣適用于test_split方法;檢查str.split()是否起作用和它引發的TypeError密切相關,因此在代碼中也應保持緊密相關。

因此,回到您的問題:每個方法可以(有時應該)有多個斷言,因為這會導致更簡單、更清晰的代碼,并減少混淆。引用"PYTHON的禪宗"(通過在PYTHON外殼中運行import this即可找到):"簡單勝過復雜"。因此,通過在單個方法中對類似的斷言進行分組來保持您的單元測試簡單和結構化。