【问题标题】:Visual Studio, difference when running tests in visual studio and on build serverVisual Studio,在 Visual Studio 和构建服务器上运行测试时的区别
【发布时间】:2013-02-11 17:49:26
【问题描述】:

我们有以下设置:

  • Visual Studio 2012 / SQL Server 2012
  • TFS 2010,构建服务器在构建时自动运行单元测试。
  • 包含大量代码和 2 个测试项目(因此在构建时需要 2 个单独的程序集)的解决方案,测试是使用 Visual Studio 的单元测试框架完成的。
  • 第一个程序集包含所有实际的单元测试,它们都运行正常。在大多数测试中,我们在数据库中写入一些数据,运行一些代码, 然后清理数据。
  • 我们使用第二个程序集进行数据库播种。由于测试和程序集按字母顺序加载/执行 顺序,我们在第二个程序集中有一个测试,其名称以 “Z”(程序集名称也以“Z”开头)。构建服务器日志 还要确认 Z 测试是最后执行的。所以这个测试 只在数据库中写入一些数据。我们更喜欢播种而不是 由于现有基础设施而使用数据库项目 从 Excel 文件中读取数据并写入 SQL Server。

问题在于,当我们在开发机器上运行所有测试时,Z 测试最后执行,而种子数据仍保留在数据库中。在构建服务器上执行测试时,Z 测试也会最后执行,但数据不会保留在 db 中。

根据 SQL Server 分析器,插入/创建表被执行,因此数据在我们的机器和构建服务器上都进入数据库,但在构建服务器上,一些删除/删除查询在插入。我们不知道他们来自哪里。

我们尝试仅运行 Z 测试程序集,数据仍保留在数据库中。所以下降一定是由其他组件以某种方式引起的。但是怎么做?为什么 Visual Studio 和构建服务器运行测试的方式存在差异?

有没有人遇到过这样的事情?

【问题讨论】:

    标签: visual-studio unit-testing visual-studio-2012 tfsbuild


    【解决方案1】:

    依赖于单元测试的顺序是一件危险的事情。首先,它违反了单元测试的整体理念(它们应该是独立于顺序的),但这也是你无法保证的。

    您的单元测试总是以相同的顺序在您的开发机器上运行,这是一个巧合。

    如果您需要在运行其他测试之前运行一些代码来为您的数据库播种,您可以使用Assembly Initialize 属性。这样,您可以确保此方法始终在您的其他测试之前运行。

    另外需要注意的是,使用数据库的单元测试实际上是集成测试。我会非常谨慎地使用这种结构。我前段时间写了一篇关于这个的博客文章,展示了你可能遇到的问题,但也指出了一些解决方案:Unit Testing, hell or heaven?

    【讨论】:

    • 我同意,但在这种情况下,我们只需要一种快速的方法来播种一些数据。文章很好,谢谢!
    【解决方案2】:

    我们最终设法修复了它。事实证明,第一个程序集有一些在 [ClassCleanup] 方法中运行的清理代码。第一个程序集的 ClassCleanup 代码在 Z 测试之后运行(来自第二个程序集)。因此,快速修复只是用 [AssemblyCleanup] 方法替换 Z 播种测试,该方法进行播种。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      相关资源
      最近更新 更多