ui测试,VS2010测试功能之旅:编码的UI测试(6)- 提高UI测试稳定性的8个方法(下)

VS2010测试功能之旅
——编码的UI测试系列之六:提高UI测试稳定性的8个方法(下)
RealZhao,2011年5月11日
回顾
在之前,我们介绍了提高UI测试稳定性的8个方法的前6个,接下来介绍剩下两个,严格的说,剩下的这两个是前6个的综合版,功能也比他们强,但使用起来略为复杂,一般出现有多个条件需要等待时,才使用这两个方法。


MSDN上的说明
在MSDN上,对这两种方法的说明(注:由于MSDN官网上的中文翻译有问题,为了不让大家误解这些方法的意思,这里还是贴出英文原文,看的懂的看,看不懂可以跳过直接看本文下面的使用方法介绍)
UITestControl.WaitForControlXXX() methods
Description
WaitForControlCondition(Predicate(Of UITestControl))
Waits for the specified predicate returns to be true. This can be used for complex wait operation (like OR conditions) _disibledevent=>Succeeded or Failed as shown in the following code:
WaitForCondition(Of T)(T, Predicate(Of T))
All the previous methods are instance methods of UITestControl. This method is a static method. This method also waits for the specified predicate to be true but it can be used for complex wait operation (like OR conditions) _disibledevent=>Succeeded or until an error message appears, as shown in the following code:

如何使用
一.WaitForControlCondition()
作用:等待传入方法的不断执行,直到该方法返回值为true,传入的方法满足predicate(这里描述地比较抽象,待会看示例就明白)。
返回值:bool类型值,predicate方法执行后,如果返回True,则返回True,否则返回False
典型的使用场景:进行某个操作之后,某一个控件的多个属性都发生了变化,或者某一个控件的属性变化你无法预计,但可以明确范围。
举例:
Act.1 为了修改用户头像,现在我们要上传一个文件,假设这个时候已经选择了要上传的文件,点击“开始上传”
ui测试,VS2010测试功能之旅:编码的UI测试(6)- 提高UI测试稳定性的8个方法(下)

Act.2 如果上传成功,点击“确认”,提交信息
ui测试,VS2010测试功能之旅:编码的UI测试(6)- 提高UI测试稳定性的8个方法(下)

如果上传失败,点击“取消“,退出模块
ui测试,VS2010测试功能之旅:编码的UI测试(6)- 提高UI测试稳定性的8个方法(下)


