sql server -如何进行单元测试持久性?

Translate

作为从事测试驱动开发的新手,我经常对如何将测试持久性单元化到数据库感到困惑。

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

  1. 测试查询。
  2. 测试插件。我如何知道插入失败的插入错误?我可以通过插入然后查询来测试它,但是我怎么知道查询没错呢?
  3. 测试更新和删除-与测试插入内容相同

做这些的最佳实践是什么?


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

我应该放弃所有内容,只是信任NHibernate吗?我不确定这是谨慎的做法。

This question and all comments follow the "Attribution Required."

所有的回答

Translate

查看数据库单元。它是一个Java库,但是必须有一个C#等效项。它使您可以使用一组数据来准备数据库,以便了解数据库中的内容,然后可以与DB Unit交互以查看数据库中的内容。它可以在许多数据库系统上运行,因此您可以使用实际的数据库设置,也可以使用其他方式,例如Java中的HSQL(带有内存中选项的Java数据库实现)。

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

来源
Translate

迈克·斯通说,DbUnit非常适合在运行测试之前使数据库进入已知状态。测试完成后,DbUnit可以将数据库恢复到运行测试之前的状态。

DbUnit(Java)

DbUnit.NET

来源
Translate

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

显然,这意味着您的测试实际上不会验证该方法作品,因为SQL可能是错误的。这就是集成测试的起点。为此,我希望其他人会得到更彻底的答案,因为我才刚开始与那些人交往。

来源
Translate

我在这里写了一篇关于单元测试数据层涵盖了这个确切的问题。为(可耻的)插件道歉,但是这篇文章太长了,无法在此处发布。

希望对您有所帮助-在过去的6个月中,我在3个活跃的项目中一直表现出色。

问候,

罗布·G

来源
Translate

我在对持久性进行单元测试时,尤其是在没有ORM并因此嘲笑数据库(连接)时遇到的问题是,您真的不知道查询是否成功。可能是您的查询是专门针对特定数据库版本设计的,并且仅在该版本上成功。如果您模拟数据库,您将永远找不到。因此,我认为,单元测试持久性仅是有限的用途。您应该始终添加针对目标数据库运行的测试。

来源
Translate

对于NHibernate,我绝对会建议只是嘲笑NHibernate API对于单元测试-信任库做正确的事。如果要确保数据实际到达数据库,请执行集成测试。

来源
Translate

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

来源
Translate

我还将模拟数据库,并检查查询是否符合您的期望。测试存在检查错误的sql的风险,但这会在集成测试中检测到

来源
Dan
Translate

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

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

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

        [SetUp]
        public void Setup()
        {

        }

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

在NUnit中也可以这样做,但属性名称略有不同。

至于检查查询是否成功,通常需要在第二个查询之后进行查询,以查看数据库是否已按预期进行了更改。

来源
Translate

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

来源
下一个问题:
监视特定的RSS