重置类属性以进行测试

问题描述 投票:0回答:2

我有一个像这样的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)

但是两个测试之间存在依赖关系,因为第一个测试只会在第二个测试之前运行。所以我需要“重置”类属性。这可能吗?我怎么能这样做?

python unit-testing
2个回答
1
投票

您尝试保持测试独立性是件好事。在您的特定情况下,您有几种选择。

选项1:您可以为类MyClass提供显式静态init方法。然后可以在您的测试中使用这种方法。

test_increase_value(self):
    MyClass.init()
    MyClass.increase_value()
    self.assertEqual(MyClass.class_att, 1)

这使得您的单元测试不必直接访问类的内部,以使类恢复到原始状态。如果您在代码中发现其他原因而不仅仅出于单元测试的原因,它也可能是一个不错的选择。

选项2:从单元测试中重置类的状态,如Mebin Joe所示。这使得你的测试稍微不那么稳定,因为你在某种程度上重复了类的内部,因此必须改变你的测试是类更改。您可以使用setUpteardown(在这种情况下可以选择),或直接从每个测试中进行(仅用于演示):

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,我没有看到很多用途。


0
投票

将变量重置为None,每次单元测试后清除总内存。

样品:

class TestEx(unittest.TestCase):

    def setUp(self):
        self.class_att = "value"

    def teardown(self):
        self.class_att = None
© www.soinside.com 2019 - 2024. All rights reserved.