phoenixframework自动化平台详细使用说明书

原创
2016/07/05 18:41
阅读数 1.5W

在环境搭建那篇文章中,我们已经部署好了一个环境,本篇文章中我们将具体介绍功能的使用方法。文章地址:

http://my.oschina.net/u/2391658/blog/706263

1、  创建测试场景

场景用于组织多个用例,执行时可以以1个用例为单位,即执行一个用例,也可以执行一个场景,即执行多个用例,执行的顺序按创建场景时添加的顺序。删除该场景时,会将该场景下的用例及数据一起删除。

创建场景步骤:在首页点击场景管理 -> 新增场景 -> 输入场景名及功能说明 -> 提交即可

2、  创建用例及数据

(1)增加用例

用例是用来组织测试数据,定位信息的(webUI),逻辑代码的。创建用例步骤:

首页 -> 用例管理 -> 选择所属场景 -> 输入用例名及用例功能说明 -> 选择用例类型 -> 选择消息发送状态 -> 提交即可。对应的用例类型及消息发送类型的说明,如图:

(2)用例列表页面

管理操作中,可增加业务逻辑代码,添加定位信息,数据等。

(3)用例执行体增加

在phoenix_develop工程下开发和调试用例,调试通过后,全部复制,粘贴到用例的执行体中。

如有以下用例代码:

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());
		}
	}
}

全部复制,并粘贴到控制台后如图:

过程如图:

(4)接口测试数据编辑

批量导入,Excel模版如下:

用例列表界面选择接口用例:

点击数据连接进入数据编辑界面:

支持两种方式为接口用例增加批次数据:

4.1 手动输入

>>1,点击上图的添加数据批次按钮:

>>2、增加完成后如界面:

>>3、点击“修改添加参数”链接,并点击新增参数:

>>4、比如我们现在测试这样的一个url:http://xxx/x.action?p1=d1&p2=d2 ,添加参数的时候,这样添加:

提交后如:

Tips:此时点击按钮,则会导出一个模版,此模版用于下面的第二种方式。

4.2 批量导入

通过excel准备数据,然后导入的数据库的指定用例下,步骤如下:

>>1、在数据列表界面,点击,界面如下:

相关错误信息提示:

导入成功后,将跳转到指定用例数据的列表页面。

(5)数据导出

数据导出步骤:

1、  点击按钮,点击时会有“是否确认导出”的提示,若点击取消,则取消导出。若点击确认,则会有“正在处理请求…….”的提示,稍后将会弹出:

2、  

点击以上提示框中的链接地址,即可将数据表下载到本地。每次的数据表都是即时生成的,若不下载,点击确定按钮后,会将服务器上的原副本删除,避免垃圾文件的产生。下载到本地的数据表如下:

在代码中使用批量数据的方式:

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>
 * 1、使用多批数据对一个接口url做测试<br>
 * 2、不使用多批数据<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();
	}
}

(6)web用例数据编辑

在用例列表界面,点击对应用例的数据链接,即可打开数据编辑界面:

在用例代码中的使用方式:

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)接口测试数据编辑。

也可以使用下面这种方式进行参数化,两种方式可以混合使用:

(7)web用例定位信息编辑

用例在初始化时,即:,会自动将该用例下的数据及定位信息加载。加载之后,就可以在用例脚本中使用了,如图:

同(6)web用例数据编辑,定位信息也可以在多个不同的用例之间共用。

(8) 接口测试的代理设置

对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());
		}
	}	
}

(9)执行过程中操作其他数据库

更多实例请见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();
		}
}

3、  业务树形图

通过此关系图,可以直观的看到业务用例,测试场景以及测试任务三者之间的关系,并且也可以直观的看到每个任务的执行状态。通过此树形图也可以直接编辑场景信息和用例,任务信息,免去了查询编辑的过程。

4、  任务分配

(1)任务增加

增加任务步骤:首先需要确认已经添加了执行机(执行机管理菜单中可查看)。

在首页点击任务分配 -> 添加任务,任务参数如下图:

(2)任务列表

任务列表的功能选项说明如下:

5、  执行机状态

6、  执行机管理

(1)执行机增加

(2)  执行机列表

7、  日志查看

(1)日志列表

(2)单用例信息

(3)详细步骤信息

8、  单个用例的统计图

9、  场景的统计图

10、 消息池列表

(1)列表内容

(2)详细内容:

11、我的附件

12、性能测试场景配置

(1)新增用例

在主页面点击场景配置 -> 新增用例 -> 按页面提示输入参数,部分如图,提交后会跳转到性能测试场景列表界面。

(2)启动场景

在性能测试场景列表页面,点击启动即可。启动后可点击“监控”用以实时监控执行过程。

(3)性能测试报告

在性能测试场景列表页面点击“历史”,即可跳转到该用例下所有的执行结果数据,

以上的summary意思是:总共完成了90次迭代,用时61秒,平均每秒1.5次(因为场景中设置了思考时间,所以TPS比较低),最小响应时间是14ms,最大是23ms,总共出错0次,出错率0%  。

(4)趋势图

在上面界面点击统计图,会列出所有指标统计图,部分如下:

(5)被监控机指标

若有多台被监控机,即本次性能测试监控了多台机器,则点击对应机器的IP,即可及时绘制该机器的趋势图。

12、相关注意事项

(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的用例代码结构:

接口测试案例:

13、  相关资源

(1)       平台官网:http://www.cewan.lahttp://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将会得到更多的用例案例和平台相关信息

 

展开阅读全文
加载中

作者的其它热门文章

打赏
2
3 收藏
分享
打赏
0 评论
3 收藏
2
分享
返回顶部
顶部