【发布时间】:2011-04-05 09:59:20
【问题描述】:
我有一个 web 服务,它基本上只是执行一些存储过程、转换数据并将其发送到浏览器。没有花哨的 ORM 映射器或类似的东西。为了能够在不访问数据库的情况下编写测试,我做了以下操作:
- 我已将所有对数据库的调用提取到一个类中。这些方法只返回 DataSet 和 DataTable 对象。
- 为每个方法执行一个示例调用,并将 DataSet/DataTable 序列化到磁盘。
- 提取了一个公开所有可用方法的接口。
- 实现了一个伪数据库类,它只加载序列化数据并返回它。
现在我已经序列化了示例结果,我可以在我的项目中签入,我可以在我的测试中使用假数据库。
这对我来说效果很好。是否有一些框架可以更轻松地创建和加载示例数据?我当前的项目很小,但我会在较大的项目中使用相同的架构。
更新:
显然所有的答案都没有错,但没有抓住重点。我知道单元测试的基础知识。但是我的代码正在使用 DataTables,所以我不得不以某种方式伪造我的 DataTables。从头开始构建 DataTable 不是一件容易的事,它会使我的测试膨胀并降低可读性。就我而言,手动生成有用的样本数据是完全不可能的。
因此,我对示例数据库执行了一些示例调用以获取一些数据表。我已将这些表序列化到磁盘并在测试时使用序列化版本创建我的假数据表。这样测试就独立于数据库了。
关于如何构建代码有不同的选择,以使表格的反序列化更容易。但这些是目前不需要讨论的实现细节。我的问题如下:
管理示例调用和(反)序列化表是一项繁琐的工作。我一直在寻找一些工具来简化此操作。
【问题讨论】:
-
那么您的测试到底在测试什么?假数据库类可以返回假数据吗?还是您正在测试转换?
-
我正在测试转换。这部分测试假设数据库没有问题,我想测试从数据库中获取 DataSet/DataTable 后发生的所有事情。
-
如果您只测试转换,理想情况下您会为此隔离代码,并严格在该代码上编写单元测试。
-
同意 Chris,分离出转换并使用 DI 为其提供应该转换的数据。然后你可以扔掉你的假数据类
-
我同意 Chris O 关于使用 DI 和在真空中测试 Xforms 的观点。我想补充一点,数据库测试也可以单独进行。请参阅 Fluent NHibernate,了解如何使用相当有限的编码量来做到这一点。
标签: c# database testing mocking