如何测试文件阅读器?


19

我正在一个具有几种文件格式的项目。某些格式由.xsds指定,其他格式由各自网站上的文档指定,而某些格式是自定义的内部格式,没有文档。姆哈哈哈哈哈

有什么问题?

我想测试我的文件阅读器,但是我不确定如何去做。应用程序的流程是这样的:

file.___  ===> read by FileReader.java ===> which creates a Model object

FileReader接口在哪里

public interface FileReader {
    public Model read(String filename);
}

Model拥有一批在读文件已填充属性。看起来像

public class Model {
    List<String> as;
    List<String> bs;
    boolean isAPain = true;
    // ...
}

我尝试了什么?

我唯一的想法是为每种文件格式创建文件“生成器”。这些生成器基本上是生成器,它们接受一些变量(例如,要在文件中生成的注释数量),并输出一个样本文件,然后我将其读入并将结果Model与我最初用于生成文件的变量进行比较。

但是,这有一些问题:

  • 它生成的文件看起来不像真实文件。生成器绝不了解上下文。
  • 由于我是手动设置变量的生成器,因此很难识别生成器是否针对边缘情况生成了。这种方法仅比我创建十几个示例文件更好。

有没有更好的方法可以做到这一点?

编辑:将单元更改为集成,因为这实际上是我的意思。

EDIT2:这是我提到的边缘案例的示例。

每个文件代表一个由顶点和边组成的图形。这些顶点和边可以以不同的方式连接,因此:

v1 -- e1 --> v2 <-- e2 -- v3

与...不同

v1 -- e1 --> v2 -- e2 --> v3

因为边缘的方向很重要。我不确定这是否在问题范围内,但是当我手动设置顶点数,边数并仅随机生成连接时,很难考虑所有相关的边沿情况。


1
想到数据驱动的测试。您能否给出边缘案例的具体示例(基于实际FileReader实现中可能触发的边缘案例)?示例:给定以图像文件格式找到的边缘情况,对于每个表条目,如果支持属性的行/列组合,则应该至少有一个测试用例(数据文件)覆盖该组合。
rwong 2013年

@rwong我添加了一个示例,但不确定是否能给您一个想法。我猜我的问题是边缘情况下的常见问题。我错过了吗?虽然,数据驱动的测试看起来很有趣。谢谢!
sdasdadas

7
另外,我只是注意到了这一点,但是我的边缘情况实际上是边缘情况。
sdasdadas 2013年

1
为什么不手工制作测试文件,然后始终对相同文件运行?
Bobson 2013年

@Bobson这比使用发电机要差一些。在那种情况下,我可能会错过一些边缘情况(因为我现在可能很想念),但是我也可能在打字时引入错误。对于大型文件,我自己创建它们将花费相当长的时间。
sdasdadas

Answers:


19

首先,让我们谈谈您的目标是:

  • 您显然不想测试“文件格式”-您想测试不同的FileReader实现

  • 您想通过自动测试找到尽可能多的不同类型的错误

为了完全实现该目标,恕我直言,您必须结合不同的策略:

  • 首先,进行真实的单元测试:您的FileReader实现将包含许多不同的部分和功能。编写小测试,分别测试每个小测试;以不需要真正从文件中读取数据的方式来设计函数。这些测试将帮助您测试大多数情况。
  • 第二,生成的文件:这些就是我所说的集成测试。此类文件将帮助您查找与第1点不同的故障,例如,特定参数的组合,文件访问错误等。要创建良好的测试用例,了解一些经典技术(例如将测试用例分组为一组)也将很有帮助。等价类或边界值测试。获取Glenford Myers这本书的副本,以了解有关此内容的更多信息。在关于软件测试维基百科的文章是一个很好的资源,太多。
  • 第三,尝试获取实际数据:很难验证您FileReader的文件是否正确评估了这些文件,但是这样做很值得,因为它经常会发现前两种策略未发现的错误。有些人将这类事物也称为“集成测试”,另一些人则将其称为“验收测试”,但实际上该术语并不重要。

恕我直言,没有“捷径”方法可以“以一个价格”为您带来所有三种策略的好处。如果要检测边缘情况以及标准情况和实际情况中的故障,则必须至少投入一些(可能更多)。幸运的是,所有这些方法都可以用于创建自动的,可重复的测试。

除此之外,您还应确保FileReader在读取数据时不要掩盖任何错误-创建内置的检查/断言,在内部发生错误时引发异常等。这为您的测试代码提供了更好的机会来检测错误,即使您没有用于意外情况的显式测试文件或测试用例。


很棒的答案,我将编辑问题的标题以更好地反映出来。谢谢!
sdasdadas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.