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霍格沃茲的幹貨都很硬核