Visual studio 2015 TFS2015测试代理浏览器。启动生成。NullReferenceException:对象引用未设置为对象的实例

Visual studio 2015 TFS2015测试代理浏览器。启动生成。NullReferenceException:对象引用未设置为对象的实例,visual-studio-2015,coded-ui-tests,tfs-2015,Visual Studio 2015,Coded Ui Tests,Tfs 2015,我们从运行在TFS2015代理下的codedUI中的Browser.Launch方法中获取NullReference异常。奇怪的是,IE浏览器(版本:11.0.9600.18376)加载到测试代理上,导航到正确的web应用程序,然后立即关闭 我们已经设置了一个内部部署的TFS 2015 update 3环境,其中包含一个构建服务器和一台单独的测试代理机器。codedUI项目已从Visual Studio 2013升级到Visual Studio 2015。我们将Microsoft.VisualS

我们从运行在TFS2015代理下的codedUI中的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和Microsoft.VisualStudio.TestTools.UITesting的项目引用更改为使用程序文件(x86)中的程序集\Microsoft Visual Studio 14.0\Common7\IDE\PublicAssembly\

我们使用交互式流程的代理配置和运行功能测试构建步骤为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\1\s\DPORegression\DPOCommon\Case.cs:line 136
新增信息: 我们没有使用旧的XAML构建。我们正在使用新的基于web的构建定义。这些步骤包括Nuget安装程序、Visual Studio生成、Windows计算机文件复制、Visual Studio测试代理部署和运行功能测试。每个步骤都在工作,除了运行功能测试步骤执行codedUI测试,在测试代理计算机上打开IE浏览器,然后获取此错误。随后,浏览器关闭,并对测试套件中的所有剩余测试重复相同的顺序。对于运行功能测试,我们使用以下执行选项:TestSelection=testplan,其中选择了测试计划和测试套件。我们的测试配置设置为windows 7和IE。我们还将运行设置文件指向其在源代码管理中的位置。代码覆盖率被禁用。在测试设置配置中,我们只启用了屏幕和视频录制。这两种方法似乎都能起作用,因为我们可以通过屏幕和视频记录IE的短暂加载看到失败的测试结果

此外,我们还尝试通过手动将codedUI项目和源代码复制到测试代理,然后直接在测试代理计算机上安装Visual Studio 2015来诊断此问题。当我们在测试代理计算机上加载Visual Studio 2015中的codedUI项目并运行codedUI测试时,它会成功运行。但是,当运行“运行功能测试”自动构建步骤时,相同的codedUI仍然不能处理“空对象引用”问题。

2016年11月8日更新:添加我们的test.testsettings文件。在进一步诊断以响应注释问题后,我们发现,当我们从“运行功能测试”步骤中删除test.testsettings文件时,codeUI测试在加载浏览器后运行,不会出现对象空引用错误。不幸的是,我们需要使用legacy 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诊断帮助,我们找到了此问题的解决方案。当我将环境配置为在同一台机器上运行构建和代码DUI(Windows Server 2012)时,我能够通过vNext构建成功运行构建和“运行功能测试”。为此,我必须安装Microsoft Expression Encoder 4,并按照以下说明设置桌面体验:

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

  • 将Expression Encoder 4.0应用于测试代理计算机
  • 克隆了我们的构建定义,这样我就可以独立于 计划生成定义将我们的test.testsettings添加到 “运行功能测试”任务。这包括一个数据收集 屏幕录制
  • 运行构建和codedUI测试工作 成功地避免了空引用错误
  • 嗯,好了,现在让我们通过添加相同的test.settings文件来尝试原始的构建定义,该文件也是由相同的codedUI项目编译的,并运行相同的测试计划->测试套件。Kaboom,此运行失败,出现空引用错误。好了,现在我有了同一个项目的一个工作构建定义和一个非工作构建定义,等等,我查看了保存在构建服务器工作文件夹中的编译后的二进制结果。在我的例子中,这是在D:\agent\agent\u work(在构建服务器上)下,其中每个构建定义都有一个数字文件夹。比较显示,在build binary文件夹中有一组不应该存在的无关程序集。当我们将项目从VS2013迁移到VS2015,并且不得不调整项目引用以使用这些程序集的V14.0时,它们很可能在早期构建周期中被放置在文件夹中。我们删除了这些程序集的本地目录副本

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

    克隆的生成二进制文件夹

    因此,我从构建服务器中删除了原始构建定义的整个工作文件夹目录。排队等候
    <?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>