如何单元测试阅读Excel阅读器?

时间:2010-01-27 10:22:50

标签: c# unit-testing tdd

我的C#应用​​程序中有一个ExcelReader类 - 我需要将Excel电子表格导入数据库表。我的问题是,这是为数不多的未经测试的类之一 - 我不能使用“模拟输入”,并且使用实际的Excel电子表格进行测试会使测试有点慢(大约一秒钟)。我知道班级工作正常 - 我手动测试了 - 但是我对离开它没有自己的测试感到有些不安。

所以 - 我的问题是:哪一个更好:没有单元测试,慢单元测试,还是第三种我无法弄清楚的方法?

[编辑]很多很棒的答案,我真的很抱歉,我只能标记一个。

6 个答案:

答案 0 :(得分:5)

您可以包装ExcelReader并模拟包装器。一个简单的例子是:

                              +--------------+
                              | {interface}  |
                              | IExcelReader |
                              +--------------+
                                     ^
                                     |
                                     |
+-------------+ 1       1 +--------------------+
| ExcelReader |-----------| ExcelReaderWrapper |
|             |           |                    |
+-------------+           +--------------------+

这样,任何需要实际ExcelReader的类都可以引用IExcelReader,并由ExcelReaderWrapper或模拟它注入。它可能会创建很多类,但是收益在于可以替换ExcelReader并且不会被迫编写慢速集成测试。

答案 1 :(得分:2)

我会选择慢速测试。但你可以做一个“整合测试”。

答案 2 :(得分:2)

这个怎么样?

ExcelReader --- has --- ExcelInterop (interface) --- to read --- .xls

我假设ExcelReader比调用Excel Interop Library函数有更多的逻辑。 如果是这种情况,请通过插入ExcelInterop的模拟实现来为ExcelReader编写快速单元测试。您可以使用它来模拟/存根对互操作库的调用。

接下来为ExcelInterop接口编写合同测试。这里的测试主题是一个包装类(真正的接口实现),它委托给实际的MS Excel互操作程序集。这些测试应验证您使用的API是否按预期工作;针对黄金/参考.xls

运行此操作

使用'LongRunning'或equiv属性标记第二组测试,如果它们太慢,则不太频繁地运行它们(在构建机器上/在EOD一次)。

答案 3 :(得分:1)

通常,单元测试不涉及文件系统或数据库或任何共享资源。从FS读取文件并将其加载到DB中的测试通常称为集成测试。

我通常将集成测试分成一个单独的组,可以慢速运行(总共几分钟)。

您还可以重构ExcelReader并提取需要真实文件的低级部分以读入单独的类。然后你可以在单元测试中模拟它并测试其他逻辑。

答案 4 :(得分:1)

我将为它创建集成测试,其中包含一系列已定义的电子表格,测试用它们来测试某些功能,测试是否产生了预期的输出。我将电子表格提交给源代码控制。我也会在与单元测试不同的项目中进行测试。

答案 5 :(得分:0)

我们还有一大堆关于excel的单元测试,从经验来看,定期运行并嘲笑是很好的。特别是COM通信有点繁琐,并且在Excel中可写/可读的字符串大小方面存在限制(取决于您的阅读方式)。我记得有关我通过测试发现的911 char限制的事情。对于一些非常长的测试(> 15分钟),我们添加一个特殊的类别属性“LongDuration”,让它们只在夜间构建中运行。