代码之家  ›  专栏  ›  技术社区  ›  Joseph Ferris

针对真实数据库对域服务进行单元测试

  •  0
  • Joseph Ferris  · 技术社区  · 15 年前

    我在对SQL支持的存储库进行实时测试时发现的主要问题是数据库一致性。例如,一旦测试运行,“创建”方面就已经运行了。再次运行它们显然会导致失败,因为数据库不再是原始的。我正在考虑创建一个镜像数据库,仅用于这种类型的测试。它将是最小的,包含结构、可编程性、约束等。我还将为某些已建立的测试提供一组最小的数据。我的思路是,我可以有一个存储过程,在开始测试运行之前,我可以调用该存储过程以使用基本数据将数据库重置为“原始”状态。

    虽然在功能最初被验证之后,这在开发人员机器上并不是那么重要,但我正在更多地研究作为夜间构建的一部分运行这些测试的重要性;因此,在测试失败的情况下,可以推迟构建,以避免破坏目标部署环境(特别是在这种情况下,它将是测试团队使用的环境)。

    Visual Studio 2008团队版(C#)

    我使用TeamBuild来运行我的构建,但这很可能不是问题范围内的一个因素。

    5 回复  |  直到 15 年前
        1
  •  2
  •   duffymo    15 年前

    例如,一旦测试运行,“创建”方面就已经运行了。再次运行它们显然会导致失败,因为数据库不再是原始的。

    也许您可以使单元测试具有事务性。运行测试,回滚测试,数据库保持不变。

    Spring有事务性的单元测试类,使这项工作变得容易。您只需要一个事务管理器。

        2
  •  1
  •   TrueWill    15 年前

    SQL Server Express (我在2005年做过,但在2008年没有尝试过)设置“测试平台”数据库,这些数据库存储为文件。这些可以签入到源代码管理中,然后测试助手类可以(a)将它们复制到临时文件夹中,(b)启用它们,以及(c)连接到它们。要恢复原始状态,请删除临时副本并重复a-c。

    This is a huge pain.

        3
  •  1
  •   tony.chevis    15 年前

    您可以在测试代码中创建一组数据工厂,这些数据工厂最初在测试运行启动时运行。然后使用事务回滚方法使其保持原始状态。 为了使它更简单,可以对所有测试类进行子类化,并将事务访问器和回滚代码放在其中。回滚代码可以设置为在每个测试方法完成时自动运行。

        4
  •  1
  •   Jimmy Zimmerman    14 年前

    很简单,您的存储库单元测试不是基于存储库的输入测试数据库中发生的广泛影响;这是为了确认对存储库的输入会导致调用具有某个或某个值集的协作者。

    您知道,存储库和代码的其余部分一样,应该遵循单一责任原则。基本上,您的职责只有一个职责,那就是将域模型API问题与底层数据访问技术层(通常是ADO.Net,但可以是实体框架或L2S或其他任何形式)联系起来。以ADO.Net调用为例,存储库不应承担作为数据层工厂的责任,而应依赖ADO.Net数据接口(特别是IDbConnection/IDbCommand/IDBCParameter等)中的协作者。只需将IDbConnection作为构造函数参数,并在一天内调用它即可。这意味着您可以针对接口编写存储库单元测试,并提供模拟(或赝品、存根或任何您需要的东西),并确认按顺序提供了所需的方法和预期的输入。请查看我的MS博客,了解这个主题-> http://blogs.msdn.com/b/schlepticons/archive/2010/07/20/unit-testing-repositories-a-rebuttal.aspx

    希望这能帮助您在将来的测试和设计中避免犯错误。

    顺便说一句:如果你想对数据库进行单元测试,你可以。只需使用VisualStudio数据库测试。它内置于vs中,自VS2005年以来一直存在。这并不是什么新鲜事。但我需要提醒你们,它们需要完全独立的单元测试。

        5
  •  0
  •   Martin R-L    15 年前

    如果您的代码相当独立于数据库,那么使用内存中的数据库(如SQLite)进行单元测试(而不是集成测试)将为您带来速度和易用性的好处(您的测试设置将初始化数据库)。

    推荐文章