如何测试程序处理以不可预测的格式存储的大量数据

时间:2009-06-11 12:46:53

标签: excel exception testing parsing

我必须做什么

我正在尝试操作存储在Excel文件中的一些相当大量的数据(其中一个工作簿有多达150个电子表格)。这些操作的结果可能会在数据库表中产生大约800.000行。

问题

存储在电子表格中的数据具有不可预测的格式。生成这些电子表格的公司没有用于导出这些文件的固定/文档格式,有时会出现错误数据。例如,大多数年份表示为“2009”,但有些情况下一年表示为“20”。其他例子,数据在这些文件中没有真正规范化,因此我使用分隔符来分割某些单元格的值。有时这些分隔符会改变。

有些类似我无法预测的事情,我只是在我的程序已经进化过很多部分可用数据之后才发现它们。

问题

如何在这种情况下测试程序的正确性?或者更确切地说,如何在不运行整个可用数据的情况下实现产品的漂亮稳定版本?

如果出现某种意外问题,我采取防御措施并抛出异常吗?然后程序的主循环可以捕获并记录它们并继续使用可用数据?这将产生一些已处理的数据,但这意味着在程序的后续迭代中,我必须检查先前迭代中已经存在于数据库中的内容(我不喜欢)。

你有什么看法?你会如何解决这个问题?

6 个答案:

答案 0 :(得分:3)

如果没有关于数据格式的规范,那么任何事情都是可以接受的。

如果没有,则存在明确或隐式的数据规范。我现在试着把它钉下来。如果你无法获得足够明确的数据定义来编写你的程序,以便它可以毫无错误地运行,那么我会说你冒很大的风险会导致一些严重的损坏,具体取决于这些数据的来源。被使用。

您应编写程序,以便在运行不符合规范的数据时抛出异常或记录错误。然后,在可用数据的PART上运行该程序,直到它运行无例外。这可以被视为用于开发程序的培训集。然后,使用一些保存的数据作为TEST集。这将为您估算程序在生产中将产生的异常/错误数量。

过度拟合是一种常见的机器学习概念,但它对其他任务很有用 - 例如程序开发。令我惊讶的是,开发人员如何编写一系列单元测试,编写应用程序以在其上执行良好的编码,然后期望在生产中具有类似或无错误的性能。

如果您不愿意采取所有这些步骤(即在基本上所有数据上运行代码 - 因为测试集也在使用数据),那么我会说任务太大而无法完成

答案 1 :(得分:2)

顺便说一句,你可能想要创建一个新的,规范化的(在某种意义上说这些东西是正确的),而不是创建一个非常奇怪和特殊的格式定义来解释当前数据中的所有“错误”。简化了)数据规范,然后编写一个“错误的文档修补程序”,可以在错误的文档上运行来修复数据。

如果生成数据的应用程序仍在生产中,那么您可能需要转到此应用程序的开发人员以获取新规范的购买。一旦你有了,你可以开始针对他们的应用程序记录错误,所以希望错误的文档修补程序可以退役。

更有可能的是,我猜测软件开发人员早已不复存在,没有人能够理解代码,如果它甚至可以运行的话。

答案 2 :(得分:2)

如何在这种情况下测试程序的正确性?或者更确切地说,如何在不运行整个可用数据的情况下实现相当稳定的产品版本?

对于每种数据类型,我都会对允许的值设置合理的约束。 如果某个单元格违反了这些约束,则抛出一个异常,其中包含失败的数据及其数据类型。如果一条数据违反了其约束条件,您可以修改源代码以包含该数据所需的其他约束条件,以及使其统一的转换方法。

举一个你给出的日期的例子,最初一个日期的约束条件是它只能是四位数。当程序遇到“20”时会抛出异常。 然后你可以允许两位数日期,以及一种将两位数日期转换为四位数日期的方法,以便进一步处理。

答案 3 :(得分:1)

一个问题是,你会不止一次运行你的程序?根据您的问题,您可能只想运行一次,然后您将使用数据库中的数据。

在这种情况下,您可以非常防守 - 每当出现意外数据时抛出异常。在更大的数据集上重复运行程序。最初,通过更改代码来解决任何异常,因为这是一个很好的经验法则,您首先找到的异常将是常见的。您可能希望在运行之间清空输出数据库。

稍后,您将发现罕见的异常,这些异常可能仅在输入中出现几次。只需手动解决这些问题,然后自己在数据库中插入相应的行。或者编写另一个小程序来读取您的异常信息并插入新行,而不是再次运行整个大程序。

答案 4 :(得分:1)

通常我会按照@MarkJ的建议来做这些事情,并且我在单元测试中对整个事情进行编码。

所以我编写了一个小数据文件,它最初只包含几行普通数据。那个单元测试编号为1。

然后我对一些数据进行快速视觉扫描,以发现任何明显的异常。单元测试2到n。

最后,我编写解析器代码,直到它通过所有单元测试,并抛出并记录所有未管理数据的异常。

然后我使用这些奇怪的数据位来进行新的单元测试,并改进解析器,直到它也可以通过它们。

虽然有时候容纳一些非常奇怪的数据会增加解析器的复杂性而不是它的价值,我只会记录异常,转储它,继续前进。这是一个专业判断问题。

答案 5 :(得分:0)

如何处理每一条数据(这样你就不必检查欺骗)。那些传递进入数据库。异常进入异常文件。用户可以打开异常文件并对数据进行更正/修改。然后他们可以在异常文件上运行你的程序。

这将隔离未处理的数据以供用户更正并阻止您处理相同的数据两次(或更多次)。