【问题标题】:Python Unit testing backup staticsPython 单元测试备份静态
【发布时间】:2013-05-21 17:25:02
【问题描述】:

我正在尝试在 python 中进行单元测试,但我遇到了静态属性问题。
问题是:Python 不备份静态属性,这意味着测试行为不可预测。这是一个示例代码:

def test1(self):
    self.assertIsNone(MyClass.var)
    Config.var = "It works"
    self.assertEquals("It works", MyClass.var)

def test2(self):
    self.assertIsNone(MyClass.var) # Fails
    Config.var = "It works really"
    self.assertEquals("It works really", MyClass.var)

在给定的情况下,我可以通过在第一次测试结束时或使用setUp()tearDown() 重置值来避免这种情况,但在我的情况下不是(很难举例)。我想让脚本自动备份类的所有静态属性,就像我在 PHP 中习惯的那样。

我用鼻子 (nosetests path_to_tests) 运行所有单元测试,但如果需要,我会切换“测试框架”。

【问题讨论】:

  • Fwiw,首先使用全局可变数据(并且类属性是全局的)通常被认为是不好的风格。
  • 我无法避免它,因为在运行测试时调用的方法不幸地改变了类属性。我想备份所有类属性,以便每个测试都具有相同的默认类属性和全局变量。测试完成后,应重置所有全局和类属性。

标签: python unit-testing static-members nose


【解决方案1】:

我不确定您为什么要避免使用 setup() 和 teardown() 函数,但无论出于何种原因,是什么阻止您构建自己的伪设置函数?例如:

def test1(self):
    MyClass.prep()
    self.assertIsNone(MyClass.var)
    Config.var = "It works"
    self.assertEquals("It works", MyClass.var)

def test2(self):
    MyClass.prep(var="whatever")
    self.assertIsNone(MyClass.var) # Fails
    Config.var = "It works really"
    self.assertEquals("It works really", MyClass.var)

def prep(self, var="temp", var2="temp2"):
    MyClass.var = var
    MyClass.var2 = var2 

我之前做过这个,在某些情况下我希望外部设备进行测试以禁用自身。我刚刚构建了一个可以将其关闭的功能,并且在我想要执行的任何测试中,我只需运行“准备”功能以确保测试有效。然后,如果测试成功,就在完成之前,我会再次调用 prep 函数以重新打开设备。

【讨论】:

  • 对不起。我想你弄错了。我需要备份所有类的静态值,因为单元测试调用了一个更改静态值的方法。我不知道它改变了哪些值(因为我没有对其进行编程)我只知道它会影响其他测试。但是,我通过创建一个模拟类Config 的模拟类避免了这个问题。这非常耗时,但它确实有效。我想这是唯一的方法。
猜你喜欢
  • 1970-01-01
  • 2021-11-06
  • 2016-09-07
  • 2019-05-11
  • 1970-01-01
  • 2011-08-03
  • 2011-08-23
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多