单元测试大数据集?

时间:2008-10-24 22:03:44

标签: unit-testing

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

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

有没有更好的解决方案?

3 个答案:

答案 0 :(得分:3)

如果您要实现的目标实际上是单元测试,则应该模拟基础数据结构并模拟数据。此技术使您可以完全控制输入。例如,您编写的每个测试都可以处理单个数据点,并且您将为每个条件提供非常简洁的测试集。有几个开源模拟框架,我个人推荐Rhino Mocks(http://ayende.com/projects/rhino-mocks/downloads.aspx)或NMock(http://www.nmock.org)。

如果您无法模拟数据结构,我建议您进行重构,以便您能够:-)它值得!或者您可能还想尝试TypeMock(http://www.typemock.com/),它允许模拟具体的类。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

  

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

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

例如,您的序列化数据可以转换为:

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

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

}

有关更详细的示例(在C#中),请参阅此unit test。它显示了使用一些硬编码序列化数据作为测试输入,测试程序集签名的示例。