ryugun 发表于 2012-4-11 14:58:39

本帖最后由 ryugun 于 2012-5-8 15:34 编辑

监控linux的资源使用情况
首先,suse上要安装sar包,保证sar命令可用
创建shell脚本:collector-data.sh
#!/bin/sh

# 设置测试结果源文件的路径
REPORT_HOME=/home
SAR_FILE=$REPORT_HOME/result

if [ -f "$SAR_FILE" ]
then
echo "Collecting the test data..."

{
    #collect cpu-usage info
    sar -u -f $SAR_FILE | awk '/all/{print 100-$8}' > $REPORT_HOME/cpu-usage.xls
    if [ $? -ne 0 ]
    then
      echo "Failed in collecting CPU info!"
    else
      echo "Succeed in collecting CPU info: ${?}"
    fi
} &

{
    #collect ram-usage
    sar -r -f $SAR_FILE | awk '!/kbmemfree/&&/^(|Average)/{print ($3-$5-$6)*100/($2+$3)}' > $REPORT_HOME/ram-usage.xls
    if [ $? -ne 0 ]
    then
      echo "Failed in collecting RAM info!"
    else
      echo "Succeed in collecting RAM info: ${?}"
    fi
} &

#collect disk info
{
    awk 'BEGIN{OFS="\t";print "rd_MB/s","wr_MB/s","avgqu-sz","%util"}' > $REPORT_HOME/disk-info.xls
    sar -d -f $SAR_FILE | awk '$2=="dev8-16"||$2=="dev8-32"||$2=="dev8-48"||$2=="dev8-64"||$2=="dev8-80"||$2=="dev8-96"||$2=="dev8-112"||$2=="dev8-128"||$2=="dev8-144"' | awk 'BEGIN{OFS="\t"}{sum_rd+=$4;sum_wr+=$5;sum_avgqu+=$7;sum_util+=$10;if(NR%9==0){print sum_rd/(9*2*1024),sum_wr/(9*2*1024),sum_avgqu/9,sum_util/9;sum_rd=0;sum_wr=0;sum_avgqu=0;sum_util=0}}' >> $REPORT_HOME/disk-info.xls
    if [ $? -ne 0 ]
    then
      echo "Failed in collecting DISK info!"
    else
      echo "Succeed in collecting DISK info: ${?}"
    fi
} &

#collect net-usage
{
    awk 'BEGIN{OFS="\t";print "rx_MB/s","tx_MB/s","%net"}' > $REPORT_HOME/net-usage.xls
    sar -n DEV -f $SAR_FILE | awk 'BEGIN{OFS="\t"}$2=="eth0"{print $5/1024,$6/1024,($5+$6)/(1024*1.25)}' >> $REPORT_HOME/net-usage.xls
    if [ $? -ne 0 ]
    then
      echo "Failed in collecting NET info!"
    else
      echo "Succeed in collecting NET info: ${?}"
    fi
} &

echo "Collecting data is done."

else
echo "The monitor data file is not exist!"
fi

ryugun 发表于 2012-4-11 15:04:07

接着上面:监控linux的资源使用情况

将collector-data.sh放到/home下

通过SSH输入命令:
sar -u -d -r -n DEV -o /home/result 2 200
u:cpu   
d:磁盘
r:内存
n:流量
o:保存文件的路径
2:每2秒监控一次
200:监控200次

使用上面的命令后,将会在/home/下生成一个文件result

执行collector-data.sh: ./collector-data.sh 将会在/home下生成几个excel文件,即使资源使用情况,再通过excel的制图功能把数据转化为图标即可

ryugun 发表于 2012-4-11 15:53:42

本帖最后由 ryugun 于 2012-4-11 16:10 编辑

http://www.51testing.com/?uid-60535-action-viewspace-itemid-18423
http://www.51testing.com/?uid-146821-action-viewspace-itemid-222680
测试策略

ryugun 发表于 2012-4-17 17:54:38

测试计划与测试方案的区别
http://www.51testing.com/?uid-15350-action-viewspace-itemid-241236

ryugun 发表于 2012-5-2 10:51:57

WATIR脚本编写指导文档