未优化代码:
1 public void EditUser() 2 { 3 //..... 4 5 Mouse.Click(UI开始上传Button, new Point(1, 1)); 6 7 if (UI上传状态Text.WaitForControlPropertyEqual("DisplayText", "上传成功", 30000)) 8 { 9 Mouse.Click(UI确认Button, new Point(1, 1)); 10 } 11 else if (UI上传状态Text.WaitForControlPropertyEqual("DisplayText", "上传失败", 30000)) 12 { 13 Mouse.Click(UI取消Button, new Point(1, 1)); 14 } 15 }
可能造成的问题:
如果失败,就得多等个30秒,因为判断上传成功的语句WaitForControlPropertyEqual("DisplayText", "上传成功", 30000)的超时时间是30秒。
优化过后的代码:

1 public void EditUser() 2 { 3 //..... 4 5 Mouse.Click(UI开始上传Button, new Point(1, 1)); 6 7 UI上传状态Text.WaitForControlCondition(IsStatusDone, 30000); //在30秒之内,循环执行IsStatusDone方法,直到它返回true则等待结束 8 9 if (UI上传状态Text.DisplayText == "上传成功") 10 { 11 Mouse.Click(UI确认Button, new Point(1, 1)); 12 } 13 else if (UI上传状态Text.DisplayText == "上传失败") 14 { 15 Mouse.Click(UI取消Button, new Point(1, 1)); 16 } 17 } 18 19 private static bool IsStatusDone(UITestControl control) 20 { 21 WinText statusText = control as WinText; 22 return statusText.DisplayText == "上传成功" || statusText.DisplayText == "上传失败"; 23 }

二.WaitForCondition()
作用:等待传入方法的不断执行,直到该方法返回值为true,传入的方法满足predicate(这里描述地比较抽象,待会看示例就明白)。只有TopLevel级别的控件可以使用。
返回值:bool类型值,predicate方法执行后,如果返回True,则返回True,否则返回False
典型的使用场景:进行某个操作之后,多个控件的属性都发生了变化。
举例:
Act.1 为了修改用户头像,现在我们要上传一个文件,假设这个时候已经选择了要上传的文件,点击“开始上传”(注意,界面改变了,可以上传多个附件),注意,点击上传后是所有的文件同时上传,而非一个个上传。(也就是说,有可能第2个传完了,第1个还没传完)
ui测试,VS2010测试功能之旅:编码的UI测试(6)- 提高UI测试稳定性的8个方法(下)

Act.2 如果都上传成功,点击“确认”,提交信息
ui测试,VS2010测试功能之旅:编码的UI测试(6)- 提高UI测试稳定性的8个方法(下) 未优化代码:
1 public void EditUser() 2 { 3 //..... 4 5 Mouse.Click(UI开始上传Button, new Point(1, 1)); 6 7 bool isUpLoadDone = true; 8 9 isUpLoadDone &= UI上传状态1Text.WaitForControlPropertyEqual("DisplayText", "上传成功", 30000); 10 11 isUpLoadDone &= UI上传状态2Text.WaitForControlPropertyEqual("DisplayText", "上传成功", 30000); 12 13 isUpLoadDone &= UI上传状态3Text.WaitForControlPropertyEqual("DisplayText", "上传成功", 30000); 14 15 isUpLoadDone &= UI上传状态4Text.WaitForControlPropertyEqual("DisplayText", "上传成功", 30000); 16 17 isUpLoadDone &= UI上传状态5Text.WaitForControlPropertyEqual("DisplayText", "上传成功", 30000); 18 19 if (isUpLoadDone) 20 { 21 Mouse.Click(UI确认Button, new Point(1, 1)); 22 } 23 else 24 { 25 Mouse.Click(UI取消Button, new Point(1, 1)); 26 } 27 }
可能造成的问题:
看了这段纠结无比的代码,我不晓得该说什么好了,到底要等个多久啊。
优化过后的代码:
1 public void EditUser() 2 { 3 //..... 4 5 Mouse.Click(UI开始上传Button, new Point(1, 1)); 6 7 if (UI修改用户Window.WaitForCondition(new WinText[] { UI上传状态1Text, UI上传状态2Text, UI上传状态 8 9 3Text, UI上传状态4Text, UI上传状态5Text }, IsStatusDone)) //在30秒之内,循环执行IsStatusDone方法,如果其返回值为true,则等待结束。 10 11 { 12 Mouse.Click(UI确认Button, new Point(1, 1)); 13 } 14 else 15 { 16 Mouse.Click(UI取消Button, new Point(1, 1)); 17 } 18 } 19 20 private static bool IsStatusDone(WinText[] controls) 21 { 22 bool isUpLoadDone=true; 23 foreach (WinText winText in controls) 24 { 25 isUpLoadDone &= ( winText.DisplayText == "上传成功"); 26 } 27 return isUpLoadDone; 28 }
总结
本章介绍了提高UI测试稳定性的8种方法(提高UI测试稳定性的8个方法的前6个见此)。相信大家有这样的经历,我们在运行UI测试时,很多测试不通过的情况,其实大多是由于测试代码不够稳定而造成的,而不是被测试程序本身的错误。因此,如何解决这些稳定性问题,一直是UI测试成败的关键之一。
对于测试的稳定性来说,WaitForControlCondition和WaitForCondition,都是种比较重的手法,它们可以实现前6种方法的所有功能,甚至是提供额外的功能。但它们的使用需要编写新的函数,导致了一定的复杂性,一般出现有多个条件需要等待时,才使用这两个方法。

附:发布计划
编码的UI测试系列之一:入门篇 一个简单的示例(Released)
编码的UI测试系列之二:入门篇 操作动作的录制原理(上)(Released)
编码的UI测试系列之二:入门篇 操作动作的录制原理(下)(Released)
编码的UI测试系列之三:入门篇 操作对象的识别原理 (Released)
编码的UI测试系列之四:进阶篇 通过编写测试代码的方式建立UI测试(上)(Released)
编码的UI测试系列之四:进阶篇 通过编写测试代码的方式建立UI测试(下)(Released)
编码的UI测试系列之五:进阶篇 使用数据驱动的测试(Released)
编码的UI测试系列之六:进阶篇 提高UI测试稳定性的8种方法(上)(Released)
编码的UI测试系列之六:进阶篇 提高UI测试稳定性的8种方法(下)(Released)
编码的UI测试系列之七:进阶篇UI测试之间的互相引用和测试组织
编码的UI测试系列之八:高级篇 远程调用其他机器进行测试
编码的UI测试系列之九:高级篇 使用MS测试管理器组织测试

Tags:  网络稳定性测试 显卡稳定性测试 电脑稳定性测试 ui自动化测试 ui测试

延伸阅读

最新评论

发表评论