MSTests 在本地通过后在构建服务器上失败

MSTests fail on build server after passing locally

这对我来说有点奇怪,我已经通过单元测试完成了几个微服务,但没有遇到过这样的问题。问题是我的单元测试在本地通过,但 some 在我们的构建服务器上失败。奇怪的是,如果我在构建脚本中挑出一个失败的测试,它就会通过。如果我 运行 它在它之前进行了 运行ning 的测试,我会得到失败的结果。如果我远程进入测试服务器并访问测试结果文件并重新运行 所有测试,它们都会通过。所以对我来说,这表明它与我的构建环境有关 - 可能是 "runner" 上下文。我在失败的测试中遇到的具体错误是:

System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.

同样,一个测试 运行 并通过了该测试失败之前正在访问数据库的测试。此外还应注意,这些测试使用存储过程来访问数据,并且还使用 LINQ to SQL (.dbml)。我最初认为这与未正确处理上下文有关,但在 IDisposable 实现的多次迭代和贯穿数据访问代码的 using 语句之后,我认为我已经排除了这种可能性。我什至删除了 .dbml 引用并新建了一个实体模型 (.edmx),但在问题大大简化之后最终得到了相同的结果。我现在可以用 2 个单元测试重现这个问题,一个会通过,一个会失败。当 运行 分别通过时,当 运行 在本地或在构建服务器上手动时,两者都将通过。

开发服务器

我们将开发环境设置为远程服务器。所有开发人员都使用 VS 2013 Ultimate。所有开发人员都使用 localdb 的共享实例。这似乎工作正常,我能够针对这种环境进行开发和测试。对于有问题的解决方案,我所有的测试都在这里通过。然后我将代码向上游推送到构建服务器。

构建服务器

这是安装了 GitLabs 的 windows 2012 服务器,每次提交到我们的开发 b运行ches 运行 通过 .gitlab-ci.yml 构建脚本构建。在大多数情况下,这只是简单的 msbuild -> mstest 调用,没什么特别的。该服务器也有自己的 localdb 运行 匹配来自 Dev 环境的模式的共享实例。其他几个存储库已通过 builds/unit 使用此设置的测试。用于访问数据的连接字符串都使用集成安全性,并且 gitlab 运行ner 服务帐户对 localdb 具有完整权限。关于所讨论的解决方案,我唯一可以确定的显着不同是大量使用存储过程,但是就像我说的那样,其中一些单元测试确实通过了,它们 所有 使用存储过程。就像我也提到的,如果我手动进入并访问测试结果文件并在构建服务器上手动调用测试,构建失败后,它们突然全部通过。

所以我不太确定这是怎么回事,以前有没有人经历过这种行为?如果是这样,你是如何解决的?我想让这些测试通过,以便我的构建可以通过并继续。

好的,我已经通过了单元测试,但我最终为了让它们通过而做了一件奇怪的事情,我不太确定为什么会这样。即使 runners 帐户在 localdb 实例上拥有完整的 "Server Role" 特权(选中所有框),我还是决定万岁,并经历了 "mapping" 用户到相关数据库的过程,将他的默认架构设置为 dbo 并给他完整的权限(选中所有框)。此操作后...测试通过。所以我显然不了解在 localdb 中传播权限的方式,我假设服务器角色像上帝一样意味着对单个数据库的完全权限,但我想不是吗?我不是 DBA,我实际上是要和我们的 DBA 聊天,看看他的想法。也许这与存储过程执行有关?也许这需要特殊特权?我确实知道过去我必须创建特殊角色来执行存储过程,所以它们有点挑剔。无论如何,单元测试通过了,所以我现在很高兴!