WATIR 英文缩写“Web Application Testing in Ruby”,是一个使用 Ruby 实现的开源Web 自动化测试框架,相对于那些庞大的商业工具来说,它很小巧,也很灵活,提供的功能也足够用。它对于ActiveX插件,JavaApplets, Flash, 或者其他的插件应用程序基本不支持。Ruby语言本身是一个面向对象语言,所以使用WATIR也是面向对象的思想在里面。WATIR支持对IE5.5,IE6.0,IE7.0,Firefox等浏览器的测试。
XX项目使用WATIR实现WEB自动化测试。WATIR这个自动化框架是一种编程语言,没有其他WEB自动化框架的录制功能。所以动作都需要使用语言进行控制。这样虽然在自动化中没有其他框架方便,但是纯脚本的控制可以使WEB自动化与XX项目的业务相结合,融合到原有的自动化框架中。实现了业务+WEB+CLI多种自动化模式。但是在WATIR语言编写中遇到了一些问题,例如ID根据页面信息自动分配,这样就导致了无法通过ID准确获取需要的内容。在页面复杂的情况下,HTML语言内大量的使用了<div>,CSS样式等较高级的技术。界面的操控难度上大大的提高了。本文重点介绍一下在编写过程中遇到的问题以及解决方式。
1
WATIR API使用方法由于WATIR是RUBY的一个类库,所以也继承了RUBY面向对象的特性,所以当使用WATIR查找到某个页面时,WATIR获取到一个大对象,将这个页面内所有的组件根据HTML的结构组织成一个树形结构存放在对象中,根节点就是<html></html>,可以通过“.”的方式一层一层的向下检索,也可以使用id等组件的唯一标识直接找到这个组件,然后调用属于这个组件该有的操作。在WATIR中可以实现对按钮、链接、表格、文本框、复选按钮、单选按钮等操作。在WATIR里面找到一个组件有几个方式,可以使用组件的name、id、xpath、index等。上述几个为通用的,有些还有其他属性,例如对于超级链接还可以使用text,url等进行检索。WEB自动化测试主要依靠于WEB界面HTML语言显示出来的结果,对于name、id、text、url都是通过HTML语言对组件的定义得到的。对于xpath、index等需要根据当前页面的结构得到。Index表明这个组件在整个页面出现的序列号,例如在一个页面中出现三个文本框,如果我要检索到第三个文本框,这个文本框在没有id,name等标识情况下就可以使用index为3形式进行索引,从而找到这个文本框。。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集,而每个组件的路径表达是唯一的。所以可以通过XPATH直接找到所要操作的组件。

ryugun 发表于 2012-5-2 10:52:51

接着上面

l
text_field,对应HTML标签为<input></input >:
browser.text_field(:id, "wushan").exists ,判断文本框是否存在;
browser.text_field(:id, "wushan").value,得到文本框的值;
browser.text_field(:id, "wushan").set(“www”),向文本框输入内容。
l
button,对应HTML标签为<button></button >:browser. button (:name, "box1").exists,判断按钮是否存在
browser .button(:id,"posixShare_input").click,点击一个按钮
l
checkbox,对应HTML标签<input type ='checkbox' ></input>:
browser. checkbox (:name, "box1").exists,判断checkbox是否存在
browser.checkbox(:name, "box4").value,返回checkbox的值
browser. checkbox(:name, "box4").set 选中checkboxl
radio,对应HTML标签<input type =‘radio’></input>:
browser.radio(:name, "box1").exists,判断radio是否存在
browser.radio(:name, "box5", 1).set 设置radiobrowser.radio(:name, "box3").isSet ,检查radio是否被设置
browser.radio(:name, "box1").getState 获取radio的状态,有两个返回值true,falsel
link,对应HTML标签为<a></a>;
browser.link(:text, "test1").click,点击一个链接
browser .link(:index, 1).href,查看一个链接的地址

l
table,对应HTML标签如下,<table>为表格定义开始,<tr></tr>定义一个行,<td></td>定义一个为列,一行里面可以包含多个列即<td></td>。
<table>
<tr>
<td>Row 1 Col1
<tr></table>
t=browser.table(:id, 'ext-comp-1004') ,找到一个表格

