【问题标题】:unittest housekeeping in pythonpython中的unittest内务管理
【发布时间】:2012-09-07 10:14:29
【问题描述】:

我有一个unittest 测试文件,其中包含四个测试类,每个测试类负责在一个特定类上运行测试。每个测试类都让我们使用完全相同的set-upteardown 方法。 set-up 方法比较大,初始化大约 20 个不同的变量,而 teardown 方法只是简单地将这 20 个变量重置为初始状态。

到目前为止,我已经在四个 setUp 类中的每一个中放置了 20 个变量。这可行,但不是很容易维护;如果我决定更改一个变量,我必须在所有四个 setUp 方法中更改它。然而,我寻找更优雅的解决方案失败了。理想情况下,我只想输入我的 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

【问题讨论】:

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

标签: python unit-testing fixtures


【解决方案1】:

另一种方法是将二十个变量放入一个单独的类中,在类的__init__ 中设置值,然后以class.variable 的形式访问数据,因此在__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

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

【讨论】:

  • 选择了这个作为我的答案,因为它更接近我希望能够做的事情,并且不需要继承 TestCase。再次感谢。
【解决方案2】:

我要做的是让 4 个测试类中的每一个都成为一个基础测试类的子类,该基础测试类本身就是 TestCase 的子类。然后将 setip 和 teardown 放在基类中,其余的放在其他类中。

例如

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

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

另一种方法是只让一个班级而不是你拥有的四个班级,这在这里似乎更合乎逻辑,除非你给出分裂的理由。

【讨论】:

  • >>>另一种方法是只制作一个课程而不是您拥有的四个课程......我想我是这样安排的,因为我测试的每个课程都有一个测试课程似乎是明智的,我认为您的观点并非绝对必要,特别是因为课程实际上很小。我也喜欢你的第一个想法,所以两个都试试。
  • @PaulPatterson - 我误读了你的问题,我以为你只是在测试一个课程 - 忘记这部分答案。
  • 不用担心。我已经完成了子类化的事情,而且效果很好。谢谢!
猜你喜欢
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多