在對一個類進行單元測驗時,
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
設定類屬性(#1)而不是實體屬性(#2)的基本原理是什么?類與靜態與實體屬性之間的區別對我來說很清楚(并且在許多其他 SO 帖子中都有說明),但是每個優點/缺點或用例的區別并不是很明顯。
(1)
import unittest
class TestProduct(unittest.TestCase):
@classmethod
def setUp(cls):
cls.product = Product("book", 30)
(2)
import unittest
class TestProduct(unittest.TestCase):
def setUp(self):
self.product = Product("book", 30)
uj5u.com熱心網友回復:
考慮這個例子:
class TestProduct(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.list_a = []
def setUp(self):
self.list_b = []
def test_one(self):
self.assertFalse(self.list_b)
self.list_a.append(1)
def test_two(self):
self.assertFalse(self.list_a)
self.list_b.append(1)
test_two如果它在之前運行會成功test_one,因為類屬性list_a仍然是空的。但是如果它在 之后運行test_one,它將失敗,因為test_one將值附加到共享類屬性。
test_one另一方面,將始終通過,因為即使test_two首先運行,因為test_one看到由setUp緊接之前創建的新空串列test_one被呼叫,而不是被test_two修改的串列。
setUp在呼叫每個實體方法之前呼叫。setUpClass只在定義類之后呼叫一次,但在呼叫任何測驗之前。
在您的示例中,如果實體是不可變的或沒有測驗方法修改實體,則使用哪個都無關緊要Product,因為無論是在setUpor中定義的每個測驗都將看到相同的值setUpClass。但是當共享Product實體可行時,setUpClass比在每次測驗之前重新創建相同的可變值更有效。
uj5u.com熱心網友回復:
順便說一句,類和實體初始化方法的正確名稱是:
class TestProduct(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.product = Product("book", 30)
def setUp(self):
self.product = Product("book", 30)
setUp中的每個測驗方法都會呼叫其中的差異TestProduct。它旨在重置可以通過某些測驗更改的物件的值。另一方面,setUpClass僅在 中的任何測驗之前呼叫一次TestProduct。它旨在用于在任何測驗中從未更改的物件的昂貴初始化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/416268.html
標籤:
下一篇:控制器的單元測驗無法按預期作業
