天天看點

軟體測試 | XML響應斷言

作者:霍格沃茲測試

1.XML響應斷言簡介

在伺服器接口自動化測試過程中,測試程式發起請求之後還需要對服務端的響應值進行驗證。驗證響應資訊(值)

符合預期值,這一個接口自動化測試用例才算通過。下面将會講解在接口自動化測試中,我們是如何對服務端傳回的XML格式響應内容做斷言驗證的。

2.XML響應斷言的環境準備

Python版本

安裝request_xml

pip install requests_xml           

Java版本

Rest-Assured 支援對XML進行斷言。

3.XML解析方式

有3中XML解析方式

(1)DOM方式:它是文檔對象模型,是W3C組織推薦的标準程式設計接口,它将XML資料在記憶體中解析成一顆樹形。

(2)SAX方式:它是一個用于處理XML時間驅動的模型,它逐行掃描文檔,一邊掃描一邊解析。SAX方式對于大型文檔的解析擁有很大優勢,盡管不是W3C标準,但它得到了使用者的廣泛認可。

(3)ElementTree方式:它相當于DOM方式來說擁有更好的性能,與SAX方式性能差不多,使用API解析XML檔案也很友善。

4.實戰示範

實戰示範代碼如下(Python版和Java版)。

(1)Python示範代碼

1)XML響應斷言

from requests_xml import XMLSession

#設定 session
session = XMLSession()
r = session.get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss")
# 列印所有的内容
r.text
# links可以擷取到響應中所有的連結位址
r.xml.links
# raw_xml傳回位元組形式的響應内容
r.xml.raw_xml
# text傳回标簽中的内容
r.xml.text           

2)XPath斷言

request_xml庫也支援XPath表達式。通過XPath表達式擷取系統中對應響應字段的資料,把取出來的資料放在result清單中,友善接口測試用例斷言。

xpath()用法:

def xpath(self,selector:str, * ,first:bool = False,_encoding:str = None) ->
_XPath:
      """Given an XPath selector,returns a list of
      :class:`Element <Element>` object or a single one.
      
      :param selector:XPath Selector to use.
      :param first: Whether or not to return just the first result.
      :param _encoding:The encoding format.
      """           

上面程式執行的關鍵點如下。

  • XPath解析。
  • selector:使用XPath表達式。
  • first:判斷是否隻傳回第一個查找的結果。
  • xpath()方法:傳回查找到的清單對象。
def test_xpath():
    session = XMLSession()
    r = session.get("https://www.na***.gov/rss/dyn/lg_image_of_the_day.rss")
    #通過xpath擷取所有link标簽的内容
    item = r.xml.xpath("//link")
    result = []
    for i in item:
        #把擷取的結果放進清單中
        result.append(i.text)
    #斷言
    assert 'http://www.na***.gov/' in result           

XML解析

XML是一種結構化、層級化的資料格式,最适合展現XML文檔的資料結構就是樹。XML文檔可以使用Python自帶的xml.etree.ElementTree來解析。ElementTree可以将整個XML文檔轉化為樹,ElementTree可與XML文檔進行 “互動” (讀取、寫入、查找)。

測試程式擷取服務端的響應内容之後,使用findall()方法,通過傳入XPath表達式在響應内容中查找所需要的資料。

import xml.etree.ElementTree ET

#自己封裝XML解析方法
session = XMLSession()
    r = session.get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss")
    #擷取響應内容
    root = ET.fromstring(r.text)
    #查找根元素
    em = root.findall(".")
    # print(item)
    items = root.findall(".//link")
    result = []
    #周遊
    for i in items:
       result.append(i.text)
    assert "http://www.nasa.gov/" in result           

(2)Java示範代碼

Java中調用body()方法擷取服務端的響應内容,body()方法的第一個參數是XPath表達式,第二個參數接收期望結果。

import static io.restassured.RestAssured.*;
import static org.hamcrest.core.IsEqual.equalTo;

public class Requests{
   public static void main(String[] args){
       given()
             .contentType("application/rss+xml;charset=utf-8").
       when()
             .get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day_rss")
       .then()
              .body("rss.channel.item[0].link",
              equalTo("http://www.nasa.gov/image-feature/mocha-swirls-in-jupiter-s-
turbulent-atmosphere"))
            .log().all();
   }
}           

rss.channel.item[0].link這種類型的XPath表達式淺顯易懂,就是根據XPath本身的層級一級一級進行定位。rss是其最外層的标簽,然後依次是channel标簽、item标簽、link标簽,其中同級item有多個标簽,是以需要通過下标[0]定位到第一個item标簽。通過這樣的定位方式,可以擷取到想要的響應内容 。

下面是獲得的XML格式的響應内容。

<rss version="2.0" xml:base="http://www.nasa.gov/" xmlns:atom="http://www.w3.org/
2005/Atom" xmlns:dc="http://pu***.org/dc/elements/1.1/" xmlns:itunes="http://
www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yah***.com/mrss/">
  <channel>
    <item>
      <title>Mocha Swirls in Jupiter's Turbulent Atmosphere</title>
      <link>http://www.nasa.gov/image-feature-feature/mocha-swirls-in-jupiter-s-
turbulent-atmosphere</link>
      //省略
      </item>
      //省略
      <item>
      //省略
      </item>
   </channel>
</rss>           

搜尋微信公衆号:TestingStudio霍格沃茲的幹貨都很硬核