0

我们有以下设置:Visual Studio的差异,当在Visual Studio和构建服务器上运行测试

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

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

按照SQL Server Profiler中,插入/创建表执行,所以数据都在我们的机器和构建服务器上的数据库得到,但在构建服务器上的一些删除/降查询后立即执行插入。我们无法分辨他们来自哪里。

我们试图运行只有Z测试组件和数据保留在数据库中。所以滴液必须由其他组件引起。但是如何?为什么visual studio和构建服务器运行测试的方式有所不同?

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

回答

0

我们最终设法解决了这个问题。事实证明,第一个程序集有一些在[ClassCleanup]方法中运行的清理代码。第一个程序集的ClassCleanup代码在Z测试之后运行(来自第二个程序集)。所以这个快速解决方案就是用一个完成播种的[AssemblyCleanup]方法替换Z种子测试。

2

根据你的单元测试是一件危险的事情。首先它违背了单元测试的整体思路(它们应该是独立订单),但它也是你无法保证的东西。

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

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

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

+0

我同意,但在这种情况下,我们只需要一种快速的方法来种子一些数据。这篇文章非常好,谢谢! – pax162 2013-02-11 09:47:07

相关问题