在单元测试中,
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)
发布于 2022-01-19 10:58:50
考虑一下这个例子:
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
实例是不可变的,或者没有测试方法修改实例,那么使用什么并不重要,因为无论是在setUp
还是setUpClass
中定义,每个测试都会看到相同的值。但是,当共享Product
实例可行时,setUpClass
比在每次测试之前重新创建相同的可变值更有效。
发布于 2022-01-19 10:55:04
另外,类和实例初始化方法的正确名称是:
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://stackoverflow.com/questions/70776156
复制