TFS2015 测试代理 Browser.Launch 生成 .NullReferenceException:对象引用未设置为对象的实例

TFS2015 Test Agent Browser.Launch generating .NullReferenceException: Object reference not set to an instance of an object

我们在 TFS2015 代理下的 codedUI 运行ning 中从 Browser.Launch 方法中获取 NullReference 异常。奇怪的是,IE 浏览器(版本:11.0.9600.18376)在测试代理上加载,导航到正确的 Web 应用程序,然后立即关闭。

我们已经设置了一个本地 TFS 2015 update 3 环境,其中包含构建服务器和单独的测试代理机器。 codedUI 项目已从 Visual Studio 2013 升级到 Visual Studio 2015。我们更改了 Microsoft.VisualStudio.QualityTools.CodedUITestFramework、Microsoft.VisualStudio.QualityTools.UITest.Common、Microsoft.VisualStudio.TestTools.UITest.Extension 和 [=42= 的项目引用] 使用 Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PublicAssemblies\

中的程序集

我们使用交互式进程的代理配置和 运行 功能测试构建步骤为 codedUI 解决方案创建 TFS2015 构建、部署和测试。

我们的 codedUI 遵循通过 Web 应用程序驱动浏览器的简单模式。要启动的代码是

BrowserWindow.CurrentBrowser = "ie";
BrowserWindow browserWindow = BrowserWindow.Launch(new System.Uri("https://app.web.com"));

这是对 BrowserWindow.Launch 方法的调用,它返回一个 nullreference 异常。这是堆栈跟踪:

at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetPropertyValuePrivate(String propertyName)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetPropertyPrivate(String propertyName)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetPropertyOfType[T](String propertyName)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.get_WindowHandle()
at Microsoft.VisualStudio.TestTools.UITesting.BrowserWindow.SwitchToWindow(BrowserWindow browserWindow)
at Microsoft.VisualStudio.TestTools.UITesting.BrowserWindow.LaunchPrivate(Uri uri)
at Microsoft.VisualStudio.TestTools.UITesting.BrowserWindow.<>c__DisplayClass2_0.<Launch>b__0()
at Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 function, UITestControl control, Boolean firePlaybackErrorEvent, Boolean logAsAction)
at Microsoft.VisualStudio.TestTools.UITesting.BrowserWindow.Launch(Uri uri)
at DPOCommon.Case.launchBrowser(String browser, String URL) in D:\agent\agent\_work\s\DPORegression\DPOCommon\Case.cs:line 136

错误信息:

Test method ScreenDesigner.TC407.TC407TestMethod_IE threw exception: System.NullReferenceException: Object reference not set to an instance of an object. 
TestCleanup method ScreenDesigner.TC407.TestCleanup threw exception. System.NullReferenceException: System.NullReferenceException: Object reference not set to an instance of an object..

补充信息: 我们没有使用旧的 XAML 版本。我们正在使用新的基于 Web 的构建定义。这些步骤是 Nuget 安装程序、Visual Studio 构建、Windows 机器文件复制、Visual Studio 测试代理部署和 运行 功能测试。除了 运行 功能测试步骤执行 codedUI 测试,在测试代理机器上启动 IE 浏览器,然后出现此错误之外,每个步骤都在工作。之后浏览器关闭并对测试套件中的所有剩余测试重复相同的序列。对于 运行 功能测试,我们使用以下执行选项:TestSelection=Test Plan 并选择了测试计划和测试套件。我们的测试配置设置为 windows 7 和 IE。我们还有 运行 设置文件指向它在我们的源代码管理中的位置。代码覆盖被禁用。在测试设置配置中,我们只启用了屏幕和视频录制。这些似乎都有效,因为我们通过 IE 短暂加载的屏幕和视频记录看到了失败的测试结果。

此外,我们尝试通过手动将 codedUI 项目和源代码复制到测试代理,然后直接在测试代理计算机上安装 Visual Studio 2015 来诊断此问题。当我们在 Visual Studio 2015 年内在测试代理机器上加载 codedUI 项目并且 运行 codedUI 测试成功运行时。但是,当 运行 通过 "run functional tests" 自动构建步骤时,相同的编码 UI 仍然无法解决 "null object reference" 问题。

