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

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

p![!a0[(o$u0    自动化测试开发过程中,脚本的健壮性是一个永远的话题,健壮性差的脚本会导致运行失败,影响我们最终的自动化测试效果。笔者在做自动化测试过程中,曾深受各种异常的困扰,在这里先分享一个Runtime Error C++错误提示框的处理,供大家参考。
G5|w P/h.Dl(?,m)C0

#m3kW&W/l:iCVt051Testing软件测试网r0gV!I w'y{f&p Y

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

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

:A:g\K\+T"jl0

LJTxJ0    代码实现上,需要用到JAVA的Runable接口和RFT的IWindow接口,JAVA的Runnable接口实现值守线程,IWindow接口实现界面对象的扫描和查找。51Testing软件测试网1D'ImMo C*N]

q,gj G+?(|8g0O0首先我们创建一个线程对象:51Testing软件测试网d;Vwn7FK{

public class DaemonThread extends Thread{}

P'`}+Sl0实现其run()方法51Testing软件测试网TOW+d Y`:q5a3p

public void run(){51Testing软件测试网OmM!ec'x\:Ivq
        while(true){51Testing软件测试网0y t3["fO-?
            int count = 0;51Testing软件测试网!}.wm)z @
            if(count > 30){51Testing软件测试网hc9OP.?7sF }5z`B
                //每隔30秒扫描一次当前界面51Testing软件测试网F;YU["FE| @
                findAndCloseRuntimeErrorDlg();51Testing软件测试网#Q3W:F2v-[ k
                count = 0;51Testing软件测试网l)\t0FNHV
            }else{
)D+F-B2X!Re8f%Y/Y8Z0                //让出CPU资源51Testing软件测试网*[ V;^/d&e:j
                try {51Testing软件测试网$K6A? E$du3]3k
                    Thread.sleep(1000);
G&[3o'l|4i%N)v0                    count++;51Testing软件测试网p+kfk9p,A2I,M e(Uf7u
                } catch (InterruptedException e) {
l-F5p2D(F T0                    // TODO Auto-generated catch block
UV7m{}*g2J0                    e.printStackTrace();51Testing软件测试网0i9y)o%LH9i/{
                }
+?ojde2r0cHu0            }
i7P W&hod$IImCb0        }
,]%{%IOp eQ0    }

~ ?m'MF,gVVz0findAndCloseRuntimeErrorDlg的实现51Testing软件测试网(tN(LE S

public void closeRuntimeErorDlg(){
(h }hu `Y(Y#w!i5{d0        IWindow[] wins = getTopWindows();
Wc:|pM%AHs0        for(int i = 0; i < wins.length; i++){51Testing软件测试网ya v.k%f"`1Pt
            String text = wins[i].getText();
Km x|'X1g0            /*
_Ts.Co"M7kz3O0             * 如果在当前窗口中有Runtime Error C++,则执行关闭IE的操作51Testing软件测试网 ] ?avu#S
             */
!F/zH1Bs }7j |8X0            if(text.contains("C++ Runtime Library ")){
t%P$n Uh U2}"x0                try {
k/].W-U-XI5_8i&I;}@0                    Runtime.getRuntime().exec("cmd /c taskkill iexplorer.exe");
P*t+[*?{9o0                    Runtime.getRuntime().exec("cmd /c taskkill firefox.exe");
*I?w w(e _k0                    break;
!LXP8S {I'M8K0                } catch (IOException e) {
XQ?:Q;s/] A1@7A0                    // TODO 自动生成 catch 块51Testing软件测试网!PvaqNb
                    e.printStackTrace();51Testing软件测试网n&RI-QC [U} T
                }51Testing软件测试网-Y%A6{B2uhHU
            }
4Z L:wM:`5rv(tX0        }
Z N-L"q2Z-{ o0        wins = null;51Testing软件测试网4Yv'kc|'Vi&Him(hw
    }
51Testing软件测试网6k s(|6V9[8Q

值守线程的启动:51Testing软件测试网_e![#n;AG&H

Thread t = new DaemonThread();51Testing软件测试网{Q|8R,\6y?
t.start();

dTi ~7Z1|[051Testing软件测试网(CMSI:p

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

51Testing软件测试网Ye(I2BM^9Y

51Testing软件测试网S._(B8E/P"y/g

Lg(CUr9y051Testing软件测试网7E3{[3`u m5\,s~

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