如何将测试参考数据保存在单独的商店中?

时间:2012-04-24 11:40:12

标签: python unit-testing datastore

我正在使用unittest库在python中编写测试,我有几个测试环境和不同的测试数据。

  • 存储测试参考数据的最佳方法是什么(我不想将它们放入'test * .py'文件中)?
  • 有没有什么好方法以特殊格式存储(调用方法的输入值,要与之比较的输出值)?

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以编写一个装饰器,从您的自定义商店执行数据检索,并将其传递给实际的测试功能。我过去做过这个:

<强>装饰

from functools import wraps

def data_provider(fn_dp):
  def test_decorator(fn_test):
    @wraps(fn_test)
    def wrapper(self, *args, **kwds):
      for data in fn_dp():
        try:
          fn_test(self, **data)
        except AssertionError, e:
          raise(AssertionError('{0} - [{1}]'.format(e, data)))
    return wrapper
  return test_decorator

现在我可以像这样编写我的单元测试:

data = lambda: (
  {
    'input': '1234',
    'expected_op': '1234'
  },
  {
    'input': '1234',
    'expected_op': '1234'
  }
)

@helper.data_provider(data)
def test_something(self, input, expected_op):
  self.assertEqual(input, expected_op)

现在,装饰器将为所有数据点调用测试函数。

针对您的具体情况,请查看fn_test(self, **data)中的data_provider。您可以从自定义存储中读取**data而不是{{1}},而是从此处调用测试函数。

答案 1 :(得分:0)

我的解决方案: 我有一个存储类,在每次测试之前从json文件中获取测试数据(在setUp方法中调用):

def setUp(self):
    self.data = self.storage.getDataFor(self._testMethodName) 

def test_ftu_02_003(self):
    self.assertEqual(self.data['title'], self.page.get_title())
    self.assertEqual(self.data['header'], self.page.get_header())

和示例json文件示例,json filename与py文件名相同:

{
"test_ftu_02_003":{
    "title":"example_title",
    "header":"example_title"
    }  
}

所以我可以使用每个环境的文件更改路径到文件夹,并且很容易从python代码重写json文件。

问题:输出数据怎么样?
答:所有数据都是输入数据(输入到断言*)