2016 年 8 月 11 日更新:添加我们的 test.testsettings 文件。在进一步诊断以响应评论问题后,我们发现当我们从 "Run Functional Tests" 步骤中删除 test.testsettings 文件时,codeUI 会测试 运行 而不会在加载浏览器后出现对象空引用错误.不幸的是,我们需要使用遗留 test.testsettings 文件,因为我们需要包括屏幕录像数据收集器,以便失败的测试显示导致我们的开发团队诊断错误的 Web 应用程序序列

<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="TestSettings" id="caa2702e-3ce5-4b20-be15-5e85ef063642" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Description>These are default test settings for a local test run.</Description>
  <Deployment enabled="false" />
  <Execution>
    <TestTypeSpecific>
      <UnitTestRunConfig testTypeId="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b">
        <AssemblyResolution>
          <TestDirectory useLoadContext="true" />
        </AssemblyResolution>
      </UnitTestRunConfig>
      <WebTestRunConfiguration testTypeId="4e7599fa-5ecb-43e9-a887-cd63cf72d207">
        <Browser name="Internet Explorer 9.0" MaxConnections="6">
          <Headers>
            <Header name="User-Agent" value="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" />
            <Header name="Accept" value="*/*" />
            <Header name="Accept-Language" value="{{$IEAcceptLanguage}}" />
            <Header name="Accept-Encoding" value="GZIP" />
          </Headers>
        </Browser>
      </WebTestRunConfiguration>
    </TestTypeSpecific>
    <AgentRule name="LocalMachineDefaultRole">
      <DataCollectors>
        <DataCollector uri="datacollector://microsoft/VideoRecorder/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TestTools.DataCollection.VideoRecorder.VideoRecorderDataCollector, Microsoft.VisualStudio.TestTools.DataCollection.VideoRecorder, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="Screen and Voice Recorder">
        </DataCollector>
      </DataCollectors>
    </AgentRule>
  </Execution>
  <Properties />
</TestSettings>

在@s09 诊断帮助下,我们找到了解决此问题的方法。当我将环境配置为在同一台机器上 运行 构建和 codedUI(Windows Server 2012)时,我能够通过 vNext 构建成功 运行 构建和 "Run Functional Tests" .为此,我必须安装 Microsoft Expression Encoder 4 并按照以下说明设置桌面体验:https://msdn.microsoft.com/en-us/library/dd997558(v=vs.100).aspx

现在我们有了一个工作构建场景,我需要让它在我们的分布式测试代理机器上工作。 运行 我们构建服务器上的 codedUI 不是一个可行的解决方案。所以我将以下步骤应用于测试代理机器,它与我们的构建服务器分开并且 运行ning on Windows 7:

  1. Applied Expression Encoder 4.0 到测试代理机器
  2. 克隆了我们的构建定义,这样我就可以独立于 预定构建定义将我们的 test.testsettings 添加到 "Run Functional Tests" 任务。这包括数据收集 屏幕录制。
  3. 运行 构建和 codedUI 测试工作正常 成功没有空引用错误

嗯,好的,现在让我们通过添加相同的 test.settings 文件来尝试原始构建定义,该文件也编译了相同的 codedUI 项目和 运行ning 相同的测试计划->测试套件。 Kaboom,此 运行 因空引用错误而失败。好的,现在我有一个工作构建定义和一个非工作构建定义相同的项目,等等,我查看了构建服务器工作文件夹中保存的编译二进制结果。在我的例子中,这是在 D:\agent\agent_work (在构建服务器上)下,其中每个构建定义都有数字文件夹。比较显示,在构建二进制文件夹中有一组 ext运行eous 程序集本不应该存在。当我们将项目从 VS2013 迁移到 VS2015 并且不得不调整项目引用以使用这些程序集的 V14.0 时,它们很可能在早期构建周期中放置在文件夹中。我们删除了这些程序集到本地目录的副本。

显示额外程序集的原始构建二进制文件夹

克隆生成二进制文件夹

所以我从构建服务器中删除了原始构建定义的整个工作文件夹目录。排队一个新的构建和 Bingo...codedUI 在分布式测试代理机器上成功测试 运行。

再次感谢@s09 在诊断此问题时提供的宝贵帮助。