t.rows.each do|h| ,使用循环遍历表格的每一个行,每一个行有h表示,do是RUBY基本的语法,可以参考循环语句,而此时h变量是一个属组,如果想找到这一行的第一列可以h来找到。如果不使用循环语句进行遍历行,也可以使用而为属组的形式直接找到相应的行和列,例如t,找到的是表格的第一行第一列。
l
div,对应HTML标签<div></div>,DIV通常与CSS使用,DIV标签可以把文档分割为独立的、不同的部分。它可以用作严格的组织工具,并且不使用任何格式与其关联。
browser .div(:id,"ext-gen21"),找到相应的DIV。
l
如果用 id 或 class 来标记<div>,那么该标签的作用会变得更加有效。在使用CSS来定义样式。然后DIV中CLASS指定包括的代码段是属于那个样式。iframe,对应HTML<iframe></iframe>:HTML中frame将页面进行分割,每个分割后的框是一个完整的html。
browser.frame(:id,"usredit_Frame") 找到相应的framel
contains_text:
browser. contains_text(“abc”),这个函数功能是在当前整个页面寻找是否存在abc这个字段。
l
fire_event,用这个函数可以触发事件以及SCRIPE脚本
browser.div(:id,1).fire_even(“onmousedown”),这个DIV有一个鼠标事件,但是DIV的属性与button以及click不一样,所以这个地方只能调用DIV提供的鼠标事件。
以上每个组件在页面内的使用方式以及标签属性都通过HTML页面来定义,有些属性可能不存在id,name等属性。

ryugun 发表于 2012-5-2 10:54:23

