CodedUI 测试因缺少程序集引用而失败?
Posted
技术标签:
【中文标题】CodedUI 测试因缺少程序集引用而失败?【英文标题】:CodedUI tests failing due to missing assembly reference? 【发布时间】:2013-05-23 17:55:05 【问题描述】:我有一个使用 VS2010 为在机器 A 上运行的 TFS2010 构建的编码 UI 测试。我在机器 A 上安装了一个测试代理,测试可以成功运行。我的 testsettings 文件>Roles 设置为 RemoteExecution,因为这些 codedUI 测试始终需要在机器 A 上运行。该文件始终显示我指定的“已连接到控制器”。
我将代码检查到构建服务器(机器 B)中,但它失败了。在 codedUI 程序集上将 copy local 设置为 false 时,构建失败并出现错误:
"不可运行:初始化单元测试扩展失败 'urn:CodedUITest':未为 以下属性: Microsoft.VisualStudio.TestTools.UITesting.CodedUITestAttribute。”
在机器 B 上的应用程序日志中,我得到了这个:
(QTAgent32.exe, PID 5308, 线程 8) GetCollectorType: 获取失败 收集器类型 'Microsoft.VisualStudio.TestTools.DataCollection.SystemInfo.SystemInfoDataCollector, Microsoft.VisualStudio.TestTools.DataCollection.SystemInfo, 版本=10.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a': System.IO.FileNotFoundException:无法加载文件或程序集 'Microsoft.VisualStudio.TestTools.DataCollection.SystemInfo, 版本=10.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a' 或 它的依赖项之一。该系统找不到指定的文件。 文件名: 'Microsoft.VisualStudio.TestTools.DataCollection.SystemInfo, 版本=10.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a' 在 System.RuntimeTypeHandle.GetTypeByName(字符串名称,布尔值 throwOnError, Boolean ignoreCase, Boolean reflectOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName,ObjectHandleOnStack 类型)在 System.RuntimeTypeHandle.GetTypeByName(字符串名称,布尔值 throwOnError, Boolean ignoreCase, Boolean reflectOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) 在 System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean 仅反射,StackCrawlMark 和 stackMark)在 System.Type.GetType(String typeName, Boolean throwOnError) 在 Microsoft.VisualStudio.TestTools.DataCollection.ExecutionPluginManager.GetCollectorType(字符串 collectorTypeName, Exception&loadException)
警告:程序集绑定日志记录已关闭。启用程序集绑定 失败记录,设置注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) 为 1。注意:有 是与装配绑定失败相关的一些性能损失 记录。要关闭此功能,请删除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。
在管理控制台中我得到了这个:
读取 sqm 注册表项时遇到以下错误: TF255003: 找不到以下安装路径 特征:应用层。要么未安装该功能,要么您 必须使用不同的安装路径。
在编码的 UI 程序集上将本地复制设置为 true,我在 VS 的构建资源管理器中没有收到任何错误,但构建失败并显示 0/0 测试运行。在机器 B 上的应用程序日志中,我得到:
来自源 VSTTExecution 的事件 ID 0 的描述不能是 成立。引发此事件的组件未安装在 您的本地计算机或安装已损坏。你可以安装 或修复本地计算机上的组件。
如果事件源自另一台计算机,则显示信息 必须与事件一起保存。
活动中包含以下信息:
(MSTest.exe, PID 5544, Thread 1) 枚举时抛出异常 部件: Microsoft.VisualStudio.TestTools.Exceptions.EqtDataException:无法 加载测试容器 'C:\Builds\1\Project\Binaries\Microsoft.VisualStudio.QualityTools.CodedUITestFramework.dll' 或其依赖项之一。错误详情: System.IO.FileNotFoundException:无法加载文件或程序集 'Microsoft.VisualStudio.QualityTools.Vsip,版本=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其之一 依赖关系。系统找不到指定的文件。
在 Microsoft.VisualStudio.TestTools.TestTypes.Unit.AssemblyEnumerator.EnumerateAssembly(IWarningHandler warningHandler、字符串位置、ProjectData projectData、ObjectHandle assemblyResolverWrapper) 在 Microsoft.VisualStudio.TestTools.TestTypes.Unit.AssemblyEnumerator.EnumerateAssembly(IWarningHandler warningHandler、字符串位置、ProjectData projectData、ObjectHandle assemblyResolverWrapper) 在 Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestAttributeEnumerator.Read(ITestTypeExtensionClientSidesProvider 提供程序,IWarningHandler 警告处理程序,字符串 assemblyFileName, ProjectData projectData, TestRunConfiguration testRunConfiguration)
机器 B 确实安装了 VS2010 express。
我还需要做什么才能在机器 B(构建机器)上构建此构建,但在机器 A(使用测试代理)上运行测试?我还能做些什么来诊断这个?
更新:我尝试手动将 qualitytools.vsip dll 复制到项目中,并以将本地复制设置为 true 的方式引用它,但现在我又回到了
"初始化单元测试扩展 'urn:CodedUITest' 失败:A 未为以下属性注册单元测试扩展: Microsoft.VisualStudio.TestTools.UITesting.CodedUITestAttribute。”
【问题讨论】:
【参考方案1】:请检查目标框架未设置为 .NET 框架 4 客户端配置文件的项目属性。而是设置为 .Net 框架 4(没有客户端配置文件)
【讨论】:
【参考方案2】:using Microsoft.VisualStudio.TestTools.UITesting;
using Microsoft.VisualStudio.TestTools.UITesting.htmlControls;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CodedUITestProject1.Libraries
class generic
public static BrowserWindow mParentWindow get; set;
public static BrowserWindow ParentWindow
get
if(mParentWindow==null)
mParentWindow = TopParentWindow();
return mParentWindow;
public static BrowserWindow TopParentWindow()
BrowserWindow window = new BrowserWindow();
window.SearchProperties[UITestControl.PropertyNames.ClassName]=BrowserWindow.CurrentBrowser.ToString();
return window;
public enum PropertyType
Id,
Name,
ClassName,
InnerText,
TagInstance
public static void EnterText<T>(PropertyType type,string propvalue,string text) where T:HtmlControl
HtmlControl genericControl = (T)Activator.CreateInstance(typeof(T), new object[] ParentWindow );
if (type==PropertyType.Id)
genericControl.SearchProperties[HtmlControl.PropertyNames.Id] = propvalue;
else if (type == PropertyType.Id)
genericControl.SearchProperties[HtmlControl.PropertyNames.Id] = propvalue;
Keyboard.SendKeys(genericControl, text);
public static void ClickLink<T>(PropertyType type, string propvalue) where T : HtmlControl
HtmlControl genericControl = (T)Activator.CreateInstance(typeof(T), new object[] ParentWindow );
if (type == PropertyType.Id)
genericControl.SearchProperties[HtmlControl.PropertyNames.Id] = propvalue;
else if (type == PropertyType.Id)
genericControl.SearchProperties[HtmlControl.PropertyNames.Id] = propvalue;
//Assert.IsTrue(genericControl.WaitForControlExist(40000));
Mouse.Click(genericControl);
public static Boolean ExistLink<T>(PropertyType type, string propvalue) where T : HtmlControl
HtmlControl genericControl = (T)Activator.CreateInstance(typeof(T), new object[] ParentWindow );
if (type == PropertyType.Id)
genericControl.SearchProperties[HtmlControl.PropertyNames.Id] = propvalue;
else if (type == PropertyType.Id)
genericControl.SearchProperties[HtmlControl.PropertyNames.Id] = propvalue;
try
Assert.IsTrue(genericControl.WaitForControlExist(4000));
return true;
catch (Exception e)
return false;
//Mouse.Click(genericControl);
【讨论】:
你能不能再补充一个解释?【参考方案3】: Solution 1: Replace the name as that seen in pop UP. Might be this code can help clicking it
WinWindow pop = new WinWindow(null);
pop.SearchProperties.Add("Name", "Message from webpage", "ClassName", "#32770");
‘Windows Internet Explorer
pop.TechnologyName = "MSAA";
pop.DrawHighlight();
//------------
“Usinng MSTEST.exe to generate result”
C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE>MSTest /testcontainer:
D:\Practise\CodedUITestProject1\CodedUITestProject1\CodedUITestProject1\bin\Debu
g\CodedUITestProject1.dll /test:CodedUITestMethod1 /resultsfile:D:\SachintestRes
.trx
public void CodedUITestMethod1()
// To generate code for this test, select "Generate Code for Coded UI Test" from the shortcut menu and select one of the menu items.
// To generate code for this test, select "Generate Code for Coded UI Test" from the shortcut menu and select one of the menu items.
string testcase = " /testcontainer:" + "D:\\Practise\\CodedUITestProject1\\CodedUITestProject1\\CodedUITestProject1\\bin\\Debug\\CodedUITestProject1.dll /test:CodedUITestMethod1 /resultsfile:D:\\SachintestResAut.trx";
string Path = @"C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE\MSTest";
Process myProcess = new Process();
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(Path, testcase);
myProcessStartInfo.UseShellExecute = false;
try
myProcess.StartInfo = myProcessStartInfo;
myProcess.Start();
myProcess.BeginOutputReadLine();
catch (Exception ex)
MessageBox.Show(ex.Message);
WinText text = new WinText(pop);
text.SearchProperties.Add("Name", "Some Name");
String msg = text.GetProperty("DisplayText").ToString();
if (msg.Contains("Data saved."))
Console.WriteLine("System is displaying " + msg);
else
Console.WriteLine("System is displaying " + msg);
WinButton ok = new WinButton(pop);
ok.TechnologyName = "MSAA";
ok.SearchProperties.Add("Name", "OK");
Mouse.Click(ok);
Solution 2: Try the Browser Dialog Actions like OK,Cancel,Close .May be it can be helpful. PFB snapshot below.
try
BrowserWindow browserWindow = new BrowserWindow();
browserWindow.PerformDialogAction(BrowserDialogAction.Ok);
catch (Exception)
// If a popup does not exists and an error is thrown, continue...
Playback.PlaybackSettings.ContinueOnError = true;
//C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE>MSTest /testcontainer: D:\Practise\CodedUITestProject1\CodedUITestProject1\CodedUITestProject1\bin\Debu g\CodedUITestProject1.dll /test:CodedUITestMethod1 /resultsfile:D:\SachintestRes .trx
public void CodedUITestMethod1()
// To generate code for this test, select "Generate Code for Coded UI Test" from the shortcut menu and select one of the menu items.
// To generate code for this test, select "Generate Code for Coded UI Test" from the shortcut menu and select one of the menu items.
string testcase = " /testcontainer:" + "D:\\Practise\\CodedUITestProject1\\CodedUITestProject1\\CodedUITestProject1\\bin\\Debug\\CodedUITestProject1.dll /test:CodedUITestMethod1 /resultsfile:D:\\SachintestResAut.trx";
string Path = @"C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE\MSTest";
Process myProcess = new Process();
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(Path, testcase);
myProcessStartInfo.UseShellExecute = false;
try
myProcess.StartInfo = myProcessStartInfo;
myProcess.Start();
myProcess.BeginOutputReadLine();
catch (Exception ex)
MessageBox.Show(ex.Message);
【讨论】:
以上是关于CodedUI 测试因缺少程序集引用而失败?的主要内容,如果未能解决你的问题,请参考以下文章
C# 未能找到类型或命名空间名称“Form1”(是不是缺少 using 指令或程序集引用?)
由于缺少未丢失的程序集引用,Visual Studio拒绝构建项目