版本号 V1.0 日期 2017.05.05 编写者 质量管理部 审核者 描述 初版 1. Ranorex特色 .................................................................. 2. Ranorex自定义Action.......................................................... 3. Ranorex的其他编辑选项 ........................................................
3.1. 添加新的Action ......................................................... 3.2. Action条目失败继续运行和禁用 ........................................... 3.3. 增加对象库识别对象...................................................... 4. Ranorex自定义常用代码 ........................................................
4.1. 自动测试途中强制一个用例失败退出........................................ 4.2. 抓图及比较图片.......................................................... 5. Ranorex创建代码模块 ..........................................................
5.1. 在代码模块中使用对象库.................................................. 5.2. 代码中实现读取文本文件的内容............................................ 5.3. 代码中获取数据库信息.................................................... 6. Ranorex测试Andr??oid App.....................................................
6.1. Android的测试环境 ......................................................
服务App ................................................................. 6.2. 部署APP到测试设备...................................................... 6.3. 录制Andr??oid应用测试.................................................. 7. 问题集........................................................................
7.1. 参数化录入,多次循环录入的实现..........................................
7.2. 数据库应用相关..........................................................
配置ODBC ............................................................... 引入命名空间............................................................ 数据库查询SQL的调用.................................................... 数据库增、删、改的调用.................................................. 有参数的存储过程的调用.................................................. 调用只有单个结果返回SQL的应用..........................................
1. Ranorex特色
Ranorex相对于QTP、RFT等老牌自动化测试工具而言是一个后来者,也就是最近这些年才冒出来的,但是也在逐渐地发展起来,也有很多自己的特色,更详细的介绍请登录官网了解() 例如:
1、支持以自动化库的形式供C#、VB.NET调用,让我们可以采用这些标准的编程语言,而不是厂商脚
本语言来进行自动化测试代码的开发,支持在VS.NET等IDE中进行自动化脚本开发。
2、支持用XPath来识别GUI元素,验证状态和值、过滤信息等。 3、价格优势€ 1,190.00 ;Ranorex支持多种语言和平台的测试:
.NET, WPF (framework versions 1.1, 2.0, 3.5) Win32 applications (MFC, Delphi)
Support for 3rd party controls like Infragistics, DevExpress, QT, etc. Java SWT applications
Web Testing, Adobe Flash/Flex Testing 安卓及IOS的应用测试;
2. Ranorex自定义Action
在《ranorex自动化测试框架简介-铭鸿.pptx》,我们提到数据驱动接口测试,Recorder模块中可以使用变量,而不是一直使用录制过程中的固定字符串值。在Action表内的单元格中,任何你可以改变或者设置值的地方,在那里都可以使用变量。当某天发现这样的数据驱动
已经不能满足你的测试需求了,还能有更强大的功能吗?
答案是肯定的,在Recorder提供的功能不能够满足的情况下,Ranorex可以使用自定义代码。 下面的一些例子,可以方便演示自定义代码Action。在项目视图窗口中,仔细看一个录制模块文件,你会看到有两个相关的代码文件。
以上制模块‘SayHello’有两个代码文件,在Ranorex Studio每个录制模块都对应两种类型的源代码文件:
自动生成的主录制模块的源代码文件 每次你更改并保存录制模块,主代码文件‘SayHello.cs’就会重新生成一次。如果需要修改代码一定要在‘SayHello .UserCode.cs’文件中进行。 创建自定义代码Action 你可以,通过转换现有的action创建用户自定义代码Action,或通过工具栏按钮'Add New Action'增加一个新的“用户自定义代码”Action条目。 2.1、转换为用户自定义的代码 在录制模块中,选取第4步,鼠标右键打开菜单,选取‘convert to user code’。输入一个自定义的函数名字即可。(也可以为自定义函数增加参数) 现在可以通过右击Action,从右键菜单中选择'View Code'跳转到生成的代码。 自Ranorex3.3开始,就可以在自定义代码Action使用参数。 可以通过(字符串)值向方法传递,这样就能在测试环境中获得更大的灵活性。要在一个新的自定义代码Action中使用参数,只需按一下旁边的单元格中键入一个值作为方法的参数(如‘VSayHelloPara’)。 例如增加以下代码, //将输入焦点放入TextBox框内 r //设置TextBox的值为空 这样每次TextBox的内容就是你最近一次的输入了。 截图如下: 3. Ranorex的其他编辑选项 我们已经了解到Recorder通常是用来记录用户action的。录制完成后,可能需要编辑录 制的数据,例如合并被分割的键盘录入、删除错误记录的Action及自定义Action。 你还可以添加新的Action,例如像添加一个验证步骤,或在录制过程中没考虑到的Action。 3.1. 添加新的Action 在Action表中,有两种手动添加action的方式。 一种方法是指定Action本身('添加新Action'),然后分配对应的对象库条目(在多数情况下)。 第二种方法是直接把对象库条目拖放到Action表内,然后生成action。 使用'Add New Action'按钮添加一个新的Action条目,打开'Add New Action'下拉菜 单,如下图所示: 拖放对象库中的对象来启动添加一个新的Action,如下面图所示,你也可以把对象库 条目拖放到Action表中创建新的一行。 下图:使用拖放为特定的对象库条目创建一个新的Action(Report –ScreenShot) 拖放对象到action表中后,会提示指定Action类型。 更多可用的action信息,请参阅下面信息 Action条目的类型 Mouse 在当前位置添加一个新的鼠标action条目 Mouse Wheel 添加一个新的鼠标滚轮Action条目 Touch Event 在当前位置添加一个新的触摸事件Action条目 Key Shortcut 添加一个新的快捷键action条目(例如'Ctrl + C'或'Ctrl + V') Key Sequence 添加一个新的键盘输入action条目(例如'Hello') Open Browser 打开一个浏览器并导航到指定的URL Run Application 运行指定路径的应用程序 Report 添加一个新的报告Action条目 Delay 添加一个新的延时Action条目 Screenshot:这个Action将一个特定的对象库条目的截图和用户定义的文本输出到测试报告中。 如果没有分配对象库条目,那么会对整个桌面截图。 User Code 这是用来添加一个新的自定义代码Action条目,例如实现用户特定的验证代码 3.2. Action条目失败继续运行和禁用 表中列出的每个Action条目,都可以设置为禁用或 “失败继续运行”。 设置action条目为“失败继续运行”时,如果遇到错误,模块不会停在那个位置,而是继续执行。 可以通过右键菜单或属性窗口设置这两个选项。 设置为“失败继续运行的条目在Action表中以斜体表示,而禁用的Action条目显示为灰色。 上图:禁用的Action是灰色的,而“失败继续运行'Action以斜体字体表示,对应的步骤有“[ ]”标记。 3.3. 增加对象库识别对象 在项目视图,找到对象库,打开后,点击‘Track’。就可以为对象库增加可识别的对象了。 将Ranorex识别对象红色框,放在需要识别的对象上点击鼠标,相关可识别的对象就会增加到项目的对象库中。 下图是增加的可识别对象截图: 4. Ranorex自定义常用代码 4.1. 自动测试途中强制一个用例失败退出 Ranorex使用异常处理来决定一个测试用例是失败还是成功。只要所有的ranorex方法都没有抛出异常,测试将会成功。如果你想自己决定是否一个测试用例失败,你需要在测试用例自动测试途中抛出Ranorex异常强制这个测试用例失败。再次看看以下用例: 在Ranorex使用自定义代码如下: 在跑以上测试用例时,如果我们遇上返回的结果没有“Hello”字符时,就会终止测试用例,返回一个带错误标记的测试报告。 例程代码: { Report.Success(\"返回成功\" ,\"结果信息包含Hello字符\"); } else{ throw new Ranorex.RanorexException(\"返回失败 ,结果找不到 Hello 字符\"); 4.2. 抓图及比较图片 在该章节中,我们将会获知Ranorex如何获取对象的位图,如何用对象的位图和系统中的位图进行比较了。其实图片的比较是大多数GUI自动测试都会涉及到的内容,Ranorex提供了很多强大的功能,这里我们还是先从最最基本的位图截图及比较开始吧。 我们依然使用小程序SimpleGUI.exe作为待测应用。建立一个全新的c#测试项目,然后将SimpleGUI.exe上右侧的两个按钮(ColorBtn, ChangeColorBtn)的动作,录制捕获后放到对象库中。然后创建一个用户自定义Action(CompareImg)如下图: 编写以下代码: 这几行代码,我们首先生成了一个名为BmColorBtn的Bitmap对象,它使用Imaging类的方法CaptureImage来获得对象‘ColorBtn’位图数据,接下来直接使用save函数,保存这个位图数据为一个位图文件RanoRexRes.bmp存放到D盘根目录下,这样就完成了某个控件的抓图了,非常简便快捷。 接下来,点击了ChangeColorBtn这个按钮,这时ColorBtn这个控件上的颜色发生了变化,我们将此时的ColorBtn的位图与刚刚保存好的位图BmColorBtn进行比较(这里是比较内存的内容),允许的冗余是10%,也就是说只要两幅位图的内容相似程度高于或者等于90%就认为对比通过,否则Validate类会报错,其实这个结果是我们可以预知一定是以下报告的结果了。 附上代码: public void CompareImg() { BmColorBtn.Save(\"D:/RanorexRes.bmp\"); Imaging.FindOptions myFindOptions = new Imaging.FindOptions(0.90); } 报告截图: 其实从这个例子,我们可以猜测出Ranorex如何加载硬盘里的图片进行比较的用例,大家尝试一下。 5. Ranorex创建代码模块 5.1. 在代码模块中使用对象库 Ranorex可以完全按自定义的流程去组建测试用例,这个时候你需求用到代码模块了。大家可以通过点击工具栏上的'Add Code Module'按钮,创建一个新的代码模块。 输入代码模块的名称,点击“创建”按钮后,项目中会自动添加一个新的文件,并且在文件视图中自动打开。Ranorex Studio会创建一个新的测试模块类,它包含一个“Run”的方法,可以用来进行扩展自动化测试代码。 在代码模块中使用对象库跟你在录制模式下使用对象库识别对象一样,你也可以在你的代码中使用录制时候识别的对象库。只需在代码模块的初始化定义处,添加一个新的成员代表你的对象库,如下所示: 然后就可以在Run函数模块内,自由地通过代码控制测试的流程了。 void ITestModule.Run() { Mouse.DefaultMoveTime = 300; Keyboard.DefaultKeyPressTime = 100; Delay.SpeedFactor = 1.0; Mypro.SimpleGUI.Text.TextValue =\"广东铭鸿数据有限公司\"; Mypro.SimpleGUI.SayBtn.Click(); } 5.2. 代码中实现读取文本文件的内容 Ranorex没有自己的脚本语言,其代码的实现完全与C#或VB一致。以下以C#语言为例: //读取E盘java_out目录下的文件。(以Windows默认的编码方式)放入一个line的string数组内。 string[] line= File.ReadAllLines(@\"E:\\java_out\\ 1009 记账卡客户资料管理\\TestCase.txt\ //循环地处理string数组内的信息,将文件内的每一行信息提取到StrTemp变量中。用户再自行处理//StrTemp变量的数值 for (int i = 0; i < line.Length; i++) string StrTemp=line[i] ; 备注:需要在代码模块中增加引用包 using System.IO; 5.3. 代码中获取数据库信息 Ranorex可以C#语言以ODBC的方式连接数据库,以获取数据库信息,另测试用例更灵活; //Sybase 参考代码 string odbcstr =\"Dsn=ytk;uid=ytk_test;pwd=CStest\"; string ResultStr =\"\"; OdbcConnection conn=new OdbcConnection(odbcstr); OdbcDataReader ocReader =null; try { conn.Open(); Report.Info(\"数据库连接成功:\"); OdbcCommand oc=new OdbcCommand(); oc.Connection =conn; oc.CommandText =\"select * from card_inlet_info \"; ocReader =oc.ExecuteReader(); while (ocReader.Read()) { string res_temp = ocReader.GetString(0) + ocReader.GetString(1) +ocReader[\"s_license_hex\"].ToString()+\";\"; ResultStr +=res_temp; } conn.Close(); Report.Info(\"数据库连接成功:\"+ResultStr); } catch (Exception e){ Report.Error(\"数据库连接失败\"); } //Oracle 范例 string odbcstr =\"DSN=GZCS;Uid=acc_st;Pwd=acc_st;\"; string ResultStr =\"\"; OdbcConnection conn = new OdbcConnection(odbcstr); OdbcDataReader ocReader =null; try { conn.Open(); OdbcCommand oc=new OdbcCommand(); oc.Connection =conn; oc.CommandText =\"select * from op_prm_station where record_flag=\\'0\\'\"; ocReader =oc.ExecuteReader(); while (ocReader.Read()) { string res_temp = ocReader.GetString(0) + ocReader.GetString(1) + ocReader[\"chinese_name\"].ToString()+\";\"; ResultStr +=res_temp; } conn.Close(); Report.Info(\"数据库连接成功:\"+ResultStr); } catch (Exception e){ Report.Error(\"数据库连接失败\"); } 备注:需要在代码模块中增加引用包 6. Ranorex测试Andr??oid App 自动化测试Andr??oid App,需要先搭建Android的测试环境,然后再创建和执行一个测试。 6.1. Android的测试环境 Android自动化测试环境,只需要确保被测系统(移动设备)和运行测试的电脑 (Ranorex安装的机器)是在同一网段的一个网络中即可。通过Wifi连接是最简单的测试连接方式。见下图: 图:通过Wi-Fi自动化测试Android App 6.1.1. Ranorex服务App 被测系统(Andr??oid移动设备)需要确保安装了Ranorex服务App。我们先来安装一下APP,在一个新的录制模块中,点击录制 按钮,选取Mobile。 在打开的对话框中,点击‘Add device…’ 在Manage Devices对话框选取‘add’,然后选取‘Android’-【Next】-选取‘NetWork’点击【Next】,通过使用二维码阅读器程序来扫描二维码,或通过输入说明中的URL,就可以下载Ranorex服务App并安装到被测的移动设备上。 下载并安装后,安装了Ranorex服务App的设备,就可以通过”Network”连接在列表中被看到,选择该设备,并点击“添加”按钮。 以下截图表明已经配置好And??r??oid设备,测试环境已经搭建成功了。 6.2. 部署APP到测试设备 测试环境配置好后,就可以将要进行自动化测试的App调制部署到设备上。参考上一节,找到【Add app…】页面。如下图:(请确保您的机器上已经安装了JRE 1.6或1.7 ) 点击【Add app…】按钮。选择好APK文件,Ranorex会自动调制到选定的设备上,详见下图。 上图为调制过程,当完成调制后,APP将在移动设备上安装。下面的截图为APK安装时要进行的确认。 在移动设备安装好App后,点击【Finish】按钮。 6.3. 录制Andr??oid应用测试 准备好设备,并调制好APK后,,选择对应的设备以及要执行的App,就可以开始录制 了。 当你点击录制按钮时,刚才调制在移动设备上的App将自动运行,并在录制机器桌面上弹出通知,告之用户移动设备上的操作将被录制。 在录制过程中,Ranorex的Action表将清晰得显示已执行的步骤,并且是实时更新。 在移动设备上进行测试后,可以按下“停止”按钮停止录制过程。录制并修改Action表之后,按下“运行”按钮,这样就能在移动设备上执行测试。 7. 问题集 7.1. 参数化录入,多次循环录入的实现 问题:Ranorex录制后,有多个字段的数据,这些数据要求按照某个表格的数据进行输入,这个哪里设置怎么设置?而且这些字段的值不能与上一条记录重复的,此处,需要写脚本做循环吗? 回复:字段按照某个表格的数据进行输入,可以通过参数化实现,Ranorex叫做数据源。它是在TestSuite模块实现的。以下举个例子: 在乌市轨道系统,需要增加票卡主类型这个参数,页面截图如下: 其主类型ID与票卡名称需要参数化,并可以循环增加多个字段。实现步骤如下: 1、录制增加票卡类型的整个操作;截图如下 2、增加需要参数化的变量;截图如下: 按照以上三幅截图,增加两个变量VarCardTpe,VarCardNam。如下图: 3、编辑一个Excel文本(保存为“namestr.xlsx”)。如下图: 4、在Ranorex的Suite模块内,选定某一个测试用例(TestCase),点击“Data source…” 选取第3步编辑好的Excel文件。 点击OK后,程序的界面出现以下信息,表示这个测试用例将自动按数据源的数量循环执行4次。 5、变量有了,数据源也设置好了,现在需要的绑定变量。在点击相应的“DataSource..”按钮,将弹出数据源设置页面,点击“DataBinding”,按照以下截图设置。 以上步骤即可以完成了。Ranorex目前可以支持4种数据源格式:简单表格、CSV、Excel及ODBC等。 使用数据源、参数化录入特别需要注意自动化输入的信息要在一个单独的事务中进行。上面的例子由于事务含登录操作,那这个自动化时,将发现不断地打开新的页面,输入登录信息及增加参数等操作。实际应用中需要多加注意。 7.2. 数据库应用相关 问题:Ranorex可以连接数据库进行相关的操作吗? 回复:是可以的; 7.2.1. 配置ODBC 需要确保系统的ODBC配置正确;以下为Oracle配置成功的截图 7.2.2. 引入命名空间 在相应的模块引入命名空间,令代码可以使用C#的数据库相关函数; 7.2.3. 数据库查询SQL的调用 ODBC的配置如下: 要获取车站配置表某些字段的信息,代码如下: string odbcstr =\"Dsn=WUMQCS;uid=w_acc_st;pwd=w_acc_st\"; string ResultStr =\"\"; OdbcConnection conn=new OdbcConnection(odbcstr); OdbcDataReader ocReader =null; try { conn.Open(); Report.Info(\"数据库连接成功:\"); OdbcCommand oc=new OdbcCommand(); oc.Connection =conn; string SqlStr =\"0\"; oc.CommandText =\"SELECT t.* FROM w_op_prm_station t where t.record_flag ='\"+SqlStr+\"'\"; ocReader =oc.ExecuteReader(); while (ocReader.Read()) { string res_temp = ocReader.GetString(0) + ocReader.GetString(1) + ocReader[\"chinese_name\"].ToString()+\";/r/n\"; ResultStr +=res_temp; } conn.Close(); Report.Info(\"数据库连接成功:\"+ResultStr); } catch { Report.Error(\"数据库连接失败\"); } 7.2.4. 数据库增、删、改的调用 这些不用获取返回值的SQL执行见下面代码: string Strtemp =\"\"; string odbcstr =\"Dsn=WUMQCS;uid=w_acc_st;pwd=w_acc_st\"; string ResultStr =\"\"; OdbcConnection conn=new OdbcConnection(odbcstr); OdbcDataReader ocReader =null; try { conn.Open(); OdbcCommand oc=new OdbcCommand(); oc.Connection =conn; oc.CommandText =\"delete FROM w_op_prm_dev_code t where t.record_flag ='3' and t.line_id ='01'\" +\"and t.station_id ='01' and t.dev_type_id ='03' and t.device_id ='001'\"; oc.ExecuteNonQuery(); oc.CommandText =\"commit\"; oc.ExecuteNonQuery(); conn.Close(); Report.Warn(\"数据库删除车站配置成功。\"); } catch { Report.Error(\"数据库连接失败\"); } 7.2.5. 有参数的存储过程的调用 调用存储过程的例子如下: string Strtemp=\"\"; string odbcstr =\"Dsn=WUMQCS;uid=w_acc_st;pwd=w_acc_st\"; //数据源 int vInReturnDay =1; //等待日 1以内 ,2 以外 int vBuRecTyp =1; //业务类型 1非即退 4挂失 int vResult =0; //存储过程返回值 //初始化非即退的申请 (调用的存储过程有4个参数,其中两个是输入、两个是输出) OdbcConnection conn=new OdbcConnection(odbcstr); OdbcDataReader ocReader =null; try { conn.Open(); OdbcCommand oc = new OdbcCommand(\"{call W_ST_CS_NON_RTN(?,?,?,?)}\", conn); oc.CommandType = CommandType.StoredProcedure; //存储过程的输入参数 oc.Parameters.Add(\"InReturnDay\",OdbcType.Int).Direction=ParameterDirection.Input; oc.Parameters[\"InReturnDay\"].Value =vInReturnDay; oc.Parameters.Add(\"BuRecTyp\",OdbcType.Int).Direction=ParameterDirection.Input; oc.Parameters[\"BuRecTyp\"].Value =vBuRecTyp; //存储过程的输出参数 oc.Parameters.Add(\"retCode\", OdbcType.Int).Direction = ParameterDirection.Output; oc.Parameters.Add(\"retMsg\", OdbcType.VarChar,200).Direction = ParameterDirection.Output; oc.ExecuteNonQuery(); conn.Close(); Strtemp = oc.Parameters[\"retCode\"].Value.ToString(); Strtemp += \"Msg:\"+oc.Parameters[\"retMsg\"].Value.ToString(); Report.Info(\"初始化非即退的申请,(在退款等待日以内)完成:\" +Strtemp); } 7.2.6. 调用只有单个结果返回SQL的应用 需要获取某个表的记录数等例程: string Strtemp =\"\"; //数据源 string odbcstr =\"Dsn=WUMQCS;uid=w_acc_tk;pwd=w_acc_tk\"; string ResultStr =\"\"; int RecNum =0; OdbcConnection conn=new OdbcConnection(odbcstr); OdbcDataReader ocReader =null; try { conn.Open(); OdbcCommand oc=new OdbcCommand(); oc.Connection =conn; oc.CommandText =\"select count(*) from w_acc_tk.W_ic_cod_base t \"; try { RecNum= Convert.ToInt32(oc.ExecuteScalar()); } catch { Report.Error(\"数据转换出错了\"); } conn.Close(); } catch { Report.Error(\"数据库连接失败\"); } Report.Warn(\"数据库查询返回记录数:\"+RecNum); 因篇幅问题不能全部显示,请点此查看更多更全内容