重置类属性以进行测试

时间:2019-02-25 11:57:28

标签: python unit-testing

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

但是两个测试之间存在依赖性,因为第一个测试只有在第二个测试之前运行才能通过。因此,我需要“重置”类属性。这可能吗?我该怎么办?

2 个答案:

答案 0 :(得分: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,除非您确实不想要这样的初始化方法。然后,选项2比3更可取,因为我认为它没有很多用途。

答案 1 :(得分:0)

将变量重置为“无”,每次单元测试后都会清除总内存。

示例:

class TestEx(unittest.TestCase):

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

    def teardown(self):
        self.class_att = None