在环境搭建那篇文章中,咱们已经部署好了一个环境,本篇文章中咱们将具体介绍功能的使用方法。文章地址:java
http://my.oschina.net/u/2391658/blog/706263node
场景用于组织多个用例,执行时能够以1个用例为单位,即执行一个用例,也能够执行一个场景,即执行多个用例,执行的顺序按建立场景时添加的顺序。删除该场景时,会将该场景下的用例及数据一块儿删除。mysql
建立场景步骤:在首页点击场景管理 -> 新增场景 -> 输入场景名及功能说明 -> 提交便可android
用例是用来组织测试数据,定位信息的(webUI),逻辑代码的。建立用例步骤:ios
首页 -> 用例管理 -> 选择所属场景 -> 输入用例名及用例功能说明 -> 选择用例类型 -> 选择消息发送状态 -> 提交便可。对应的用例类型及消息发送类型的说明,如图:git
管理操做中,可增长业务逻辑代码,添加定位信息,数据等。github
在phoenix_develop工程下开发和调试用例,调试经过后,所有复制,粘贴到用例的执行体中。web
若有如下用例代码:正则表达式
package org.phoenix.cases; import java.util.HashMap; import java.util.LinkedList; import java.util.Map.Entry; import org.phoenix.enums.LocatorType; import org.phoenix.model.CaseLogBean; import org.phoenix.model.InterfaceBatchDataBean; import org.phoenix.model.LocatorBean; import org.phoenix.model.UnitLogBean; import org.phoenix.proxy.ActionProxy; /** * 浏览器驱动测试类: * 通用方法API:phoenix.commonAPI().... * webUI/mobileUI用例API:phoenix.webAPI().... * 接口测试用例API:phoenix.interfaceAPI().... * androidappAPI:phoenix.androidAPI().... * IOSappAPI:phoenix.iosAPI().... * svnClientAPI:phoenix.svnClient().... * ftpClientAPI:phoenix.ftpClient().... * socketClientAPI:phoenix.telnetClient().... * ... * @author mengfeiyang */ public class TestBrowserDriver extends ActionProxy{ private static String caseName = "浏览器驱动测试用例"; public TestBrowserDriver() {} @Override public LinkedList<UnitLogBean> run(CaseLogBean caseLogBean) { init(caseLogBean);//必须有这一步 //phoenix.webAPI().setFirefoxExePath("D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");//使用Firefox浏览器时,必须添加 //phoenix.webAPI().setChromeDriverExePath("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver64.exe");//使用chrome浏览器时,必须添加,且chromedriver64.exe必须和chrome.exe在同一目录下 HashMap<InterfaceBatchDataBean, HashMap<String, String>> datas = phoenix.commonAPI().loadWebCaseDatas(caseName);//加载数据库测试数据方法 HashMap<String,LocatorBean> locators = phoenix.commonAPI().addLocator(caseName);//加载定位信息的方法 for(Entry<InterfaceBatchDataBean, HashMap<String, String>> es : datas.entrySet()){ InterfaceBatchDataBean batchData = es.getKey(); batchData.getExpectData();//这批数据的执行结果指望值 HashMap<String, String> dataBlocks = es.getValue(); String phoenixframe = dataBlocks.get("输入数据1");//在数据库中此数据的key phoenix.webAPI().openNewWindowByFirefox("http://www.baidu.com"); //phoenix.webAPI().openNewWindowByChrome("http://www.baidu.com"); //phoenix.webAPI().openNewWindowByIE("http://www.baidu.com"); //phoenix.webAPI().openNewWindowByHtmlUnit("http://www.baidu.com", true, BrowserVersion.INTERNET_EXPLORER); //phoenix.webAPI().openNewWindowByPhantomJs("http://www.baidu.com"); phoenix.webAPI().webElement("//*[@id=\"kw\"]",LocatorType.XPATH).setText(phoenixframe);//引用数据 phoenix.webAPI().webElement(locators.get("btnLocator").getLocatorData()).click();//使用数据中的定位信息,等同于phoenix.webAPI().webElement("btnLocator").click(); String r = phoenix.webAPI().webElement("//*[@id=\"su\"]", LocatorType.XPATH).getAttribute("value");//数据库中的数据能够与页面不变的数据混合使用 phoenix.checkPoint().checkIsEqual(r, "百度一下");//调用检查点,检查结果会在日志中统计 phoenix.commonAPI().addLog("我是自定义的");//能够手动插入一句日志,该日志会在最后的日志记录中体现 phoenix.webAPI().sleep(1000); phoenix.webAPI().closeWindow(); } return getUnitLog(); } public static void main(String[] args) { LinkedList<UnitLogBean> ll = new TestBrowserDriver().run(new CaseLogBean()); for(UnitLogBean l : ll){ System.out.println(l.getContent()); } } }
所有复制,并粘贴到控制台后如图:sql
过程如图:
批量导入,Excel模版以下:
用例列表界面选择接口用例:
点击数据链接进入数据编辑界面:
支持两种方式为接口用例增长批次数据:
>>1,点击上图的添加数据批次按钮:
>>二、增长完成后如界面:
>>三、点击“修改添加参数”连接,并点击新增参数:
>>四、好比咱们如今测试这样的一个url:http://xxx/x.action?p1=d1&p2=d2 ,添加参数的时候,这样添加:
提交后如:
Tips:此时点击按钮,则会导出一个模版,此模版用于下面的第二种方式。
经过excel准备数据,而后导入的数据库的指定用例下,步骤以下:
>>一、在数据列表界面,点击,界面以下:
相关错误信息提示:
导入成功后,将跳转到指定用例数据的列表页面。
数据导出步骤:
一、 点击按钮,点击时会有“是否确认导出”的提示,若点击取消,则取消导出。若点击确认,则会有“正在处理请求…….”的提示,稍后将会弹出:
二、
点击以上提示框中的连接地址,便可将数据表下载到本地。每次的数据表都是即时生成的,若不下载,点击肯定按钮后,会将服务器上的原副本删除,避免垃圾文件的产生。下载到本地的数据表以下:
在代码中使用批量数据的方式:
package org.phoenix.cases.webservice; import java.io.IOException; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; import org.phoenix.model.CaseLogBean; import org.phoenix.model.InterfaceBatchDataBean; import org.phoenix.model.InterfaceDataBean; import org.phoenix.model.UnitLogBean; import org.phoenix.proxy.ActionProxy; import com.meterware.httpunit.WebResponse; /** * 使用phoenix作接口测试的案例,包括两个:<br> * 一、使用多批数据对一个接口url作测试<br> * 二、不使用多批数据<br> * 若对wsdl形式的接口作测试,则wsdl的文件须要以Dom方式解析。使用WebResponse中的Dom便可。 * @author mengfeiyang * */ public class ContactJieKou extends ActionProxy{ private static String caseName = "接口测试用例"; public ContactJieKou() {} //@Test //使用Jenkins执行此用例的方式,此Test为:org.testng.annotations.Test @Override public LinkedList<UnitLogBean> run(CaseLogBean caseLogBean) { init(caseLogBean); LinkedHashMap<InterfaceBatchDataBean, List<InterfaceDataBean>> datas = phoenix.commonAPI().loadInterfaceDatas(caseName); for(Entry<InterfaceBatchDataBean, List<InterfaceDataBean>> entry : datas.entrySet()){ InterfaceBatchDataBean iBatchBean = entry.getKey(); List<InterfaceDataBean> iDatas = entry.getValue(); System.out.println("--数据批次:"+iBatchBean.getId()+" 指望值:"+iBatchBean.getExpectData()); String url ="http://v.youku.com/player/getPlayList/VideoIDS/XNzUwODY4Nzc2/timezone/+08/version/5/source/video?ctype=10&ev=1&password=&"; for(InterfaceDataBean iData : iDatas)url += iData.getDataName()+"="+iData.getDataContent()+"&"; url = url.substring(0, url.length()-1); WebResponse resp = phoenix.interfaceAPI().getResponseByGet(url); try { //若是接口返回的数据是json格式,则能够经过jsonPath取出实际值,若是不是json则能够本身经过自定义方式如正则表达式等。 String actual = phoenix.interfaceAPI().getJSONValue(resp.getText(), "JSON.data[0].dvd.point[3].title"); //String actual = resp.getElementWithID("su").getText();根据页面中的id,tagName,XPath,Dom等方式取到实际值 String r = phoenix.checkPoint().checkIsEqual(actual, iBatchBean.getExpectData());//检查点结果入库 if(r == null)System.out.println("-----测试经过-----"); } catch (IOException e) { e.printStackTrace(); } } return getUnitLog(); } }
在用例列表界面,点击对应用例的数据连接,便可打开数据编辑界面:
在用例代码中的使用方式:
package org.phoenix.cases; import java.util.HashMap; import java.util.LinkedList; import java.util.Map.Entry; import org.phoenix.action.ActionProxy; import org.phoenix.model.CaseLogBean; import org.phoenix.model.InterfaceBatchDataBean; import org.phoenix.model.UnitLogBean; /** * 使用数据库中的数据进行参数化 * @author mengfeiyang * */ public class TestPhoenixCaseUseDBData extends ActionProxy{ private static String caseName = "消息测试用例"; public TestPhoenixCaseUseDBData() { } @Override public LinkedList<UnitLogBean> run(CaseLogBean caseLogBean) { init(caseName,caseLogBean); /**加载数据库中保存的多个批次数据的方法**/ HashMap<InterfaceBatchDataBean, HashMap<String, String>> datas = phoenix.commonAPI().loadWebCaseDatas(caseName); for(Entry<InterfaceBatchDataBean, HashMap<String, String>> data : datas.entrySet()){ //获取当前批次的指望值及当前批次执行的目标或说明 String expect = data.getKey().getExpectData(); String remark = data.getKey().getRemark(); HashMap<String, String> dataBlocks = data.getValue();//获取数据,并根据数据的名称说明数据的内容 phoenix.webAPI().openNewWindowByIE(dataBlocks.get("输入数据3")); phoenix.webAPI().webElement("set").setText("1111111"); String s = phoenix.webAPI().webElement("click").getAttrValue(dataBlocks.get("输入数据2")); System.out.println(s); phoenix.checkPoint().checkIsEqual(dataBlocks.get("输入数据2"), s); phoenix.webAPI().webElement("click").click(); phoenix.checkPoint().checkIsFalse(s!=null); phoenix.webAPI().sleep(Long.parseLong(dataBlocks.get("输入数据1"))); phoenix.webAPI().closeWindow(); } return getUnitLog(); } }
在启动时,init()方法中的caseName即为用例的名称,平台根据用例的名称加载该用例下的数据,该用例的名称没必要是当前用例名称或id。基于这种方式,能够作到数据的公用,即将该用例的数据能够在其余用例中使用。如有多个数据的批次,可参考:(5)接口测试数据编辑。
也可使用下面这种方式进行参数化,两种方式能够混合使用:
用例在初始化时,即:,会自动将该用例下的数据及定位信息加载。加载以后,就能够在用例脚本中使用了,如图:
同(6)web用例数据编辑,定位信息也能够在多个不一样的用例之间共用。
对cookie,proxy的设置方法实例:
package org.phoenix.cases.webservice; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; import org.apache.commons.io.IOUtils; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.phoenix.model.CaseLogBean; import org.phoenix.model.UnitLogBean; import org.phoenix.proxy.ActionProxy; /** * 使用phoenix作接口测试的案例,:<br> * 设置代理<br> * 若对wsdl形式的接口作测试,则wsdl的文件须要以Dom方式解析。使用WebResponse中的Dom便可。 * @author mengfeiyang * */ public class HostTestByHttpClient extends ActionProxy{ public HostTestByHttpClient() { } @Override public LinkedList<UnitLogBean> run(CaseLogBean caseLogBean) { init(caseLogBean); HashMap<String,String> headers = new HashMap<String,String>(); headers.put("Accept-Language", "Accept-Language: en,zh"); headers.put("Accept-Charset", "Accept-Charset: iso-8859-1"); HttpClient httpClient = phoenix.interfaceAPI().getHttpClientWithProxy("10.138.65.213", 80, "", ""); HttpResponse response = phoenix.interfaceAPI().getResponseByHttpClient(httpClient, "http://trunk.dianjing.e.360.cn", "get", headers); try { System.out.println(Arrays.toString(response.getAllHeaders())); System.out.println(IOUtils.toString(response.getEntity().getContent())); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return getUnitLog(); } public static void main(String[] args) { HostTestByHttpClient yw = new HostTestByHttpClient(); LinkedList<UnitLogBean> ll = yw.run(new CaseLogBean()); for(UnitLogBean l : ll){ System.out.println(l.getContent()); } } }
更多实例请见phoenix_develop工程的:org.phoenix.cases.extendbpool包。
package org.phoenix.cases.extendbpool; import java.sql.ResultSet; import java.util.LinkedList; import org.phoenix.action.WebElementActionProxy; import org.phoenix.extend.druid.DruidUtil; import org.phoenix.model.CaseLogBean; import org.phoenix.model.UnitLogBean; /** * 使用phoenix作接口测试的案例<br> * @author mengfeiyang * */ public class DruidDemo extends WebElementActionProxy{ private static String caseName = "接口测试用例"; public DruidDemo() { } @Override public LinkedList<UnitLogBean> run(CaseLogBean arg0) { init(caseName,arg0); try{ DruidUtil druid = new DruidUtil(); druid.config("jdbc:mysql://localhost:3306/ykstimer?useUnicode=true&characterEncoding=utf-8", "root", "root"); ResultSet rs = druid.getQueryResultSet("select * from t_user where id = '8'"); while(rs.next()){ int level = rs.getInt(2);//根据列编号 String name = rs.getString("name");//根据列名 String password = rs.getString("password");//根据列名 webProxy.checkPoint().checkIsEqual(password, "mfy"); webProxy.checkPoint().checkIsEqual(name, "mfy"); System.out.println(level +" "+name+" "+password); } } catch (Exception e) { e.printStackTrace(); } return getUnitLog(); } }
经过此关系图,能够直观的看到业务用例,测试场景以及测试任务三者之间的关系,而且也能够直观的看到每一个任务的执行状态。经过此树形图也能够直接编辑场景信息和用例,任务信息,免去了查询编辑的过程。
增长任务步骤:首先须要确认已经添加了执行机(执行机管理菜单中可查看)。
在首页点击任务分配 -> 添加任务,任务参数以下图:
任务列表的功能选项说明以下:
(2)详细内容:
在主页面点击场景配置 -> 新增用例 -> 按页面提示输入参数,部分如图,提交后会跳转到性能测试场景列表界面。
在性能测试场景列表页面,点击启动便可。启动后可点击“监控”用以实时监控执行过程。
在性能测试场景列表页面点击“历史”,便可跳转到该用例下全部的执行结果数据,
以上的summary意思是:总共完成了90次迭代,用时61秒,平均每秒1.5次(由于场景中设置了思考时间,因此TPS比较低),最小响应时间是14ms,最大是23ms,总共出错0次,出错率0% 。
在上面界面点击统计图,会列出全部指标统计图,部分以下:
如有多台被监控机,即本次性能测试监控了多台机器,则点击对应机器的IP,便可及时绘制该机器的趋势图。
(1) node节点部署后,可经过如如下地址查看状态:
http://10.16.57.106:8888/phoenix_node/action.do?requestType=getStatus
返回内容为json格式,以下:
{"msg":"当前执行机处于空闲状态","result":1}
代表当前机器为空闲状态。
若是直接访问:http://10.16.57.106:8888/phoenix_node
则能够看到更多详细信息,如:
健康状况自检,硬件自检,数据库链接池自检,servletRequest自检,以及环境的基本信息。如截图:
(2) 若将phoenix_node或phoenix_web部署到了Linux环境下,则须要为如下两个目录添加读写权限,命令:chmod 777 * :
/webapps/phoenix_node/WEB-INF/classes/drivers,
/webapps/phoenix_web/resources/upload,
(3) 默认的数据库链接方式均为root,root:若须要修改,则到classes目录下修改,如node则需修改hibernate.cfg.xml。phoenix_web则需修改:jdbc.properties。如:
(4) 相关用例示例
建立用例时,务必按照规定的代码结构书写,不然会编译不经过。如:webUI的用例代码结构:
接口测试案例:
(1) 平台官网:http://www.cewan.la 或 http://www.phoenixframe.org
(2) Maven:http://mvnrepository.com/search?q=phoenixframe
(3) Github源码:https://www.github.com/phoenixframe
(4) QQ交流群:246776066
(5) 微信号:phoenixframe_2013
(6) 问题反馈:http://www.cewan.la/feedback/
(7) 在Google或百度中搜索:phoenixframe 或 phoenixframework将会获得更多的用例案例和平台相关信息