1
XX项目WATIR使用举例1.1
查询组件对WEB界面操作,找到需要操作的组件是很重要的。找到组件之后才能根据组件的属性进行设置或者查询。由于WATIR在获取到一个界面时,会将这个界面所有的信息封装到一个对象里面,根据面向对象的思路,就可以找到组件。(1)
因为组件的属性有id,name,value,xpath,如果要获取组件有明确的id,name,value,xpath等树形。那么根据属性的唯一标识直接找到这个组件,从而对组件进行操作。使用IE.start启动页面,这个函数以对象返回该页面HTML的树形结构,如果此时操作中变换到其他页面,browser这个对象值也会跟着改变。browser =Watir::IE.start("http://www.baidu.com”)browser.button(:id,”submit”),这样就可以找到ID为submit的组件了。同样name,value,xpath只需要改变“:”后面的定义就可以了,其中XPATH前面介绍过任何一个组件都可以通过XPATH形式进行查找。(2)
WATIR语法返回一个属性结构,在查找一个节点时可以从他的根节点一层一层的向下索引,这种方式对于组件ID自动生成有很好的效果,虽然组件存在ID,但是根据不同的情况该ID会变更,但是HTML节点位置是不会改变的,所以对于处理组件ID动态变更情况可以使用该种方法。例如:
<div id=”test”><div>
aaa</div> <div>
<Ahref=”www.baidu.com”>baidu</A></div></div>根据以上这个例子如果想找到baidu的超级链接并点击超级链接进入baidu页面,通过ID,name的方法是无法获取到。可以使用两种方法,一种是由于这个页面只有一个超级连接,所以只用index号为1找到这个链接:browser.link(:index,1).click另外一种是可以根树形结构一层一层向下查找,通过对界面观察,可以找到与元素相近的根也就是id为test的div,这个div对象下面包含两个div,由于两个div都没有参数,所以这里使用index号找到第二个div标签,然后根据链接的index号找到链接。browser.div(:id,”test”).div(:index,2).link(:index,1).click

ryugun 发表于 2012-5-2 10:55:54

(1)
由于有些组件没有id,name等唯一标识这种情况下可以使用XPATH这个参数找到组件,看似复杂的语法,但是在FIREFOX中有插件可以直接找到组件对应的XPATH。使用XPATH查询组件曾经有一个问题是随着网页的变化组件的XPATH可能会更改。在XX项目自动化中很少使用该种进行查找。

ryugun 发表于 2012-5-2 10:57:40

路径表达式:
表达式
描述

nodename选取此节点的所有子节点。

/从根节点选取。

//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

.选取当前节点。

..选取当前节点的父节点。

@选取属性。

ryugun 发表于 2012-5-2 10:58:27

实例:
路径表达式
结果

/bookstore/book选取属于 bookstore 子元素的第一个 book 元素。

/bookstore/book选取属于 bookstore 子元素的最后一个 book 元素。

/bookstore/book选取属于 bookstore 子元素的倒数第二个 book 元素。

/bookstore/book选取最前面的两个属于 bookstore 元素的子元素的 book 元素。

//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。

ryugun 发表于 2012-5-2 10:58:59

实例:
路径表达式
结果

/bookstore/book选取属于 bookstore 子元素的第一个 book 元素。

/bookstore/book选取属于 bookstore 子元素的最后一个 book 元素。

/bookstore/book选取属于 bookstore 子元素的倒数第二个 book 元素。

/bookstore/book选取最前面的两个属于 bookstore 元素的子元素的 book 元素。

//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。

ryugun 发表于 2012-5-2 10:59:13


//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。

/bookstore/book选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。

/bookstore/book/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

ryugun 发表于 2012-5-2 10:59:45

1.1
表格内组件查询、触发javascripe事件有很多情况下表格不会单独只有数据,可能在表格内存在复选框,按钮,超级链接等组件。在这种情况下的组件通常没有ID或者ID会根据其他参数有所改变。这样在给自动化处理上就带来一些难度。如下图所示,mliu为创建的一个命名空间,如果想删除这个命名空间就一定要点击前面的复选框。
下图所示为插件显示该组件的信息,可以发现这个“复选框”实际上是一个div的,并不是checkbox,但是界面通过css样式的形式具有checkbox的功能。这个div并没有id,name等属性。
这种情况下由于每次操作的表格项不一样,所以需要逐条循环。选择“名称”为mliu的行,并找到第一列的元素,到这里找到了一个<TD>。这个<TD>下面包含一个div(上图左面红色部分),根据index号这样就找到了这个文本框。但是此时又有一个问题出现了,这个图形表现是一个复选框,但是从HTML来看只是一个DIV,那么他就不具有checkbox的功能和动作。如果是一个简单的checkbox,可以使用set方法将这个checkbox选中。从右图红色标识可以看到这个DIV存在一个”onmousedown”的鼠标事件,那么勾选的动作是通过这个鼠标实现触发的。所以找到这个div之后需要调用fire_even(“onmousedown”)这个函数触发鼠标事件,这样这个元素就勾选上了。t=ie.table(:id,"namespaceGrid")
t.rows.each do|h|

if h.text.strip ==
"mliu"
h.div(:index,1).fire_event("onmousedown")
break
end
end另外,在确定查找某行或者某列时,一定要观察好这个表格的结构。有可能对外显示的是3行5列,但是实际上在HTML有一些隐藏的行和列,所以要看好元素真正的行和列,否则会查找失败,脚本报错。

ryugun 发表于 2012-5-2 11:00:25

1.1
frame的使用对于在复杂的WEB界面,其实是有很多个独立的HTML组成的,把这些独立的HTML组成在一起的是<iframe>标签。在查找一个组件时一定不要被界面的“外表”所蒙蔽,有可能这个组件在某一个frame中。所以当使用IE.start或者IE.attch找到一个页面时,首先要分析这个页面显示的结构,如果要是存在多个<iframe>标签,要找到所查找组件是否在哪个frame中,然后再按照3.1的方式进行查找组件。例如下面这段代码中,是一个frame中嵌套另外一个frame,所以要索引到baidu的超级链接,不能通过ie.link(:index,1)的方式查找,必须要找到这个超级链接所对应的页面后,才能找到元素,根据下面代码也可以知道,每个iframe内嵌套了一个完成的HTML,所以要使用ie.frame(:id,”a1”),frame(:id,”namespace”).link(:index,1).click,这样就能找到这个超级链接了。
<html>
<iframe id=”a1”>
<html>
<iframe id=”namespace”>
<html>
<ahref=”www.baidu.com”>baidu</a></html>
</iframe>
<html>
</iframe>
</html>2
经验总结、对规范的建议等在对WATIR自动化开发过程中,还是有一些问题现在WATIR解决不了,应该是WATIR之后的最新的版本不支持这种情况。1、
例如对于class_name这个属性如果存在两个值之间用空格隔开的情况,只能获取到class_name值的第一个值,空格后面的值就获取不到。这个应该是WATIR不支持多个class_name情况。对于FLEX、FLASE等无法使用WATIR进行RUBY自动化,所以对于新版本ISM的用户管理选择管理资源这个功能现在无法实现。

ryugun 发表于 2012-5-2 20:44:17

ryugun 发表于 2012-5-2 21:38:14

ryugun 发表于 2012-5-3 21:52:42

ryugun 发表于 2012-5-3 21:57:30

http://watij.sourceforge.net/docs/api/index.html?watij/IE.html
watij API

xindexiaoxu 发表于 2012-5-3 22:11:07

感谢分享

ryugun 发表于 2012-5-10 13:50:24

http://www.51testing.com/html/45/n-813345.html
浅析Java web程序之客户端和服务器端交互原理
页: 1 2 3 4 [5] 6
查看完整版本: 自己收集的一些资料,41楼贴上自己写的基于selenium的自动化框架相关的代码