注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研自动组

快乐耕耘,收获成长!

 
 
 

日志

 
 

自动化测试框架的运行流程介绍  

2011-02-14 17:36:27|  分类: 自动测试 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

作者:虎哥哥

摘要

主要是介绍testNG在接收了参数后是如何一步一步运行测试任务的。 

一 几点说明

  • testNG的运行以XML文件为脉络,XML文件从大至小依次分为suite、test、class、method四个层次,我们目前是一个test只包含一个class;
  • testNG运行后会依次调用以@BeforeSuite、@BeforeClass、@BeforeMethod、@Test等标识的函数。同时,如果为testNG设置了Listener,则Listener还会在特定的时间点调用onStart、onFinish函数。@函数和on函数的时序关系如下文所述;
  • @函数分布在TestFixture.java和各个具体的用例里面,on函数则均在AutoTestListener.java;
  • on函数的输入参数(Isuite、ItestContext、ItestResult等)的具体内容是随着程序的运行逐步填充的,一开始只包含名称等基本信息,用例运行后就会填充统计数据等;
  • 结合框架代码阅读本文档;
  • 本文是从word复制过来,排版虽已整理,仍难免有不足之处,请看官包涵自动化测试框架的运行流程介绍 - 网易杭研自动组 - 网易杭研自动组

二 流程介绍

前台将参数传递给app-49,由app-49分配测试机,并启动相应测试机的run.sh脚本,脚本摘录如下:

ant compile[u1] 

java -DSUITE_NAME=$2 -DTEST_NAME=$3 -DXML_NAME=$5 -classpath .:lib/jaxen-1.1-beta-5.jar:lib/JSTAF.jar:lib/testng-jdk15.jar:lib/dom4j-1.6.1.jar:test/classes org.util.XmlWriter[u2] 

DISPLAY=:1 LANG=zh_CN.GBK

ant -DHOST=$1 -DXML_FILE=$2 -DTEST=$3 -DMAIL=$4 -DXML_NAME=$5 -buildfile build.xml > log/${suite}_log/$day/$time.log[u3] 

由ant启动testNG,传入参数($1 ~5$),build.xml中testNG部分摘录如下:

<target name="testng" depends="jar">

<mkdir dir="test-output/${XML_NAME}"/>

<testng outputDir="test-xml/${XML_NAME}" classpathref="http://autotest.blog.163.com/blog/runpath" listeners="org.util.AutoTestListener">[u4] 

<jvmarg value="-DSUITE_NAME=${XML_FILE}" />

<jvmarg value="-DTEST_NAME=${TEST}" />

<jvmarg value="-DHOST_SERVER=${HOST}" />

<jvmarg value="-DXML_FILE=${XML_NAME}" />                                 

<jvmarg value="-DMAIL_LIST=${MAIL}" />

[u5]              

<xmlfileset dir="test-xml" includes="${XML_NAME}.xml" />

</testng>

</target>

testNG框架之内的流程如下:

              onStart(ISuite),完成:

                     m_testCount = XmlReader.getAttrCount(System.getProperty("XML_FILE"), "test");[u6] 

              @BeforeSuite,完成:

                     取得host并在数据库中置为“busy”;

                     初始化Log文件;

                     设置port、主账号,启动selenium server。

              onStart(ITestContext),完成:

                     取得test name(如:<test name="test2011">),并加入testList;

                     m_runedtestCount++,并写入data文件夹下面的临时文件中。

              @BeforeClass,完成:

                     为一个具体的用例做准备,如:启动selenium客户端,登陆,清空上次测试的痕迹,建立相册等。

              @BeforeMethod,完成:

                     在Log打印"---测试用例开始!---"。

              onTestStart(ITestResult result),以@test标识的一个method开始,完成:

                    取得中文描述作为methodname,如:创建相册,,,,。并加入methodList;

                    m_runedmethodCount++;

                    中文描述写入data文件夹下面的临时文件中,如:space@app-62:~/autotest/AutomaticTesting/data$ cat progresscountxulinzhong_14-15-56method.properties

