在環境搭建那篇文章中,咱們已經部署好了一個環境,本篇文章中咱們將具體介紹功能的使用方法。文章地址: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將會獲得更多的用例案例和平臺相關信息