如果您的函数除了从数据库中提取数据之外还做了一些有趣的事情,您应该将检索提取到不同的函数中并模拟它,以便您可以测试其余部分。
这仍然让您完成测试数据库访问的任务。您不能真正为此进行单元测试,因为根据定义,它不会访问任何数据库,您可以只测试它是否发送您认为应该发送的 sql 语句,但不能测试 sql 语句是否真的有效。
所以你需要一个数据库
您有多种选择:
1)为此类测试创建一个不会被测试更改的固定数据库。
优点:概念上简单缺点:难以维护。测试变得相互依赖,因为它们依赖于相同的数据。无法测试更新、插入或删除的东西(更不用说 DDL)
2)在测试期间创建一个数据库。现在你有两个问题:为测试设置数据库并用数据填充它。
配置:
1)运行一个数据库服务器,为需要运行测试的每个人(至少 devs + ci-server)提供一个用户/模式/数据库。可以使用 hibernate 之类的东西或用于部署的脚本来创建模式。
效果很好,但会让老式的 DBA 发疯。应用程序不得依赖于模式名称。当应用程序使用多个模式时,您也会遇到问题。这个设置相当慢。它可以帮助放入快速光盘。像 RAM 盘
2)有一个内存数据库。从代码开始很容易,而且速度很快。但在大多数情况下,它的行为与您的生产数据库相同。如果你使用一些试图隐藏差异的东西,这就不那么重要了。我经常在第一个构建阶段使用内存数据库,在第二个阶段使用真实数据库。
加载测试数据
1) 人们告诉我使用 dbunit。我不相信当列或约束发生变化时,它似乎有很多 XML 并且难以维护。
2)我更喜欢普通的应用程序代码。(Java + Hibernate)在我的情况下,但是在生产中将数据写入数据库的代码在许多情况下应该适合为您的测试编写测试数据。它有助于有一个特殊的 API 隐藏满足所有外键和东西的细节:http: //blog.schauderhaft.de/2011/03/13/testing-databases-with-junit-and-hibernate-part -1-one-to-rule-them/