前言

测试报告是测试阶段的最后产出,也是最重要的产出,自动化测试报告也是如此。前期所做的工作,添加对象、编写脚本等都是为了可以生成一份正确、严谨的测试报告。我作为一款功能全面的自动化测试工具,毫无疑问,提供了强大的测试报告定制功能,让我们从对象库编程中的脚本说起吧,脚本代码如下。

 With Browser("web对象演示")
With .Page("web对象演示")
.WebEdit("用户名").Set "test"
.WebEdit("邮箱").Set "11111@qq.com"
.WebEdit("个人介绍").Set "haha"
.WebList("开发语言").Select "java"
.WebCheckBox("电影").Set "ON"
.WebCheckBox("游戏").Set "ON"
.WebRadioGroup("性别").Select "男"
.WebButton("提交").Click
End With With .Page("用户信息示")
username=.WebTable("用户名").GetCellData(,)
mail=.WebTable("用户名").GetCellData(,)
sex=.WebTable("用户名").GetCellData(,)
End With
End With
If username="test" and mail="11111@qq.com" and sex="男" Then
msgbox "OK"
End If

为了方便的看出测试报告的效果,简单的修改验证部分代码如下,将mail的验证数据故意写错为"22222@qq.com"。

 If username="test" Then
print "OK"
else
print "NOT OK"
End If
If mail="22222@qq.com" Then '这里故意把验证数据写错,运行结果应该是Failed
print "OK"
else
print "NOT OK"
End If
If sex="男" Then
print "OK"
else
print "NOT OK"
End If

脚本运行后,点击【Automation】->【Results】打开测试结果。

可以看到Passed、Failed部分都为0,也就是说并没有把刚才if语句的判断结果加入到测试报告中,那是由于没有采用Report对象生成测试报告,再次修改验证部分代码,运行后看结果。

 If username="test" Then
reporter.ReportEvent micPass,"用户名","预期结果:test"&"||"&"实际结果:"&username
else
reporter.ReportEvent micFail,"用户名","预期结果:test"&"||"&"实际结果:"&username
End If
If mail="22222@qq.com" Then '这里测试结果应该是Failed
reporter.ReportEvent micPass,"邮箱","预期结果:22222@qq.com"&"||"&"实际结果:"&mail
else
reporter.ReportEvent micFail,"邮箱","预期结果:22222@qq.com"&"||"&"实际结果:"&mail
End If
If sex="男" Then
reporter.ReportEvent micPass,"性别","预期结果:男"&"||"&"实际结果:"&sex
else
reporter.ReportEvent micFail,"性别","预期结果:男"&"||"&"实际结果:"&sex
End If

Reporter对象

这次成功了,2Passed,1Failed和我们想要的一样,Reporter对象是大功臣,必须要隆重的向大家介绍。在关键字视图中查看Reporter对象,发现有2个方法和3个属性可以使用,关于这些属性方法的具体介绍可以按F1自行查看,这里主要介绍一下ReportEvent方法。

Reporter.ReportEvent EventStatus, ReportStepName, Details [, ImageFilePath]这是ReportEvent方法的参数介绍。

  • EventStatus:测试结果状态,有micPass、micFail、micDone和micWarning四个值可供选择,按字面意思理解即可。

  • ReportStepName:在测试结果中显示的步骤名称。

  • Details:详细描述。

  • ImageFilePath:可选参数,截图路径。

reporter.ReportEvent micFail,"邮箱","预期结果:22222@qq.com"&"||"&"实际结果:"&mail,代表的意思是如果邮箱值与预期值不相等则将结果记为失败,步骤名称为“邮箱”,如下图

但是,使用ReportEvent方法生成的测试报告都是一个层级的,在同一节点上,看上没有层次感。如果我们想把邮箱的验证结果放在用户名下面,而把性别的验证结果放在邮箱下面,像这样(用户名验证失败是因为父节点的结果是所有子节点结果的合取,子节点有一个失败,父节点就失败)。

