基於Java+HttpClient+TestNG的接口自動化測試框架(二)------配置文件的設定及讀取


     在前面一篇文章中,我們提到了如果進行接口測試,我們要素為url,訪問方法,body,描述等等,當然針對某一個接口的數據返回,我們還需要做一些判定及存儲的操作。因此,我們建立了一個apiDataBean的類來描述接口。

    那么接下來,我們需要針對接口測試的環境做一些配置。這些配置是當前運行的所有接口所必須要進行配置的項,我們可以把這些個項目寫在一個xml文件中,然后通過程序來讀取。

例如:我們在做接口測試的時候可以進行以下這樣的xml配置。

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <rootUrl>http://bx-test1.com:8006/IDAM2/CES_API/</rootUrl>
      <headers>
          <!-- 配置為自己的參數 -->
         <header name="Content-Type" value="application/json"></header>
      </headers>
    <params>
        <param name="cellcode" value="test001"></param>
        <param name="cellname" value="testname001"></param>
        <param name="PHBCODE" value="PHBCODE001"></param>
    </params>
    <project_name>API接口自動化測試報告</project_name>
</root>

  這里列了一個簡單的例子來說明一下。首先,在接口測試中,我們一定會設置服務的主訪問地址。其次,需要加入請求頭的信息,針對某一個系統在做接口測試的時候,請求頭信息大多是固定的。那么,我們這里可以把該系統中所有接口的請求頭信息在配置文件中設定。關於這一點,框架后續會使用程序來實現。但是,針對個別的接口可能需要加一些特殊請求頭的情況。(比如:需要加token認證才能訪問),我們在之前設置apiDataBean的時候,預留了header的屬性,可以利用這個屬性來加入我們需要自定義header的部分。

  接下來,在接口測試中,我們常常會用到一些參數,這些參數有些是url上在使用,有些可能是在body中使用。如果每一次都寫實際值,不利於我們自動化用例的維護,我們也統一的寫在配置文件中進行維護。當然,我們也可以在配置文件中寫入更多的信息(比如:數據庫的信息等),這里先不做展開,有興趣的小伙伴可以自行擴展。

  那么在准備好了當前接口測試所需要的參數后,我們需要一個配置類來讀取這個xml文件,並輸出對象到程序,以便程序調用。

接下來,我們一起看一下這個apiConfig的類:

  

package apiTest.apiConfig;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class apiConfigs {
  //設定主要的三個屬性,主機訪問地址(字符串),header集合(Map),參數集合(Map)
private String rootUrl; Map<String,String> headersMap = new HashMap<String,String>(); Map<String,String> paramsMap = new HashMap<String,String>(); public String getRootUrl() { return rootUrl; } public Map<String, String> getHeadersMap() { return headersMap; } public Map<String, String> getParamsMap() { return paramsMap; }   //定義apiConfigs的實例獲取方式 public apiConfigs(String configXmlPath) throws DocumentException { SAXReader reader = new SAXReader(); Document document = reader.read(configXmlPath); Element rootElement = document.getRootElement();
     //在rootUrl標簽下獲取主機訪問地址 rootUrl
= rootElement.element("rootUrl").getTextTrim();
     //在headers標簽下遍歷header標簽,然后將其存儲到headersMap中 @SuppressWarnings(
"unchecked") List<Element> headerElements = rootElement.element("headers").elements("header"); headerElements.forEach((ele)->{ headersMap.put(ele.attributeValue("name").trim(),ele.attributeValue("value").trim()); });
     //在params標簽下遍歷param標簽,然后將其存儲到paramsMap中 @SuppressWarnings(
"unchecked") List<Element> paramElements = rootElement.element("params").elements("param"); paramElements.forEach((ele)->{ paramsMap.put(ele.attributeValue("name").trim(), ele.attributeValue("value").trim()); }); //在projectName標簽中獲取項目名稱,在log或報告中使用 Element project_name = rootElement.element("projectName"); if(project_name != null) { reportUtil.setReportName(projectEle.getTextTrim()); } } }

  這樣我們在進行接口測試的時候,可以將配置文件進行讀取,然后對所有接口套用配置的參數。

  另外,在實際的接口測試中,會遇到一些這樣的問題:接口A的返回內容中,有些字段的值,是接口B請求時所需要使用的參數。

  如果我們要訪問接口B,就需要先將接口A中的這些字段存儲出來,方便接口B來調用。

  對於我們之前寫的接口請求的構造類,並沒有定義這個具體的變量。因為,第一,我們不知道要取什么值,需要定義多少個變量。第二,對於取值的類型,我們也無法確定。

  那么,怎么處理這個過程中的參數呢?

  如果使用過swagger的童鞋,肯定對{}里面加入變量名的方式比較熟悉。

  在swagger中,使用{}加變量名的方式來定義需要錄入的參數。我們可以借鑒這樣一種思維,可以在我們的接口自動化程序中,先定義一個變量來存儲接口A的返回內容,然后使用一種方式來對定義的變量進行讀取。

  但是,由於我們在接口測試中,有很多情況是需要傳入json參數的,恰巧json的格式就是{}加上一些字符串內容,所以我們這里直接用{}來進行定義變量的轉存不是很合適。

這里,我們定義一種方式來對過程參數進行存儲並調用。

  在這之前,我們需要再想一下,之前我們已經通過apiConfigs的類來讀取了相應的參數。(確切的說是存在了一個Map中)我們將這個Map看成是一個公共參數池,使用${param_name}的方式來調用公共參數。

  同理,我們也可以將過程參數存入公共參數池,把過程參數當成公共參數來使用。

  那么怎么樣才能調用公共參數池里面的參數呢?在這個之前,我們先回想一下正則表達式的相關使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM