我有一个像这样的python类:
class MyClass():
class_att = 0
@classmethod
def increase_value(cls):
att = att + 1
我想为这个类准备两个测试:在其中一个中它检查初始值,在另一个中它用该方法增加它。
test_initial_value(self):
self.assertEqual(MyClass.class_att, 0)
test_increase_value(self):
MyClass.increase_value()
self.assertEqual(MyClass.class_att, 1)
但是两个测试之间存在依赖关系,因为第一个测试只会在第二个测试之前运行。所以我需要“重置”类属性。这可能吗?我怎么能这样做?
您尝试保持测试独立性是件好事。在您的特定情况下,您有几种选择。
选项1:您可以为类MyClass
提供显式静态init方法。然后可以在您的测试中使用这种方法。
test_increase_value(self):
MyClass.init()
MyClass.increase_value()
self.assertEqual(MyClass.class_att, 1)
这使得您的单元测试不必直接访问类的内部,以使类恢复到原始状态。如果您在代码中发现其他原因而不仅仅出于单元测试的原因,它也可能是一个不错的选择。
选项2:从单元测试中重置类的状态,如Mebin Joe所示。这使得你的测试稍微不那么稳定,因为你在某种程度上重复了类的内部,因此必须改变你的测试是类更改。您可以使用setUp
和teardown
(在这种情况下可以选择),或直接从每个测试中进行(仅用于演示):
test_increase_value(self):
MyClass.class_att = 0
MyClass.increase_value()
self.assertEqual(MyClass.class_att, class_att_before + 1)
MyClass.class_att = 0 # bring back to initial state
选项3:编写测试,使它们也可以独立于类的状态而可靠地工作:
test_increase_value(self):
class_att_before = MyClass.class_att
MyClass.increase_value()
self.assertEqual(MyClass.class_att, class_att_before + 1)
这有几个缺点:测试代码变得难以阅读,并且以这种方式实现所有期望的测试用例可能并不容易。
简介:我建议选择选项1,除非你真的不想要这样的init方法。然后,选项2优先于3,我没有看到很多用途。
将变量重置为None,每次单元测试后清除总内存。
样品:
class TestEx(unittest.TestCase):
def setUp(self):
self.class_att = "value"
def teardown(self):
self.class_att = None