这就需要用到Reporter对象的隐藏方法了,先上代码

 If username="test" Then
reporter_set micPass,"用户名","test",username
else
reporter_set micFail,"用户名","test",username
End If
If mail="22222@qq.com" Then '这里测试结果应该是Failed
reporter_set micPass,"邮箱","22222@qq.com",mail
else
reporter_set micFail,"邮箱","22222@qq.com",mail
End If
If sex="男" Then
reporter_set micPass,"性别","男",sex
else
reporter_set micFail,"性别","男",sex
End If Private function reporter_set(ss,node_step,exp_value,actul_value)
'定义字典对象
Set result_desc = CreateObject("Scripting.Dictionary")
'状态
result_desc("Status")=ss
'设置节点名称
result_desc("PlainTextNodeName")=node_step
' 详细描述信息,可以使用HTML格式
result_desc("StepHtmlInfo") = "预期结果:"&exp_value&"||"&"实际结果:"&actul_value
' 使用Reporter对象的LogEvent方法写入新节点
int_id= Reporter.LogEvent("User", result_desc, Reporter.GetContext)
' 调用Reporter对象的SetContext把新写入的节点作为父节点
Reporter.SetContext int_id End Function

Reporter对象的LogEvent方法可以写入一个新的节点,SetContext 是将新写入的节点当作父节点,如果想把邮箱和性别都作为用户名的子节点,需要调用Reporter对象的UnSetContext方法,该方法返回上一层节点。

 '返回上一层节点演示
If username="test" Then
reporter_set micPass,"用户名","test",username
else
reporter_set micFail,"用户名","test",username
End If
If mail="22222@qq.com" Then '这里测试结果应该是Failed
reporter_set micPass,"邮箱","22222@qq.com",mail
else
reporter_set micFail,"邮箱","22222@qq.com",mail
return_previous_node
End If
If sex="男" Then
reporter_set micPass,"性别","男",sex
else
reporter_set micFail,"性别","男",sex
End If Private function reporter_set(ss,node_step,exp_value,actul_value)
'定义字典对象
Set result_desc = CreateObject("Scripting.Dictionary")
'状态
result_desc("Status")=ss
'设置节点名称
result_desc("PlainTextNodeName")=node_step
' 详细描述信息,可以使用HTML格式
result_desc("StepHtmlInfo") = "预期结果:"&exp_value&"||"&"实际结果:"&actul_value
' 使用Reporter对象的LogEvent方法写入新节点
intId = Reporter.LogEvent("User", result_desc, Reporter.GetContext)
' 调用Reporter对象的SetContext把新写入的节点作为父节点
Reporter.SetContext intId
End Function Function return_previous_node
Reporter.UnSetContext
End Function

关于Reporter对象就介绍这么多了,他还有很多隐藏的方法,有兴趣的话可以研究研究,下一次将介绍EOM方面的内容。

