单元测试时,测试CRUD操作时是否必须使用数据库?sql lite可以帮助解决这个问题吗?您是否必须以某种方式在内存中创建数据库?
我正在使用mbunit。
单元测试时,测试CRUD操作时是否必须使用数据库?sql lite可以帮助解决这个问题吗?您是否必须以某种方式在内存中创建数据库?
我正在使用mbunit。
不。集成一个实际的数据库将是集成测试。不是单元测试。
是的,如果你不能以任何其他方式抽象(模拟)你的 DAL/DAO,你可以使用任何内存数据库,如SQLite或MS SQL Compact 。
考虑到这一点,我必须指出,单元测试一直到 DAL 都是可能的,但 DAL 本身却不行。DAL 必须在集成测试中使用某种实际的数据库进行测试。
与所有复杂的问题一样,答案是:这取决于:)
一般来说,您应该将数据访问层隐藏在接口后面,这样您就可以在不使用数据库的情况下测试应用程序的其余部分,但是如果您想测试数据访问实现本身怎么办?
在某些情况下,有些人认为这是多余的,因为他们主要使用声明性数据访问技术,例如 ORM。
在其他情况下,数据访问组件本身可能包含一些您可能想要测试的逻辑。这可能是一件完全相关的事情,但你需要数据库来做这件事。
有些人认为这是集成测试而不是单元测试,但在我的书中,你怎么称呼它并不重要——最重要的是你可以从你的全自动测试中获得价值,你绝对可以使用单元测试框架来驱动这些测试。
不久前,我写了关于如何在 SQL Server 上执行此操作的文章。要记住的最重要的事情是避免使用一些“代表性数据”创建通用夹具并尝试在所有测试中重用它。相反,您应该在每次测试中填写数据并在之后进行清理。
单元测试时,测试CRUD操作时是否必须使用数据库?
假设您已经提取了围绕所述 CRUD 操作的接口,并通过模拟或存根测试了使用所述接口的所有内容。现在剩下的代码块是一个保存方法,其中包含一些用于绑定对象和一些 SQL 的代码。
如果是这样,那么我会声明一个“单元”并说您确实需要一个数据库,理想情况下,它至少可以很好地代表您的数据库,以免您被供应商特定的 SQL 所吸引。
我也会少量使用模拟来强制出现错误条件,但我不会只用模拟来测试保存方法本身。因此,虽然从技术上讲这可能是一个集成测试,但我仍然会将其作为单元测试的一部分。
编辑:错过了您问题的 2/3。对不起。
sql lite可以帮助解决这个问题吗?
我过去曾在内存数据库中使用过,并且因为我使用的数据库和实时系统做了一些不同的事情,或者它们需要相当长的时间才能启动,所以我被咬过。无论如何,我建议每个开发人员都有一个开发人员本地数据库。
您是否必须以某种方式在内存中创建数据库?
在数据库中是的。我使用 DbUnit 来分散数据并使用 SQL 脚本手动使架构保持最新,但您可以只使用 SQL 脚本。拥有开发人员本地数据库确实会增加一些额外的维护,因为您同时拥有模式和数据集以跟上数据,但我个人认为值得一试,因为您可以确保数据库层按预期工作。
正如其他人已经指出的那样,您要实现的不是单元测试,而是集成测试。
话虽如此,即使我更喜欢与模拟隔离的单元测试,集成测试也没有什么问题。因此,如果您认为它在您的上下文中有意义,只需在您的测试策略中包含集成测试。
现在,关于您的问题,我会查看DbUnit.NET。我不知道这个工具的 .NET 版本,但我可以告诉你,Java 版本非常适合与数据库交互的测试。简而言之,DbUnit 允许您在运行测试之前将数据库置于已知状态,并对表的内容执行断言。真的很方便。顺便说一句,我建议您阅读最佳实践页面,即使您决定不使用此工具。
实际上,如果您正在编写一个连接到数据库的测试,那么您就是在进行集成测试,而不是单元测试。
对于此类操作的单元测试,请考虑使用某种类型的模拟数据库对象。例如,如果您有一个封装数据库交互的类,请从中提取一个接口,然后创建一个使用简单内存对象而不是实际连接到数据库的继承类。
如上所述,这里的关键是在运行测试之前让您的测试数据库处于已知状态。在一个真实的示例中,我有几个 SQL 脚本在重新创建一组已知测试数据的测试之前运行。由此,我可以测试 CRUD 操作并验证新行是否已插入/更新/删除。
我编写了一个名为DBSnapshot的实用程序来帮助集成测试sqlserver 数据库。
如果您的数据库模式经常更改,那么针对真实的数据库实例实际测试您的代码将很有帮助。人们使用 SqlLite 进行快速测试(因为数据库在内存中运行),但是当您想要验证您的代码是否适用于数据库的实际构建时,这并没有帮助。
在测试数据库时,您希望遵循类似于以下模式的模式:备份数据库、设置数据库以进行测试、练习代码、验证结果、将数据库恢复到起始状态。
以上将确保您可以单独运行每个测试。如果您编写 .net,我的DBSnapshot实用程序将简化您的代码。我认为它比 DbUnit.NET 更易于使用。