簡體   English   中英

Python unittest計算測試數量

[英]Python unittest counting the number of tests

這是我第一次使用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是密切相關的,因此最好在代碼中將它們保持在一起。

因此,回到您的問題:每個方法可以(有時應該)有多個斷言,因為它可以導致代碼更簡單明了,並且混亂更少。 引用“ Zen of Python”(通過在Python shell中運行import this找到import this ):“簡單勝於復雜”。 因此,通過在一個方法中將相似的斷言分組,可以使單元測試變得簡單和結構化。

您的問題的答案'''python中的“規范”是什么? 每個方法應該只有一個assert語句嗎?'''是“ No”。 有人可能會說“是”,但是包括我在內的CPython核心開發人員通常在測試方法中使用多個斷言。 查看Lib/test中的test_xyz文件(如果您的安裝包括該目錄)。

的確,一種方法應該測試一個單元甚至一個單元的一種行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM