单元测试-Visual Studio,在Visual Studio和构建服务器上运行测试时的差异



我们有以下设置:

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

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

根据SQL Server探查器的说法,插入/创建表是执行的,因此数据在我们的机器和构建服务器上都会进入数据库,但在构建服务器上,一些删除/删除查询会在插入之后立即执行。我们不知道他们是从哪里来的。

我们尝试只运行Z测试程序集,数据仍保留在数据库中。因此,跌落一定是由另一个组件造成的。但是怎么做呢?为什么visualstudio和构建服务器运行测试的方式不同?

以前有人遇到过这样的事情吗?

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

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

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

还有一点需要注意,使用数据库的单元测试实际上是集成测试。我会非常谨慎地使用这样的结构。不久前,我写了一篇关于这方面的博客文章,展示了你可能遇到的问题,但也指出了一些解决方案:单元测试,地狱还是天堂?

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

最新更新