基于反射的UI测试--方法调用

      1、直接调用函数模拟用户事件

      编写基于反射的轻量级UI自动化测试的时候,我们通常需要通过调用窗体的程序的一些方法来模拟用户的一些操作。比如调用button1_Click()方法,这个方法处理用户对于button1控件的点击事件,又比如调用menuItem2_Click(),这个方法处理用户点击menuItem2菜单项这个事件。请注意,基于反射的UI自动化测试通过直接调用button控件相应的方法来模拟用户的单击事件,而不是通过触发这个事件来调用这个方法。当真正的用户单击这个button时,会产生一个Windows消息,这个消息有控件处理以后转化为一个受控的事件,这个受控的事件会触发一个特定的方法被调用。因此,如果待测程序把一个错误的方法与button的单击事件相绑定,基于反射的UI自动化测试并不能捕获这个逻辑错误。

     2、方法调用中的线程同步问题

假如测试套件触发了待测程序的某个方法,而这个方法直接或间接的创建了一个新的线程并且开始执行这个线程。那么必须等到控件的新线程执行结束后才能在测试套件里继续下一步的操作。有两种方法解决这个问题。

      第一种方法粗糙但是很有效:在测试套件里使用Thread.sleep()语句让测试程序暂缓执行。这种方法有一个大问题就是必须把延迟时间设置的比较长,因为没有办法知道具体要暂停多长时间。

      更好的解决方法是使用一个AutoResetEvent对象用来进行同步。在类的作用域范围内定义一个如下对象:

static AutoResetEvent are = new AutoResetEvent(false);

     这个语句创建一个AutoResetEvent对象,这个对象的值可以为已设置和未设置。false参数意味着把这个对象的值初始化为未设置。然后当需要暂停自动化测试程序的时候,就可以插入are.WaitOne()语句。这个语句会把AutoResetEvent对象的值设为未设置。当前线程会暂停执行,直到are.Set()语句把AutoResetEvent对象的值设为已设置。

posted @ 2015-12-16 12:19  zhangsai  阅读(309)  评论(0)    收藏  举报