编码的UI测试现在收到有关无法找到Newtonsoft.json的错误

我有一个简单的Coded UI测试来登录应用程序。 测试是数据驱动的,并使用来自TFS的数据。 我们正在使用服务器和代理系统上的TfsTestAgent用户(具有管理员权限)。 当我执行测试时,我看到以下错误:

The unit test adapter failed to connect to the data source or to read the data. For more information on troubleshooting this error, see "Troubleshooting Data-Driven Unit Tests" (http://go.microsoft.com/fwlink/?LinkId=62412) in the MSDN Library.Error details: Could not load file or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The system cannot find the file specified. 

测试运行日志(UITestLog.html)显示:

 I, 2524, 81, 2015/03/24, 13:27:09.815, 14494724802, QTAgent32_40.exe, ExtensionFramework : Reading extensions from custom dir 'C:\Program Files (x86)\Common Files\Microsoft Shared\VSTT\12.0\UITestExtensionPackages' V, 2524, 81, 2015/03/24, 13:27:09.830, .\QTAgent32_40.exe, UnitTestExecuter.RunClassInitializeMethod: Acquiring m_runner.SyncRoot. V, 2524, 81, 2015/03/24, 13:27:09.830, .\QTAgent32_40.exe, UnitTestExecuter.RunClassInitializeMethod: Acquired m_runner.SyncRoot. V, 2524, 81, 2015/03/24, 13:27:09.830, .\QTAgent32_40.exe, CodedUITest : CodedUITestExtension.BeforeClassInitialize() V, 2524, 81, 2015/03/24, 13:27:09.830, .\QTAgent32_40.exe, CodedUITest : CodedUITestExtension.AfterClassInitialize() V, 2524, 81, 2015/03/24, 13:27:09.830, .\QTAgent32_40.exe, UnitTestExecuter.RunClassInitializeMethod: Released m_runner.SyncRoot. V, 2524, 81, 2015/03/24, 13:27:09.830, .\QTAgent32_40.exe, UnitTestRunner.ExecuteDataDrivenTest: started. V, 2524, 8, 2015/03/24, 13:27:10.377, .\QTAgent32_40.exe, CodedUITest : CodedUITestExtension.BeforeClassCleanup V, 2524, 8, 2015/03/24, 13:27:10.377, .\QTAgent32_40.exe, CodedUITest : CodedUITestExtension.AfterClassCleanup V, 2524, 8, 2015/03/24, 13:27:10.393, .\QTAgent32_40.exe, CodedUITest : CodedUITestExtension.Dispose() I, 2524, 8, 2015/03/24, 13:27:10.393, .\QTAgent32_40.exe, UnitTestRunner.Dispose. 

有趣的是,Newtonsoft.Json(又名Json.Net)并未在项目中的所有或任何引用的库中使用。 从上面的日志中可以看出,这是在编码的UI测试之外,因为它没有被注册为脚本例外。

接下来的问题是,为什么在更改用户后Coded UI系统运行测试后会开始? 我尝试通过快照将其恢复为原始用户(并在测试管理器中更改主机环境)。 这样做会给我上面相同的结果。

我正在寻找任何进一步调试的方法或修复的想法。 我尝试了以下作为失败的修复程序:

  • 在解决方案中包括Newtonsoft.Json
  • 将库复制到c:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ PublicAssemblies
  • 恢复到已知的工作版本并运行它(仍然得到相同的错误)

值得注意的是最后一项。 我有我知道在多台机器上工作和工作的构建。 在任何机器上使用这些构建产生相同的结果。 什么可能导致该错误消息并且机器/测试代码独立?

错误

错误消息是

无法加载文件或程序集’Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed’或其中一个依赖项。

这里要知道的一件事是这个错误有两个选择:

  1. 它找不到Newtonsoft.Json
  2. 它无法找到依赖关系

分析

分析此类问题的典型方法是使用Process Monitor [Microsoft SysInternals] 。

如果您想完全手动完成,请按照下列步骤操作:

  1. 运行Process Monitor
  2. 为具有问题的可执行文件添加filter
  3. 重现问题
  4. 问题再现后停止录制事件
  5. 艰巨的任务:从底部,查找错误Name not foundPath not foundAccess denied 。 您必须找到一个有问题但后来没有Success的DLL(如果在搜索路径的后期找到DLL,可能会发生这种情况)。

我已自动执行此过程并提供Process Monitor Log Analyzer以供下载。 免责声明:我是这个免费工具的作者。

使用该工具,步骤如下:

  1. 运行Process Monitor
  2. 为具有问题的可执行文件添加filter
  3. 重现问题
  4. 问题再现后停止录制事件
  5. 将Process Monitor日志另存为XML
  6. 在Process Monitor Log Analyzer中打开XML
  7. 从上到下浏览项目

你的问题

接下来的问题是,为什么在更改用户后Coded UI系统运行测试后会开始?

也许“旧”用户具有足够的访问权限而“新”用户没有。 这不应该是管理员用户的原因(尽管仍然可能)。

也许“旧”用户在PATH有不同的文件夹,而“新”用户则没有。

有趣的是,Newtonsoft.Json(又名Json.Net)并未在项目中的所有或任何引用的库中使用。

我想知道你是怎么检查的。 请注意,您不能简单地使用Dependency Walker for .NET。 你需要特定于.NET的东西,例如dotPeek [JetBrains] ,但dotPeek不会立即显示所有依赖项,你需要手动完成所有引用。 但是,这不会找到丢失的本机DLL。 因此,对我来说最可靠的方法是如前所述的Process Monitor。

什么可能导致该错误消息并且机器/测试代码独立?

与以前相同:用户特定配置。