通过值守线程处理自动化测试的Runtime error错误提示框

上一篇 / 下一篇  2012-06-16 10:29:04 / 天气: 晴朗 / 心情: 高兴 / 个人分类:RFT

51Testing软件测试网 I!jK6]!C2Blq#Z

    自动化测试开发过程中,脚本的健壮性是一个永远的话题,健壮性差的脚本会导致运行失败,影响我们最终的自动化测试效果。笔者在做自动化测试过程中,曾深受各种异常的困扰,在这里先分享一个Runtime Error C++错误提示框的处理,供大家参考。51Testing软件测试网;{,c!I-sG k
51Testing软件测试网:asW,^E/[K

!A3a([jh ?0    自动化测试的执行过程是无人值守的,所以对于执行过程中的异常处理就显得尤其重要。在我们碰到的各种异常中,IE浏览器抛出的Runtime Error c++的错误提示框无疑是最致命的,因为他会阻塞IE线程,导致RFT的执行线程挂起.对于web端的自动化测试来说,最令人沮丧的事情无非就是早上到公司后,看到屏幕上晃着一个大大的“Runtime error C++”提示框,这意味着自动化测试脚本的执行线程会被挂起,后面所有的脚本都不会得到执行。大家要注意一点,无论你在脚本做什么样的处理,对于这个提示框都无能为力,因为执行线程已经挂起了,你写的所有代码都无能为力。51Testing软件测试网m&O5_ J@

fS aQcw7I2o0    对于这个问题的处理其实也简单,那就是我们再写一个值守线程,当RFT的自动化测试启动运行时,值守线程同时启动,它每隔一定的时间就扫描当前屏幕上的测试对象,如果发现Runtime Error C++的错误提示框,就关闭它,这样可以保证后续的脚本能继续执行,当然,出现Runtime的脚本就作为异常放弃了。不过这个代价我们还是可以接收的。

#^)H'n4G+Zx#k4q0

g8q}{ R#^o;w z y0    代码实现上,需要用到JAVA的Runable接口和RFT的IWindow接口,JAVA的Runnable接口实现值守线程,IWindow接口实现界面对象的扫描和查找。

Y#rB{z3c#Wk:dK|051Testing软件测试网)Oc:fP^Y2H-B

首先我们创建一个线程对象:

k{%B9K0bs!W0
public class DaemonThread extends Thread{}

wZ.Ro#^iVv6k(O6Mm0实现其run()方法

9sG6M'e|+[0
public void run(){
N4S0kr;HbD0        while(true){
U I%n2U/B/`Z0            int count = 0;
? NM*p3[r{u$NE!b0            if(count > 30){
zK3N9pNa Uh8H0                //每隔30秒扫描一次当前界面51Testing软件测试网QV.M|W C n&k
                findAndCloseRuntimeErrorDlg();
!OX+j/u'D`_T0                count = 0;
Uh.X3L5y5eW-M0Z0            }else{51Testing软件测试网B(d*|8jF$m-jW.k |
                //让出CPU资源
1Y~q8}t%UK P} H/|,[0                try {51Testing软件测试网'X*_sH@\
                    Thread.sleep(1000);51Testing软件测试网qs8OL Ei*x
                    count++;51Testing软件测试网+^u;vN;D/{B
                } catch (InterruptedException e) {51Testing软件测试网 ~1rMa:])H
                    // TODO Auto-generated catch block51Testing软件测试网3dB/E^0}B]
                    e.printStackTrace();51Testing软件测试网Aw SV?
                }
Z6@$R:`@:c Ez+T+lt0            }51Testing软件测试网6MQ+u"I(b5H*[
        }
Ay"W/{G m5Q:o0    }
51Testing软件测试网Dq3g{7T@@ d;kCE

findAndCloseRuntimeErrorDlg的实现

6}'h4O@R9y)j,L0
public void closeRuntimeErorDlg(){51Testing软件测试网qI1U9z~x
        IWindow[] wins = getTopWindows();51Testing软件测试网 ~k? _9b
        for(int i = 0; i < wins.length; i++){
[yj#rz0            String text = wins[i].getText();51Testing软件测试网a S4X(d,X*?7H{ `
            /*
ybK Le:J@(u0             * 如果在当前窗口中有Runtime Error C++,则执行关闭IE的操作
GHyu!SC)E4pA?V0             */51Testing软件测试网R)A#UY-v(Ln
            if(text.contains("C++ Runtime Library ")){
6[8R+E!w y*M^)F1N0                try {51Testing软件测试网f D I#S4^%P e+[/I'\
                    Runtime.getRuntime().exec("cmd /c taskkill iexplorer.exe");
:Wq&uPD2S D/{N0                    Runtime.getRuntime().exec("cmd /c taskkill firefox.exe");
;H:hZKv2?p"rd0                    break;
4Az,\_ ZB6r*P }4}U0                } catch (IOException e) {51Testing软件测试网8jM9w#Y3Z L
                    // TODO 自动生成 catch 块51Testing软件测试网-R5?1znMk&qB~
                    e.printStackTrace();
8h&\VZ5rg(?6k*g0                }51Testing软件测试网U6WNxX+Z x`
            }51Testing软件测试网1v!T I'wJ g&T4A
        }51Testing软件测试网 m$sqKV
        wins = null;
$}Co E8o0    }

w:{&]Bit;{9D*S0值守线程的启动:51Testing软件测试网` g.p4k/n{5j:ukQ l

Thread t = new DaemonThread();51Testing软件测试网2h0G0Kc3|i
t.start();
51Testing软件测试网UNaS\#i

6|Yp;\Rf0    实现以上代码后,我们把启动代码加到RFT的执行队列中,当脚本开始执行时,值守线程也随之启动,每隔30秒检查一下当前界面,如果界面中出现了Runtime Error C++提示框,则会关闭IE,以避免执行队列被挂起,从而保证了所有的测试脚本都能得到执行。

\$~ {9ML}M!x0

A I4u-z1Mxo0
+kE4`A0`MDg7t9e051Testing软件测试网2D5Tg-v6N


L sL"ka+mO[0

TAG:

小马菜菜的个人空间 引用 删除 dreamever   /   2012-09-19 19:42:10
RFT的Find方法有点类似于进程注入,基本上是因为访问了IE内存中不可访问的区域导致的,具体原因真心不明……
散步的SUN的个人空间 引用 删除 散步的SUN   /   2012-09-19 15:23:12
这个策略方法不错诶~咨询一下,为什么会总出现Runtime Error c++啊?
 

评分:0

我来说两句

Open Toolbar