2012-09-07 67 views
0

我有一个unittest测试文件包含四个测试类,每个测试类负责在一个特定的类上运行测试。每个测试课程使我们完全相同set-upteardown方法。 set-up方法相对较大,启动约20个不同的变量,而teardown方法只是将这20个变量重置为其初始状态。python单元测试家务

到目前为止,我一直把这20个变量放在四个setUp类的每一个中。这有效,但不容易维护;如果我决定改变一个变量,我必须在所有四个setUp方法中改变它。然而,我寻找更优雅的解决方案失败了。理想情况下,我只想输入一次我的二十个变量,然后在四种方法中分别调用它们,然后在每种测试方法之后将它们拆下。考虑到这一点,我尝试将变量放在一个单独的模块中,并在每个setUp中导入这些变量,但当然这些变量只能在设置方法中使用(另外,尽管我无法确切地说明原因,这种感觉就像做

from unittest import TestCase 

class Test_Books(TestCase): 
    def setup(): 
     # a quick and easy way of making my variables available at the class level 
     # without typing them all in 

    def test_method_1(self): 
     # setup variables available here in their original state 
     # ... mess about with the variables ... 
     # reset variables to original state 

    def test_method_2(self): 
     # setup variables available here in their original state 
     # etc... 

    def teardown(self): 
     # reset variables to original state without having to type them all in 



class Books(): 
    def method_1(self): 
     pass 

    def method_2(self): 
     pass 
+0

显示实际的代码,而不是说明你正在做什么的评论,而不是显示你在做什么时,确切的代码是问题。 – geoffspear

回答

1

另一种方法是把20个变量成一个单独的类,在该类的__init__中设置的值,然后访问数据作为class.variable,从而唯一的地方设置变量s的__init__和码S不重复。

class Data: 
    def __init__(self): 
     data.x= ... 
     data.y = .... 

class Test_Books(TestCase): 
    def setup(): 
     self.data = Data() 

    def test_method_1(self): 
     value = self.data.x # get the data from the variable 

如果二十个数据彼此相关,则该解决方案更有意义。此外,如果您有二十条数据,我希望它们是相关的,因此它们应该结合在真实的代码中,而不仅仅是在测试中。

+0

选择了这个作为我的答案,因为它更接近我希望能够做到的,并且不需要继承TestCase的子类。再次感谢。 –

1

我会做的是使4测试类每一个基础测试类的子类,这本身就是TestCase的一个子类。然后把SETIP和拆卸的潜在问题多发的方式在基类和其他人休息。

class AbstractBookTest(TestCase): 
    def setup(): 
     ... 

class Test_Book1(AbstractBookTest): 
    def test_method_1(self): 
    ... 

另一种方法是让一个班级不是你所拥有的四个班级,除非你给出了拆分的理由,否则这里的四个班子似乎更具逻辑性。

+0

>>>另一种方法是制作一个班级,而不是四个班级......我想我是这样安排的,因为对于我正在测试的每个班级都有一个测试班级似乎是明智的,我认为您这样认为:并不是绝对必要的,特别是因为课程实际上非常小。我也喜欢你的第一个想法,所以会一起去。 –

+0

@PaulPatterson - 我误解了你的问题我以为你只是在测试一个课程 - 忘记了答案的这一部分。 – Mark

+0

不用担心。我已经完成了子类的事情,它很好地工作。谢谢! –