TFS Build失败,“无法访问文件* FakeTypesCache”

时间:2016-07-01 07:25:38

标签: c# visual-studio tfs

因为几天我们遇到了TFS构建问题。我们使用Microsoft Shims / Fakes进行一些单元测试,到目前为止我们没有遇到任何问题。 但最近UnitTest Step因以下错误而失败: 偶尔会发生以下情况:

2016-07-01T06:40:25.3532321Z ##[error]Error: System.IO.IOException: The process cannot access the file 'D:\Builds\Agent\87a4a39e\...\bin\Debug\mscorlib.4.0.0.0.Fakes.FakedTypesCache' because it is being used by another process.

2016-07-01T06:40:25.3532321Z ##[error]   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

2016-07-01T06:40:25.3532321Z ##[error]   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)

2016-07-01T06:40:25.3532321Z ##[error]   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)

2016-07-01T06:40:25.3532321Z ##[error]   at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean checkHost)

2016-07-01T06:40:25.3532321Z ##[error]   at System.IO.StreamReader..ctor(String path)

2016-07-01T06:40:25.3532321Z ##[error]   at Microsoft.VisualStudio.TraceCollector.FakesAssemblyReflector.LoadShimTypesFromCache(String fakedTypesCacheFilePath)

2016-07-01T06:40:25.3532321Z ##[error]   at Microsoft.VisualStudio.TraceCollector.FakesAssemblyReflector.ReflectShimTypes(String fakesAssemblyFullPath)

2016-07-01T06:40:25.3532321Z ##[error]   at Microsoft.VisualStudio.TraceCollector.UnitTestIsolationDataCollector.PopulateCollectionPlan(_CollectionPlan plan, XmlElement settings)

2016-07-01T06:40:25.3532321Z ##[error]   at Microsoft.VisualStudio.TraceCollector.UnitTestIsolationDataCollector.OnSecondCollectorToInitialize(_CollectionPlan plan, XmlElement configurationElement)

2016-07-01T06:40:25.3532321Z ##[error]   at Microsoft.VisualStudio.TraceCollector.CommonDataCollector.OnInitialize(XmlElement configurationElement)

2016-07-01T06:40:25.3532321Z ##[error]   at Microsoft.VisualStudio.TraceCollector.BaseDataCollector.InternalConstruct(XmlElement configurationElement, IDataCollectionEvents events, IDataCollectionSink dataSink, IDataCollectionLogger logger, IDataCollectionAgentContext agentContext)

2016-07-01T06:40:25.3532321Z ##[error]   at Microsoft.VisualStudio.TraceCollector.BaseDataCollector.Initialize(XmlElement configurationElement, DataCollectionEvents events, DataCollectionSink dataSink, DataCollectionLogger logger, DataCollectionEnvironmentContext environmentContext)

2016-07-01T06:40:25.3532321Z ##[error]   at WEX.TestExecution.DataCollectorTestMode.Initialize(ITestModeSettings settings, ICallbackRegistrar callbackRegistrar)

2016-07-01T06:40:25.3532321Z ##[error]

我不确定它是否必须对我们的代码覆盖做一些事情(因为堆栈跟踪提到了这个数据采集器)。我们使用runsettings文件来代替/排除代码覆盖中的某些内容。

在构建服务器上,我们安装了Visual Studio 2015 Update 3(但问题出现在Update 2中),TFS是2015版RTM。

显然锁定的文件并不总是相同,但它始终是“FakeTypeCaches”之一。

任何帮助将不胜感激

由于

修改

似乎问题是由并行运行单元测试引起的(我认为该选项自VS 2015 Update 1起可用)。并行运行它们似乎已经解决了问题,但遗憾的是,运行我们的测试现在需要相当长的时间来运行。特别是对于我们的CI构建,这并不理想,因为我们希望尽快得到反馈。 如果我们只能按顺序运行那些使用Faked / Stubbed类的测试,那么我知道我不知道如何实现这一点。

我们现在解决此问题的解决方案是使用TestCategory以任何方式标记所有使用Fakes / Shims的测试: [TestCategory(“Sequential”)]

在构建服务器上,我们定义了两个单元测试步骤,除了“Sequential”之外的所有类别的第一个过滤器并行运行,第二个然后并行运行“Sequential”。

3 个答案:

答案 0 :(得分:0)

根据错误消息,似乎其他进程持有该文件。 尝试使用this tool来确定哪个文件完全被哪个进程锁定。然后在建筑物正在进行时停止该过程。

答案 1 :(得分:0)

这是Update for Microsoft Visual Studio 2015 Update 2 (KB3151378)中修复的已知问题。

您应该只获取Visual Studio的最新更新,在此答案的时候是:Visual Studio 2015 Update 3

答案 2 :(得分:0)

我们在TFS2015 Update3 On-Promise上,我们在并行运行单元测试时遇到了同样的问题。 我们的短期解决方案是禁用Repository clean选项,并且只使用MSBuild clean,因此不会清除那些伪造的缓存文件。似乎错误只发生在多个测试试图同时创建伪造缓存文件的情况下。

然而,在禁用Repository clean选项的情况下,我们也遇到了一些其他随机烦人的问题。 :(。

如果您找到了避免这个问题的更好方法,请告诉我。 谢谢, 天使