2012-04-24 88 views
3

我正在用python编写测试,用unittest库,我有几个测试环境和不同的测试数据。如何将测试参考数据保存在单独的商店中?

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

任何想法?

+0

安德鲁,我编辑了一下。你期望在数据存储中有“输入数据”和“预期结果”吗? – karlcow 2012-07-10 18:10:02

回答

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) 

现在装饰将调用测试功能的所有数据点。

对于您的具体情况,请在data_provider中查看fn_test(self, **data)。而不是**data您可以从您的自定义存储中读取并从此处调用测试功能。

+0

我需要如何组织数据存储的想法。即:我需要填写2个输入(我有ID),点击按钮并检查结果(表格) – 2012-04-24 15:14:38

0

我的解决办法下: 我有一个存储类,女巫也会从JSON文件的测试数据,在每个测试之前(在安装方法调用):

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文件名是相同的作为PY文件名:

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

这样我就可以改变路径为每个环境的文件夹中,它很容易从Python代码重写JSON文件。

问题:那么输出数据呢?
答案:所有的数据都是输入数据(它去输入断言*)

相关问题