我如何对持久性进行单元测试?

时间:2008-08-05 09:43:01

标签: sql-server unit-testing tdd

作为练习测试驱动开发的新手,我常常陷入困境,如何将持久性单元测试数据库。

我知道技术上这将是一个集成测试(不是单元测试),但我想找到以下最佳策略:

  1. 测试查询。
  2. 测试插页。我如何知道插件出现故障?我可以通过插入然后查询来测试它,但是我怎么知道查询没有错呢?
  3. 测试更新和删除 - 与测试插入相同
  4. 这样做的最佳做法是什么?


    关于测试SQL:我知道这可以做到,但如果我使用像NHibernate这样的O / R Mapper,它会在用于输出查询的别名中附加一些命名瑕疵,因为这有点不可预测我我不确定我可以测试一下。

    我应该放弃一切,只是信任NHibernate吗?我不确定这是谨慎的。

10 个答案:

答案 0 :(得分:16)

查看数据库单元。它是一个Java库,但必须有一个C#等价物。它允许您使用一组数据准备数据库,以便您知道数据库中的内容,然后您可以与数据库单元连接以查看数据库中的内容。它可以针对许多数据库系统运行,因此您可以使用实际的数据库设置,或使用其他内容,例如Java中的HSQL(具有内存选项的Java数据库实现)。

如果您想测试您的代码是否正确使用了数据库(您很可能应该这样做),那么这就是隔离每个测试并确保数据库准备好数据的方法。

答案 1 :(得分:15)

作为Mike Stone said,DbUnit非常适合在运行测试之前将数据库置于已知状态。测试完成后,DbUnit可以将数据库恢复到运行测试之前的状态。

DbUnit (Java)

DbUnit.NET

答案 2 :(得分:4)

您通过模拟数据库连接来进行单元测试。这样,您可以构建方法调用流中的特定查询成功或失败的方案。我通常构建我的模拟期望,以便忽略实际的查询文本,因为我真的想测试方法的容错性以及它如何处理自身 - SQL的细节与此无关。

显然这意味着您的测试实际上不会验证方法是否正常工作,因为SQL可能是错误的。这就是集成测试的用武之地。为此,我希望别人会有更彻底的答案,因为我刚刚开始自己​​处理这些问题。

答案 3 :(得分:3)

我在这里写了一篇关于unit testing the data layer的帖子,其中涵盖了这个确切的问题。为(可耻的)插件道歉,但文章太长了,无法在此发布。

我希望能帮到你 - 在过去的6个月中,它在3个活跃的项目中对我非常有用。

此致

Rob G

答案 4 :(得分:2)

我在单元测试持久性时遇到的问题,特别是没有ORM并因此模拟您的数据库(连接),您不知道您的查询是否成功。可能是您的查询是专门为特定数据库版本设计的,并且只能在该版本中成功。如果你嘲笑你的数据库,你永远不会发现它。所以在我看来,单元测试持久性只是用途有限。您应该始终添加针对目标数据库运行的测试。

答案 5 :(得分:2)

对于NHibernate,我肯定提倡仅仅为单元测试嘲笑NHibernate API - 相信图书馆做正确的事情。如果要确保数据实际进入数据库,请执行集成测试。

答案 6 :(得分:2)

对于基于JDBC的项目,可以使用我的Acolyte框架:http://acolyte.eu.org。它允许模拟您想要测试的数据访问,从JDBC抽象中受益,而无需管理特定的测试数据库。

答案 7 :(得分:1)

我也会模拟数据库,并检查查询是否符合预期。测试可能会检查错误的sql,但这会在集成测试中检测到

答案 8 :(得分:1)

技术上持久性的单元测试不是单元测试,而是集成测试。

使用C#使用mbUnit,只需使用SqlRestoreInfo和RollBack属性

    [TestFixture]
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
    public class Tests
    {

        [SetUp]
        public void Setup()
        {

        }

        [Test]
        [RollBack]
        public void TEST()
        {
           //test insert. 
        }
    }

在NUnit中可以做同样的事情,但是属性名称的格式不同。

至于检查您的查询是否成功,通常需要使用第二个查询来跟踪它,看看数据库是否已按预期更改。

答案 9 :(得分:1)

我通常创建一个存储库并使用它来保存我的实体,然后检索一个新的实体。然后我断言检索到的等于保存的。