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

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) on a given control. For example, you can wait until the status text is 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) on multiple controls. For example, you can wait until the status text is Succeeded or until an error message appears, as shown in the following code:

 

如何使用 

一.WaitForControlCondition()

作用:等待传入方法的不断执行,直到该方法返回值为true,传入的方法满足predicate<UITestControl>(这里描述地比较抽象,待会看示例就明白)。

返回值:bool类型值,predicate<UITestControl>方法执行后,如果返回True,则返回True,否则返回False

典型的使用场景:进行某个操作之后,某一个控件的多个属性都发生了变化,或者某一个控件的属性变化你无法预计,但可以明确范围。

举例:

Act.1 为了修改用户头像,现在我们要上传一个文件,假设这个时候已经选择了要上传的文件,点击“开始上传”

Act.2 如果上传成功,点击“确认”,提交信息

如果上传失败,点击“取消“,退出模块

未优化代码:

复制代码
 1          public  void EditUser()
 2         {
 3              // .....
 4  
 5             Mouse.Click(UI开始上传Button,  new Point( 11));
 6 
 7              if (UI上传状态Text.WaitForControlPropertyEqual( " DisplayText "" 上传成功 "30000))
 8             {
 9                 Mouse.Click(UI确认Button,  new Point( 11));
10             }
11              else  if (UI上传状态Text.WaitForControlPropertyEqual( " DisplayText "" 上传失败 "30000))
12             {
13                 Mouse.Click(UI取消Button,  new Point( 11));
14             }
15         }
复制代码

可能造成的问题:

如果失败,就得多等个30秒,因为判断上传成功的语句WaitForControlPropertyEqual("DisplayText", "上传成功", 30000)的超时时间是30秒。

优化过后的代码:

复制代码
 1          public  void EditUser()
 2         {
 3              // .....
 4 
 5             Mouse.Click(UI开始上传Button,  new Point( 11));
 6 
 7             UI上传状态Text.WaitForControlCondition(IsStatusDone,  30000 );  //在30秒之内, 循环 执行IsStatusDone 方法 到它返回true则等待结束
 8 
 9              if (UI上传状态Text.DisplayText ==  " 上传成功 ")
10             {
11                 Mouse.Click(UI确认Button,  new Point( 11));
12             }
13              else  if (UI上传状态Text.DisplayText ==  " 上传失败 ")
14             {
15                 Mouse.Click(UI取消Button,  new Point( 11));
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<UITestControl[]>(这里描述地比较抽象,待会看示例就明白)。只有TopLevel级别的控件可以使用。

返回值:bool类型值,predicate<UITestControl[]>方法执行后,如果返回True,则返回True,否则返回False

典型的使用场景:进行某个操作之后,多个控件的属性都发生了变化。

举例:

Act.1 为了修改用户头像,现在我们要上传一个文件,假设这个时候已经选择了要上传的文件,点击“开始上传”(注意,界面改变了,可以上传多个附件),注意,点击上传后是所有的文件同时上传,而非一个个上传。(也就是说,有可能第2个传完了,第1个还没传完

Act.2 如果都上传成功,点击“确认”,提交信息

未优化代码:

复制代码
 1          public  void EditUser()
 2         {
 3              // .....
 4  
 5             Mouse.Click(UI开始上传Button,  new Point( 11));
 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( 11));
22             }
23              else
24             {
25                 Mouse.Click(UI取消Button,  new Point( 11));
26             }
27         }
复制代码

可能造成的问题:

看了这段纠结无比的代码,我不晓得该说什么好了,到底要等个多久啊。

优化过后的代码:

复制代码
 1          public  void EditUser()
 2         {
 3              // .....
 4  
 5             Mouse.Click(UI开始上传Button,  new Point( 11));
 6 
 7              if (UI修改用户Window.WaitForCondition<WinText[]>( 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( 11));
13             }
14              else
15             {
16                 Mouse.Click(UI取消Button,  new Point( 11));
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种方法的所有功能,甚至是提供额外的功能。但它们的使用需要编写新的函数,导致了一定的复杂性,一般出现有多个条件需要等待时,才使用这两个方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值