2008-10-24 33 views
10

单元测试大数据集的最佳方式是什么?我维护的一些遗留代码具有一百或更多成员的结构;我们正在处理的代码的其他部分创建或分析数百个样本的数据集。单元测试大数据集?

到目前为止,我发现的最佳方法是从磁盘序列化结构或数据集,执行测试操作,将结果序列化到磁盘,然后将包含序列化结果的文件与包含预期结果的文件进行比较。这不是非常快,它违反了单元测试的“不要触摸磁盘”的原则。然而,我能想到的唯一选择(编写代码来初始化并测试数百个成员和数据点)似乎令人无法忍受。

有没有更好的解决方案?

+0

如果您正在测试数据本身,我认为您必须触摸磁盘。 – MrBoJangles 2008-10-24 22:07:52

回答

1

这仍然是一个可行的方法。虽然,我会将它分类为功能测试,或者不是纯粹的单元测试。一个好的单元测试是对那些可能遇到的边缘案例进行良好分布的记录进行抽样,然后写出来。然后,您对所有数据进行批量测试,然后进行最后一次“验收”或“功能”测试。

我在测试大量数据时使用了这种方法,并且我发现它工作得很好,因为小单位是可维护的,然后我知道批量测试可以工作,而且都是自动的。

3

如果你试图实现的是,事实上,单元测试你应该嘲笑底层数据结构并模拟数据。这种技术可以让您完全控制输入。例如,您编写的每个测试都可以处理单个数据点,并且您将针对每个条件都有一组非常简洁的测试。有几个开源的嘲笑框架,我个人推荐Rhino Mocks(http://ayende.com/projects/rhino-mocks/downloads.aspx)或NMock(http://www.nmock.org)。

如果你不可能嘲笑数据结构,我推荐重构,以便你能够:-)它值得!或者你也可以尝试TypeMock(http://www.typemock.com/),它允许嘲笑具体的课程。

但是,如果您正在对大型数据集进行测试,那么您确实正在运行功能测试而不是单元测试。在这种情况下,将数据加载到数据库或从磁盘加载数据是一种典型操作。与其避免它,你应该努力让它与自动构建过程的其余部分并行运行,这样性能的影响不会让你的任何开发人员受到影响。

1

到目前为止,我发现的最佳方法是从磁盘序列化结构或数据集,执行测试操作,将结果序列化到磁盘,然后将包含序列化结果的文件与包含预期文件结果。

我已经编写了使用上述技术的代码,除了在测试中从磁盘序列化以外,我已经将序列化数据转换为编译器可以放入可执行文件的字节数组。

例如,你的序列化的数据可以被转换成:

unsigned char mySerialisedData[] = { 0xFF, 0xFF, 0xFF, 0xFF, ... }; 

test() 
{ 
    MyStruct* s = (MyStruct*) mySerialisedData; 

} 

对于一个更详细的例子(在C#)看到此unit test。它显示了使用一些硬编码的序列化数据作为测试输入的例子,测试程序集签名。