6

单元测试时,测试CRUD操作时是否必须使用数据库?sql lite可以帮助解决这个问题吗?您是否必须以某种方式在内存中创建数据库?

我正在使用mbunit。

4

7 回答 7

12

不。集成一个实际的数据库将是集成测试。不是单元测试。

是的,如果你不能以任何其他方式抽象(模拟)你的 DAL/DAO,你可以使用任何内存数据库,如SQLiteMS SQL Compact 。

考虑到这一点,我必须指出,单元测试一直到 DAL 都是可能的,但 DAL 本身却不行。DAL 必须在集成测试中使用某种实际的数据库进行测试。

于 2009-09-27T21:38:03.200 回答
12

与所有复杂的问题一样,答案是:这取决于:)

一般来说,您应该将数据访问层隐藏在接口后面,这样您就可以在不使用数据库的情况下测试应用程序的其余部分,但是如果您想测试数据访问实现本身怎么办?

在某些情况下,有些人认为这是多余的,因为他们主要使用声明性数据访问技术,例如 ORM。

在其他情况下,数据访问组件本身可能包含一些您可能想要测试的逻辑。这可能是一件完全相关的事情,但你需要数据库来做这件事。

有些人认为这是集成测试而不是单元测试,但在我的书中,你怎么称呼它并不重要——最重要的是你可以从你的全自动测试中获得价值,你绝对可以使用单元测试框架来驱动这些测试。

不久前,我写了关于如何在 SQL Server 上执行此操作的文章。要记住的最重要的事情是避免使用一些“代表性数据”创建通用夹具并尝试在所有测试中重用它。相反,您应该在每次测试中填写数据并在之后进行清理。

于 2009-09-28T07:54:17.230 回答
2

单元测试时,测试CRUD操作时是否必须使用数据库?

假设您已经提取了围绕所述 CRUD 操作的接口,并通过模拟或存根测试了使用所述接口的所有内容。现在剩下的代码块是一个保存方法,其中包含一些用于绑定对象和一些 SQL 的代码。

如果是这样,那么我会声明一个“单元”并说您确实需要一个数据库,理想情况下,它至少可以很好地代表您的数据库,以免您被供应商特定的 SQL 所吸引。

我也会少量使用模拟来强制出现错误条件,但我不会只用模拟来测试保存方法本身。因此,虽然从技术上讲这可能是一个集成测试,但我仍然会将其作为单元测试的一部分。

编辑:错过了您问题的 2/3。对不起。

sql lite可以帮助解决这个问题吗?

我过去曾在内存数据库中使用过,并且因为我使用的数据库和实时系统做了一些不同的事情,或者它们需要相当长的时间才能启动,所以我被咬过。无论如何,我建议每个开发人员都有一个开发人员本地数据库。

您是否必须以某种方式在内存中创建数据库?

在数据库中是的。我使用 DbUnit 来分散数据并使用 SQL 脚本手动使架构保持最新,但您可以只使用 SQL 脚本。拥有开发人员本地数据库确实会增加一些额外的维护,因为您同时拥有模式和数据集以跟上数据,但我个人认为值得一试,因为您可以确保数据库层按预期工作。

于 2009-09-28T10:39:13.153 回答
2

正如其他人已经指出的那样,您要实现的不是单元测试,而是集成测试。

话虽如此,即使我更喜欢与模拟隔离的单元测试,集成测试也没有什么问题。因此,如果您认为它在您的上下文中有意义,只需在您的测试策略中包含集成测试。

现在,关于您的问题,我会查看DbUnit.NET。我不知道这个工具的 .NET 版本,但我可以告诉你,Java 版本非常适合与数据库交互的测试。简而言之,DbUnit 允许您在运行测试之前将数据库置于已知状态,并对表的内容执行断言。真的很方便。顺便说一句,我建议您阅读最佳实践页面,即使您决定不使用此工具。

于 2009-09-28T10:57:29.230 回答
0

实际上,如果您正在编写一个连接到数据库的测试,那么您就是在进行集成测试,而不是单元测试。

对于此类操作的单元测试,请考虑使用某种类型的模拟数据库对象。例如,如果您有一个封装数据库交互的类,请从中提取一个接口,然后创建一个使用简单内存对象而不是实际连接到数据库的继承类。

于 2009-09-27T21:36:53.450 回答
0

如上所述,这里的关键是在运行测试之前让您的测试数据库处于已知状态。在一个真实的示例中,我有几个 SQL 脚本在重新创建一组已知测试数据的测试之前运行。由此,我可以测试 CRUD 操作并验证新行是否已插入/更新/删除。

于 2009-09-28T11:10:53.887 回答
0

我编写了一个名为DBSnapshot的实用程序来帮助集成测试sqlserver 数据库。

如果您的数据库模式经常更改,那么针对真实的数据库实例实际测试您的代码将很有帮助。人们使用 SqlLite 进行快速测试(因为数据库在内存中运行),但是当您想要验证您的代码是否适用于数据库的实际构建时,这并没有帮助。

在测试数据库时,您希望遵循类似于以下模式的模式:备份数据库、设置数据库以进行测试、练习代码、验证结果、将数据库恢复到起始状态。

以上将确保您可以单独运行每个测试。如果您编写 .net,我的DBSnapshot实用程序将简化您的代码。我认为它比 DbUnit.NET 更易于使用。

于 2009-09-28T19:09:05.653 回答