Msbuild 本地通过后,生成服务器上的MSTests失败

Msbuild 本地通过后,生成服务器上的MSTests失败,msbuild,continuous-integration,mstest,gitlab,localdb,Msbuild,Continuous Integration,Mstest,Gitlab,Localdb,这对我来说有点奇怪,我已经用单元测试完成了几个微服务,还没有遇到过这样的问题。问题是,我的单元测试在本地通过,但在构建服务器上有一些失败。奇怪的是,如果我在构建脚本中挑出一个失败的测试,它就会通过。如果我使用之前运行的测试运行它,我会得到失败的结果。如果我远程访问测试服务器并访问测试结果文件并重新运行所有测试,它们都将通过。所以对我来说,这与我的构建环境有关——很可能是“runner”上下文。我在失败的测试中遇到的具体错误是: System.Data.Entity.Core.EntityExce

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

System.Data.Entity.Core.EntityException:基础提供程序在打开时失败。-->System.Data.SqlClient.SqlException:建立到SQL Server的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接

同样,在这个失败的测试之前,一个正在访问数据库的测试已经运行并通过。此外,应该注意的是,这些测试使用存储过程访问数据,并且还使用LINQ to SQL(.dbml)。我最初认为它与未正确处理的上下文有关,但经过IDisposable实现的多次迭代,并在整个数据访问代码中使用语句,我想我已经排除了这一点。我甚至删除了.dbml引用并创建了一个实体模型(.edmx),但在对问题进行了大量简化之后,最终得到了相同的结果。我现在只需要两个单元测试就可以重现这个问题,一个通过,一个失败。当单独运行时,它们都通过,当在本地或构建服务器上手动运行时,它们都将通过

开发服务器 我们将开发环境设置为远程服务器。所有开发人员都使用VS2013终极版。所有开发人员都使用localdb的共享实例。这似乎工作得很好,我能够在这种环境下开发和测试。我所有的测试都通过了。然后我将代码推送到构建服务器的上游

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


所以我不确定这里到底发生了什么,以前有没有人经历过这种行为?如果是,你是如何解决的?我想让这些测试通过,这样我的构建就可以通过并继续进行。

好的,我已经通过了单元测试,但我最终做了一件奇怪的事情,让它们通过,我不太清楚为什么会这样。尽管runners帐户在localdb实例上拥有完整的“服务器角色”权限(选中所有复选框),我还是决定抛出一个hail Mary,并完成了将用户“映射”到相关DB的过程,将其默认模式设置为dbo,并给他完整的权限(选中所有复选框)。完成此操作后…测试通过。因此,我显然不了解localdb中权限传播的方式,我假设像上帝一样的服务器角色意味着对单个dbs拥有完全的权限,但我猜不是吗?我不是DBA,我实际上要和我们的DBA聊天,看看他怎么想。也许这与存储过程执行有关?也许这需要特殊的私人空间?我过去确实知道,我必须创建特殊角色来执行存储过程,所以它们有点挑剔。不管怎样,单元测试通过了,所以我现在很高兴