QTP自传之测试报告的更多相关文章

  1. QTP自传之录制

    录制,是一件吃力不讨好的活.很多人以为录制就是我的主要甚至全部的功能,这是大错特错的.不过,录制功能却是不熟悉我的人了解我的有效途径,是大家学习的有力武器.今天就先从录制功能说起吧. 说到录制,就不得 ...

  2. QTP自传之初识

    我叫QTP,全名是HP Quicktest Professional,大家都叫我小Q. 小Q生于1998年,那是一个春天(哈哈咱也是跨世纪的人才).家里人丁兴旺,兄弟众多,L(Loadrunner), ...

  3. QTP自传之web常用对象

    随着科技的进步,“下载-安装-运行”这经典的三步曲已离我们远去.web应用的高速发展,改变了我们的思维和生活习惯,同时也使web方面的自动化测试越来越重要.今天,介绍一下我对web对象的识别,为以后的 ...

  4. QTP自传之描述性编程

    描述性编程,即采用描述性的语言定位对象,不需要事先将对象添加到对象库中.下面,就说说如何使用描述性编程,我们将继续使用对象库编程中的网页. 使用描述性编程的两种方法 直接描述 对象("属性名 ...

  5. QTP自传之对象库编程

    对象库编程是我们平时工作中使用最多的编程方式,在自动化脚本开发中起到举足轻重的作用,与描述性性编程相比,更直接和易于维护,今天就和大家简单的聊聊如何进行对象库编程. 既然是对象库编程,肯定要对已存在于 ...

  6. QTP自传之对象

    对象在手,测试我有 大家别误会,这里说的对象可不是值指男女朋友,而是对被测控件的识别.经过昨天的录制,大家一定很奇怪为什么我可以做到精确的回放操作,这都要归功于对象,下面就隆重的介绍我在对象识别方面的 ...

  7. QTP脚本--应用参数化来测试某个输入框

    以前一直觉得自己没有写代码的资质,太急于求成,以为一天就能写好几个功能,几千行代码,于是就没耐心了,没心情学下去了....但是最近发现其实写代码是一个漫长的过程,都是在修修改改中成长起来的.于是今天试 ...

  8. QTP常用功能

    1.QTP录制过程的截图 查看录制脚本过程中QTP的截图可以在QTP中查找,在关键字视图中点击每一步都对应一个截图   2.在关键字视图中为测试步骤添加注释 在关键字视图中表格列头中单击鼠标右键,选择 ...

  9. QTP中FSO的使用

    序 FSO即文件系统对象(File System Object),在测试工作中有广泛的应有,它可以帮助我们自动生成测试目录,写日志,测试报告等.FSO有对象有很多属性和方法,今天只介绍几个常用的. 创 ...

随机推荐

  1. fiddler了解

    常常听到有人会所抓包什么的,自己电脑上有一段fiddler软件,但是一直没有使用,因为不了解.今天终于看视频,看博客,大致了解了fiddler这个软件,看着是非常强大啊.那么fiddler到底是什么, ...

  2. thread跟Runnable实现多线程

    //两种实现方式的区别和联系: //在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处: //避免点继承的局限,一个类可以继承 ...

  3. jdbc mysql - Column count doesn't match value count at row 1.

    该句的意思是,insert操作的SQL语句里列的数目和后面值的数目不一致.比如说, String sql = "insert into t_aqi(city_name, cur_date, ...

  4. 线程同步(AutoResetEvent与ManualResetEvent)

    前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据, ...

  5. WordPress4.1新的函数介绍

    wordpress 4.1也更新了一阵子了,作为一般用户最关系的就是新的wordpress主题,作为开发者,新增的函数也给我们带来了更多的便捷和惊喜,今天就转载一篇介绍wordpress4.1中新增的 ...

  6. Java线程(学习整理)--2---加入另一个线程join

    1.join简介: 今天刚学的,这里我简单总结一下,join本身就是“加入”的意思,那么在线程中是什么意思呢?是在一个线程的run方法执行过程中,当特殊情况下需要执行一些其他的操作的时候,我们会用到j ...

  7. Spring中的创建与销毁

    在bean中添加属性init-method="方法名" destroy-method="方法名" init-method        该方法是由spring容 ...

  8. 获取C++类成员变量的地址偏移

    今天有在校学生问怎么获取类中的成员变量的地址偏移量,这个应该是很多初学C++的人很好奇的问题.以前我在学校的时候,也有过这种需求.忘了当时是要写什么“奇怪的程序”了,反正需要获取一个类的成员变量的地址 ...

  9. 获取Enum的扩张方法。

    public static class EnumExtention { /// <summary> /// 获取枚举的描述信息 /// </summary> /// <t ...

  10. DEDECMS 关键字不能小于2个字节!

    今天在做DEDECMS模板时,突然遇到了“关键字不能小于2个字节!”晕,是怎么回事呢?百度了一下,找到了答案,把他记录下来,方便自己日后再遇到这种问题时,可以查询: <form name=&qu ...