ch_testname=?挂历余额支付购买,, , ,Major

              @AfterMethod,完成:

                     打印---测试用例执行到最末尾!---;

                     打印---测试用例未完成!---。

              @AfterClass,完成:

                     清场,结束selenium客户端。

              onFinish(ItestContext),完成:

                     一个test结束时激活,目前的框架下并不xxx这个点,以后或许有用。

                    输入参数ItestContext此时已包含了这个test下面的method的运行结果,如:

                     2011-01-30 20:18:58   这是onFinish(ITestContext) when test2011

                     2011-01-30 20:18:58   getBeforeClassCountInConf[u7] (context.getFailedConfigurations = 0

                     2011-01-30 20:18:58   context.getFailedTests().size() = 0

                     2011-01-30 20:18:58   getBeforeClassCountInConf(context.getSkippedConfigurations = 0

                     2011-01-30 20:18:58   context.getSkippedTests().size() = 0

                     2011-01-30 20:18:58   getBeforeClassCountInConf(context.getPassedConfigurations = 1

                     2011-01-30 20:18:58   context.getPassedTests().size() = 6[u8] 

              @AfterSuite,完成:

                     关闭server,返还账号和port。

              onFinish(ISuite)[u9] ,完成:

                     将执行结果的目录拷贝至主控机app-49;

                     发送报告邮件[u10] ,[u11] 调用getTestReport:[u12] 

                         调用getAllModulesExecute,s.append("测试模块:").append(modulename). append("<br/><br/>")[u13] 

                             调用getStatistic,具体统计所有的数值:

failedConfAmount

passedConfAmount

skippedConfAmount

totalConfAmount

skippedTestAmount

failedTestAmount

passedTestAmount

totalTestAmount

failedConfPerc

skipedConfPerc

failedTestPerc

skippedTestPrec [u14]              

                   将host设置为“idle”;

                   最后,删除data文件夹下面的临时文件。

 运行期间听到异常,则会有:

              onTestFailure(ITestResult),完成:

调用getTestName取得test的名称 = 类名 + 方法名;

在Log文件记录失败;

调用SendEmail发送失败提示邮件:

                            SendEmail调用getFailureMail取得失败邮件的具体内容:

                                   getFailureMail调用getParameterTable取得驱动数据,如:

Parameter #1

按相册名升序

                                   getFailureMail调用getExceptionInfo取得异常信息,如:

                                   【错误】: 等待""超时!
                                            at org.testng.Assert.fail(Assert.java:89)
                                            at org.util.WaitOperation.waitForElementPresent(WaitOperation.java:34)
                                            at org.util.WaitOperation.WaitUntilElementPresent(WaitOperation.java:196)
                                            at org.util.Autotest.waitAndVerifySymbol(Autotest.java:904)
                                            at org.photo.util.operation.AlbumOperation.doVerifyUploadPhoto(AlbumOperation.java:1464)
                                            at org.photo.majortest.photofunction.BulkMovePhoto.doBeforeClass(BulkMovePhoto.java:59)
                                            25 lines not shown

                                   getFailureMail做一次统计工作:
                                          if(!failedClassName.contains(className)){

                                   failedClassName[u15] .add(className[u16] );

                                   failedClassAmount+=1;

                                   }

             onTestSkipped(ITestResult),完成:

             调用getTestName取得test的名称 = 类名 + 方法名;

             在Log文件记录skip;

             调用SendEmail发送skip提示邮件:

                            SendEmail调用getSkippedMail取得skip邮件的具体内容:

                                   getSkippedMail调用getParameterTable取得驱动数据;

                                   getSkippedMail做一次统计工作:
                                           if(!skippedClassName.contains(className)){

                                    skippedClassName[u17] .add(className);

                                    skippedClassAmount+=1;

                                    }

            onConfigurationFailure(ITestResult)类似的,也有:

                     if(!failedClassName.contains(className)){

                     failedClassName.add(className);

                    failedClassAmount+=1;

                   }

          onConfigurationSkip(ITestResult),只在Log文件标记。

附录(测试运行邮件截图):

自动化测试框架的运行流程介绍 - 网易杭研自动组 - 网易杭研自动组
 
自动化测试框架的运行流程介绍 - 网易杭研自动组 - 网易杭研自动组
 
注释:


        [u1]ant第1次运行,编译用于生成testNG XML文件的java程序。

 [u2]根据参数($2,$3,$5),生成testNG XML文件。

 [u3]ant第2次运行,启动testNG,传入参数($1 ~5$)。

 [u4]设置听器。

 [u5]传递给testNG的参数。

 [u6]取得test(指的是class的上一级的“test”,不是@test标识的test)数目:m_testCount。

 [u7]排除@beforetest,只保留@beforeclass用以统计。

 [u8]每RUN一组驱动参数就算一次。

 [u9]这里的Isuite已经包含了所有RUN结果。

 [u10]// 每次测试用例完成时,记录本次测试用例的执行情况,包括level,统计执行次数,每次+1(数据清理过程由程序中进行,不在这里进行处理),只有线上监控才使用这个 这个不明白作用???

 [u11]涉及的monitortest的含义不清楚。

 [u12]根据测试全部结束产生后的ISuite计算出所有的报告数据,产生报告邮件的正文部分。

 [u13]获取运行过的模块并在邮件中显示。

 [u14]遍历了Isuite内部的ItestContext,累计ItestContext里面的skip、fail、pass三项参数。这里,可以深入了解一下ItestContext的用例运行统计方法。

 [u15]只在最后写报告邮件时使用过一次。

 [u16]如:org.photo.majortest.photofunction.AlbumSorting。

 [u17]只在最后写报告邮件时使用过一次。

  评论这张
 
阅读(575)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018