“我实在受不了,这糟糕的速度,可恶的内存使用量,调试信息乱跑......”。某天我的组员,跑过来跟我诉说QTP脚本编写的缺点。是啊,当初小规模使用QTP时,发现他确实起到了很好的回归测试作用,而当一个模块的脚本代码达到10000多条,所交互的系统有三至四个时,QTP脚本的开发时间和调试时间就呈指数增长,尤其是调用外部函数时,一个小小的错误,也许会花你半天的时间去找。更可恶的是,当你把脚本调试OK运行后,大量的数据测试时,QTP运行的速度之慢,也常常考验人类耐心的极点。这时,我往往就想换掉这个工具,转向其它工具或开源框架上。也许是上天的怜惜,一次很偶然的机会看到WatiN框架的介绍,简单的实施、开源的代码以及c#.net语言的开发环境,让我顿感亲切和惊喜。
WatiN框架的介绍网上很多,但有关使用的实例大都是转过来转过去的文章,这也给学习上带来了一些困难。一步步的来,在网上浏览了许多信息,当然大部分是E文,自己也尝试做了一个系统的冒烟测试的脚本(大概200多条用例),其中艰辛,就不说了,到此总算知道了一些粗略的使用皮毛。刚好,最近又有一个系统要进行测试,打开一看登录界面,上帝的灵感再一次闪现,我何必不用WatiN做一个万能的登录测试程序呢?顺便实践一下总结后使用WatiN的方法,于是几日之后了这个程序,本着分享好东西的精神,几日之后就有了这篇文章。
废话就不说了,开始进入正题吧。我们公司所测的系统大部分是Web程序,且所有系统的登录界面均类似于下图(1)和图(2)所示,所有提示信息都是在页面内,所有系统用户名的ID、密码的ID、验证码的ID均相同,且所有系统均要求在IE6、7、8,FireFox3.x上面能够等到正确执行。
图(1)
图(2)
再来看看登录的常规测试用例有:(1)用户名、密码、验证码为空;(2)用户名、密码、验证码插入空格(空格的形式有全半角/URL和HTML编码的空格);(3)用户名、密码、验证码大小写转换;(4)用户名、验证码转换;用户名、密码、验证码最长登录;(5)用户名、密码、验证码最短登录;(6)用户名、密码、验证码大小写;重置功能;(7)用户名、密码、验证码为JS编码(系统中不存在该用户名);(8)用户名、密码、验证码其它数据(这些数据可能是系统产生的)。
我们要做的是一个适合大多数系统的测试界面,所以我们需要一个表来表现这些用例,并储存这些测试数据,我们每次需要做的也就是更换这些数据并以此来进行测试。在这里我选择Excel表,因为他简洁所以就选它了。首先由于后面的代码读取Excel表中的数据的方式是通过数据库方式读取的,所以选用Excel2003版本,如果是其它版本请另存为2003版本。如果要用2007的版本或其它版本,也是可以的,只是你不能用数据库方式读取Excel中的数据而已,当然读取方式也可以是其它的,动动手指头网络上有,在此就不说了。
……………………
查看全文请点击下载:http://www.51testing.com/html/39/n-234539.html
好吧,准备工作我们已经完成了,接下来就让我们开启WatiN自动化之路。一共大概分为四个步骤来实现此程序,首先创建一个类用于管理页面中的控件和基本过程;其次创建一个类用于根据用户设置相应的属性来选择所使用的浏览器并调用管理类中的基本过程;再次创建一个类于用读入Excel中的测试数据和记录测试结果到Excel表中;最后在Form1.cs类中实现测试的方法。其具体过程和代码以及代码的解释见下面的介绍。
1、首先在Vs2005(WatiN支持net2.0、net3.5、net4.0)新建一个Windows应用程序的工程,完成上面的界面设计,并将WatiN提供的Interop.SHDocVw.dll和WatiN.Core.dll引入到此工程中。
2、新建一个LoginPage类,该类继承Page类,并在此类中管理页面中控件和登录的基本过程,有关特性的使用和方法代码里已做叙述,在此不再做解释。
//需要引入以下命名空间 usingWatiN.Core;//for WatiN usingSHDocVw;//for WatiN usingSystem.Windows.Forms; //MessageBox //派生Page类,用于管理页面中控件,和基本方法 [Page(UrlRegex ="http://10.9.10.22:*")] publicclassLoginPage:Page { //使用特性的方法来构建 //用户名 [FindBy(IdRegex ="LoginName")] publicTextFieldLoginName; //密码 [FindBy(IdRegex ="LoginPass")] publicTextFieldPassWord; //验证码 [FindBy(IdRegex ="LoginVod")] publicTextFieldCheckVod; //登录按钮 [FindBy(IdRegex ="login")] publicButtonClickLogin; //登录按钮 [FindBy(IdRegex ="cancle")] publicButtonClickCancle; ///<summary> ///登录方法 ///</summary> ///<param name="u">用户名</param> ///<param name="p">密码</param> ///<param name="v">验证码</param> |
{
try
{
LoginName.Value = u;
PassWord.Value = p;
CheckVod.Value = v;
ClickLogin.ClickNoWait();
}
catch (Exception e)
{
//Console.WriteLine(e.ToString());
MessageBox.Show(e.ToString());
}
}//end登录方法
}
3、新建一个TestMain类,并根据用户设置相应的属性来选择所使用的浏览器并调用LoginPage类中的Login(string u,string p,string v)方法,返回实现的情况, 有关属性的定义和方法,代码里已做叙述,在此不再做解释
……………………
查看全文请点击下载:http://www.51testing.com/html/39/n-234539.html
4、新建一个类ReadData,用于读取Excel中的数据,注意数据库链接字符串中"Excel 8.0;HDR=False;IMEX=1",IMEX=0表示写入,1为读取,2为Linked模式(需要完全更新时使用)。另外,Excel8.0并不是直接指代测试机器上的Excel的版本号,而是指已安装Jet数据库ISAM的版本号。可通过查看注册表HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Jet\4.0\ISAM Formats的注册值来检查机器上的版本号。
using System.Windows.Forms; using System.Data.OleDb; using System.Data; using System.IO; class ReadData { //Excel所处的位置 string fileName; public string FileName { set { fileName = value; } get { return fileName; } } /// <summary> /// 读取Excel中的数据 /// </summary> /// <param name="myTable">表名,即sheet名</param> /// <param name="myColName">列名</param> /// <param name="IRow">行</param> /// <param name="ICol">列</param> /// <returns>string</returns> public string ReadExcelData(string myTable,string myColName,int IRow,int ICol) { try { //读取时使用IMEX=1 string returnValue=""; string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+fileName+";Extended Properties='Excel 8.0;HDR=False;IMEX=1'"; OleDbConnection conn = new OleDbConnection(connStr); string selectValue = "select " + myColName + " from [" + myTable + "$]"; OleDbDataAdapter oda = new OleDbDataAdapter(selectValue, conn); DataSet ds = new DataSet(); oda.Fill(ds, myTable); conn.Close(); conn.Dispose(); returnValue=ds.Tables[0].Rows[IRow][ICol].ToString(); return returnValue; } catch (Exception e) { MessageBox.Show("连结Excel数据库后出现异常:"+e.ToString()); return null; } }//end 读取Excel表中的数据 /// <summary> /// 向Excel中写入字符 /// </summary> /// <param name="mytable">表名</param> /// <param name="passName">列名</param> /// <param name="id">ID号</param> /// <param name="insertStr">要插入的字符</param> public void writeExcel(string mytable, string passName, string id,string insertStr) { try { //写入时使用IMEX=0 string connnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties='Excel 8.0;HDR=False;IMEX=0'"; OleDbConnection conn = new OleDbConnection(connnStr); conn.Open(); OleDbCommand cmd = new OleDbCommand(); cmd.Connection = conn; cmd.CommandText = "update [" + mytable + "$] set " + passName + "='" + insertStr + "' where TestID='" + id + "'"; cmd.ExecuteNonQuery(); conn.Close(); conn.Dispose(); } catch (Exception e) { MessageBox.Show("连结Excel数据库后出现异常:" + e.ToString()); } }//end 写入Excel表 } |
……