对大型数据集进行单元测试的最佳方法是什么?我维护的一些遗留代码具有上百个成员或更多成员的结构;我们正在处理的代码的其他部分创建或分析数百个样本的数据集。
到目前为止,我找到的最好的方法是序列化磁盘中的结构或数据集,执行测试下的操作,将结果序列化到磁盘,然后将包含序列化结果的文件与包含预期结果的文件进行比较。这并不是非常快,而且它违反了单元测试的“不接触磁盘”原则。然而,我能想到的唯一替代方案(编写代码来初始化和测试数百个成员和数据点)似乎乏味得令人无法忍受。
有没有更好的解决方案?
发布于 2008-10-24 22:22:53
如果您试图实现的实际上是一个单元测试,那么您应该模拟出底层数据结构并模拟数据。这项技术使您可以完全控制输入。例如,您编写的每个测试可以处理单个数据点,并且您将为每个条件提供一组非常简洁的测试。有几个开源的模拟框架,我个人推荐Rhino Mock (http://ayende.com/projects/rhino-mocks/downloads.aspx)或NMock (http://www.nmock.org)。
如果你不可能模拟出数据结构,我建议你进行重构,这样你就能够:-)值得!或者,您可能还想尝试TypeMock (http://www.typemock.com/),它允许模拟具体的类。
但是,如果您正在对大型数据集进行测试,那么您实际上是在运行功能测试,而不是单元测试。在这种情况下,将数据加载到数据库或从磁盘加载数据是典型操作。而不是避免它,您应该让它与您的自动化构建过程的其余部分并行运行,这样性能影响就不会阻碍您的任何开发人员。
发布于 2008-10-24 22:13:56
这仍然是一种可行的方法。不过,我会将其归类为功能测试,或者不是纯粹的单元测试。一个好的单元测试应该是对那些记录进行采样,这些记录可以很好地分布您可能遇到的边缘情况,并将它们记录下来。然后,对所有数据进行批量测试,进行最后一次“验收”或“功能”测试。
我在测试大量数据时使用了这种方法,我发现它工作得足够好,因为小单元是可维护的,然后我知道批量测试是有效的,而且它是自动的。
发布于 2008-10-25 22:22:12
到目前为止,我发现的最好的方法是从磁盘序列化结构或数据集,执行测试下的操作,将结果序列化到磁盘,然后将包含序列化结果的文件与包含预期结果的文件进行比较。
我已经编写了使用上述技术的代码,除了在测试中不是从磁盘序列化之外,我已经将序列化的数据转换为一个字节数组,编译器可以将其放入可执行文件中。
例如,您的序列化数据可以转换为:
unsigned char mySerialisedData[] = { 0xFF, 0xFF, 0xFF, 0xFF, ... };
test()
{
MyStruct* s = (MyStruct*) mySerialisedData;
}有关更详细的示例(在C#中),请参阅此unit test。它展示了一个使用一些硬编码的序列化数据作为测试输入的示例,测试程序集签名。
https://stackoverflow.com/questions/235402
复制相似问题