在环境搭建那篇文章中,我们已经部署好了一个环境,本篇文章中我们将具体介绍功能的使用方法。文章地址:
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.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将会得到更多的用例案例和平台相关信息