微软在Visual Studio 2010 中发行的最受欢迎的特性之一就是使用UICoder提供的自动化测试脚本。很显然,它一天比一天更受欢迎。尽管它要最终成为自动化测试领域的标准工具还有很长的路要走,但它现在已经是目前为止最受推崇的工具之一了。

ComponentOne,作为一个始终与最新的市场趋势和技术保持同步的团队,它的控件大家族中也已经囊括了对CodedUI Test的支持。ComponentOne的控件在UICoder中已被正式兼容,这就意味着当你想要开始记录或是回放在UICoder中生成的自动化脚本时,控件会支持各种类型的鼠标和键盘操作。它们(自动化脚本)也可以被CodedUI测试生成器(Test Builder)非常详细地读取。如果你想要放置某个控件(该控件的断言是基于使用存储于某一单元的数据的网格),而恰巧你正在使用C1最受欢迎的网格控件之一—C1FlexGrid,毫无疑问,它将会在UIMap类的控件列表中表现良好。

不论是控件还是UICoder都还有一些局限性,而这些限制势必会妨碍一些脚本的创新或者是对操作的记录和回放。针对这一点,我们将为ASP.NET SilverLight技术提供一些有用的建议。

 

ASP.NET 控件的小建议

CodeUI自它发行以来已经基本上被视为Winforms 应用程序的一个自动化工具,因为它从窗口读取独立对象比从网页上读取要简单的多。我们的ASP控件,从另一方面讲,在CodedUI脚本中也一样能良好运作。

小建议:对于网页,我们找到的解决方法是使用页面的DOM大范围地搜索控件标签,且自开始搜索起,控制我们的脚本运作以及断言。

火狐浏览器仅提供对脚本回放的支持,所以仍旧保留了UICoder的局限性。

小建议:为了解决这个问题,我们开始在IE记录脚本,并且通过将火狐作为打开网页的浏览器把它们在火狐上回放,在测试脚本内,使用如下代码:

BrowserWindow.CurrentBrowser = “FireFox”; // Mentioning the Browser in which script has to run
BrowserWindow win = BrowserWindow.Launch(@”<webpage name you want to open>”);
win.Maximized = true;

 

Silverlight控件的小建议

SilverLight创建CodedUI脚本向来都是一件棘手的事,因为不是所有的操作都被支持,也不是每一个操作都被记录。此外,我们还不能用多种不同的浏览器回放脚本。最最基本的问题是让控件对CodedUI 测试生成器(Test Builder)可见。这可以通过给该页面上用到的每一个元素安排一个自动化序号来有效解决。但有时候仍然会有很多操作(即使是在MS控件上)不能被正确记录,或者记录和识别在性能方面相当慢。我们面临的一个普遍问题是,不可能在同一个脚本里对同一个控件点击两次。

小建议:作为一个处理此问题的解决方法,我们在脚本中刷新页面,从而清理浏览器中的缓存,并得到新的UICoder控件列表来执行操作。

 

这个解决方法在大多数案例中都可以非常迅速地起作用。在某些我们需要多次使用同一控件的案例中,最好改变我们的页面设计。比如,将Buttons ComboBoxes放到“ContainerControls”中或者在XAML页面内分隔标签。

微软在Visual Studio 2010 Feature Pack2 Service Pack 1 中发行了加强版的CodedUI Silverlight。这解决了很多问题,但我们发现它也付出了令人相当失望的性能代价。

操作之间的时延是创建CodedUI Tests的另一个重要方面。或许记录脚本看起来并没什么用,但当我们想要这些脚本在多个不同环境成功运行,它将是最重要的因素。

没有必要在两台测试机器的同一个时间间隔内完成所有的操作,而且如果我们没有在两个操作之间提供足够的时间间隔,有可能会导致UICoder开始搜索用于下一个操作的对象但第一个尚未完成,造成脚本运行失败。

在这种情况下抛出的异常并没有多大作用因为它们都是在说没有找到这个或者那个控件。这样的说法并不能让脚本编辑者考虑到问题其实出在提供脚本操作之间的时间间隔的代码行上。

小建议:处理这种类型的异常的最好的方法是在脚本的操作之间预留足够的等待时间。VS2010给了两种类似的方法。

第一:

如果你在自己的系统里安装了差不多每个人的系统里都有的VS2010 SP1,那么读取UIMap类就相当简单了。在解决方案资源管理器中双击它,它将会被解析,所有单独的操作和用到的对象都将会被清楚地显示出来。

在此视图中如果你右击任一操作项,你会看到“在此之前插入时延”选项(见如下图)。这将会让UICoder在执行此操作前等待提到的时间。

第二:

另一种可以选择的方法是,我们可以在代码中对整个UIMethod做如下详细说明:

//There are three option for “WaitForReadyLevel” depending on use any one can be set
 Playback.PlaybackSettings.WaitForReadyLevel = WaitForReadyLevel.AllThreads;
 //Time delay is in microseconds, so depending on every action in the script we can set an average value
 Playback.PlaybackSettings.DelayBetweenActions = 1000;

 

我们将把针对Winforms WPF编码UI脚本以及样本的一些简单要点汇集成一个相似的编辑物。

这里有一些其他可以作为有用的参考的链接:
http://msdn.microsoft.com/en-us/library/dd380782.aspx

http://msdn.microsoft.com/en-us/library/dd286726.aspx