rest-assured接口測試學習(二)

一藏研、準備階段

按照開源文檔,做一個樣例
https://github.com/rest-assured/rest-assured/wiki
vi daybreak.json
內(nèi)容是文檔中的json樣例

{ "store": {
   "book": [
    { "category": "reference",
      "author": "Nigel Rees",
      "title": "Sayings of the Century",
      "price": 8.95
    },
    { "category": "fiction",
      "author": "Evelyn Waugh",
      "title": "Sword of Honour",
      "price": 12.99
    },
    { "category": "fiction",
      "author": "Herman Melville",
      "title": "Moby Dick",
      "isbn": "0-553-21311-3",
      "price": 8.99
    },
    { "category": "fiction",
      "author": "J. R. R. Tolkien",
      "title": "The Lord of the Rings",
      "isbn": "0-395-19395-8",
      "price": 22.99
    }
  ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
 }

python -m CGIHTTPServer
用python快速生成一個本地8000端口的小網(wǎng)站
訪問127.0.0.1:8000咐汞,daybreak.json文件內(nèi)容如下:

image.png

與新建json文件同樣的方法盖呼,新建一個daybreak.xml

 <shopping>
 <category type="groceries">
 <item>
 <name>Chocolate</name>
 <price>10</price>
 </item>
 <item>
 <name>Coffee</name>
 <price>20</price>
 </item>
 </category>
 <category type="supplies">
 <item>
 <name>Paper</name>
 <price>5</price>
 </item>
 <item quantity="4">
 <name>Pens</name>
 <price>15</price>
 </item>
 </category>
 <category type="present">
 <item when="Aug 10">
 <name>Kathryn's Birthday</name>
 <price>200</price>
 </item>
 </category>
 </shopping>

訪問127.0.0.1:8000/daybreak.xml,結構如下:
shopping下面有多個不同type的category化撕,每個category下有一個或多個item几晤,item下面有name和price


Tips:(可能遇到的坑)
當使用python -m GCIHTTPServer時,常常會報錯:
socket.error: [Errno 48] Address already in use
解決方法:
ps -fA | grep python
結果:


...
501 23129 20675 0 7:51下午 ttys001 0:00.99 python -m CGIHTTPServer
501 23815 20675 0 9:54下午 ttys001 0:00.00 grep python


找到對應的進程號植阴,然后kill 進程號蟹瘾,kill 23129
再重新python -m GCIHTTPServer

二、演練

new一個class掠手,Demo.java

1. 對json的斷言:

方式一:

import org.junit.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.*;

public class Demo {
  @Test
  public void testJson(){
    given().when().get("http://127.0.0.1:8000/daybreak.json")
    .then()
           .body("store.book.category",hasItems("reference"));
  }
}

"store.book.category",是昨天提到過的憾朴,根節(jié)點.子節(jié)點.子節(jié)點……
hasItems("reference"),前面的key對應的value是在這個括號里

方式二:
[ ]是json中的數(shù)組
book節(jié)點下喷鸽,是四個對立的數(shù)組元素众雷,每個元素中都有category、author、title砾省、price,我要斷言book中的第一個author的值是Nigel Rees鸡岗。
代碼

.body("store.book[0].author",equalTo("Nigel Rees"))

"store.book[0].author" :book數(shù)組的第1個元素下的author
第2個元素可以用book[1]……,最后一個元素可以使用book[-1]

方式三:
官方文檔中還有一種方式编兄,叫深度搜索轩性,比如某個子集有n個數(shù)組,找出符合特定條件的翻诉。
store.book.find{ book -> book.price >= 5 && book.price <= 15 }
獲得price在5-15之間的book數(shù)組
用法:
.body("store.book.find{ book -> book.price >= 5 && book.price <= 15}.price",equalTo(8.95f))

2. 對xml斷言

方式一:同json相似的

@Test
  public void testXml(){
    when().get("http://127.0.0.1:8000/daybreak.xml")
    .then()
            .body("shopping.category.item[0].name",equalTo("Chocolate"));
  }

.body("shopping.category[0].item[0].name",equalTo("Chocolate"));雖然結果是一樣的炮姨,但是category的含義不一樣

方式二:
shopping.category.item.size(),返回itms的個數(shù)/長度
用法:.body("shopping.category.item.size()",equalTo("5"));
使用.body("shopping.category.item.size()",equalTo(""));可以明白categorycategory[0]的區(qū)別



category有5個item,category[0]有2個item

方式三:深度檢索
"shopping.category.findAll { it.@type == 'groceries' }.size()"碰煌,返回type = 'groceries' 的category的size舒岸,是1,使用@表示屬性芦圾。
示例1:
.body("shopping.category.findAll { it.@type == 'groceries' }.size()",equalTo(1));
示例2:
"shopping.category.findAll { it.@type == 'groceries' }.item.size()",equalTo(2)):返回上面所述的category.item的size蛾派,是2。
示例3:
.body("shopping.category.item.findAll { it.price == 200 }.name",equalTo("Kathryn's Birthday"));返回price=200的item的name个少,是"Kathryn's Birthday"
示例4:
.body("**.findAll { it.price == 200 }.name",equalTo("Kathryn's Birthday"));:shopping.category.item可以換成**(json path不支持**
find是找第一個洪乍,findAll是找所有,我理解是it指帶find前面的內(nèi)容夜焦。

3. 對html的斷言:

昨天的文章中壳澳,在百度搜索mp3的響應,是一個html結構的內(nèi)容茫经,把html也看作是一層一層的節(jié)點巷波。



斷言示例:
.body("html.head.title",equalTo("mp3_百度搜索"));

三、實戰(zhàn)

繼續(xù)xueqiu.com卸伞,對搜索接口進行應用
接口返回結果如下:

{
    "q": "sogo",
    "page": 1,
    "size": 10,
    "stocks": [
        {
            "code": "SOGO",
            "name": "搜狗",
            "enName": "",
            "hasexist": "false",
            "flag": null,
            "type": 0,
            "stock_id": 1029472,
            "ind_id": 0,
            "ind_name": "通訊業(yè)務",
            "ind_color": null,
            "_source": "sc_1:1:sogo"
        }
    ]
}

.body("stocks.find{it.code == 'SOGO'}.name",equalTo("搜狗"));

四抹镊、今日份源碼

Demo.java:

import org.junit.Test;
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;

public class Demo {
  @Test
  public void testJson(){
      when().get("http://127.0.0.1:8000/daybreak.json")
      .then()
            .body("store.book.category",hasItems("reference"))
            .body("store.book[0].author",equalTo("Nigel Rees"))
            .body("store.book.find{ book -> book.price >= 5 && book.price <= 15 }.price",equalTo(8.95f));

  }

  @Test
  public void testXml(){
    when().get("http://127.0.0.1:8000/daybreak.xml")
    .then()
            .body("shopping.category.item[0].name",equalTo("Chocolate"))
            .body("shopping.category.item.size()",equalTo(5))
            .body("shopping.category.findAll { it.@type == 'groceries' }.item.size()",equalTo(2))
            .body("shopping.category.item.findAll { it.price == 200 }.name",equalTo("Kathryn's Birthday"))
            .body("**.findAll { it.price == 200 }.name",equalTo("Kathryn's Birthday"));
  }
}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荤傲,隨后出現(xiàn)的幾起案子垮耳,更是在濱河造成了極大的恐慌,老刑警劉巖遂黍,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件终佛,死亡現(xiàn)場離奇詭異,居然都是意外死亡妓湘,警方通過查閱死者的電腦和手機查蓉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榜贴,“玉大人,你說我怎么就攤上這事』5常” “怎么了鹃共?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驶拱。 經(jīng)常有香客問我霜浴,道長,這世上最難降的妖魔是什么蓝纲? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任阴孟,我火速辦了婚禮,結果婚禮上税迷,老公的妹妹穿的比我還像新娘永丝。我一直安慰自己,他們只是感情好箭养,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布慕嚷。 她就那樣靜靜地躺著,像睡著了一般毕泌。 火紅的嫁衣襯著肌膚如雪喝检。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天撼泛,我揣著相機與錄音挠说,去河邊找鬼。 笑死愿题,一個胖子當著我的面吹牛损俭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抠忘,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撩炊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了崎脉?” 一聲冷哼從身側響起拧咳,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎囚灼,沒想到半個月后骆膝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡灶体,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年阅签,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝎抽。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡政钟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情养交,我是刑警寧澤精算,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站碎连,受9級特大地震影響灰羽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鱼辙,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一廉嚼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倒戏,春花似錦怠噪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至葱椭,卻和暖如春捂寿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孵运。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工秦陋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人治笨。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓驳概,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旷赖。 傳聞我的和親對象是個殘疾皇子顺又,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 例3 - 復雜的解析和驗證這正是rest-assured閃光點所在!由于rest-assured實現(xiàn)了Groovy...
    零下的雨閱讀 6,999評論 0 3
  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵勝奧閱讀 4,820評論 0 1
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,332評論 0 10
  • 蝸牛的總結 年紀日漸增長等孵,工作越來越模式化稚照,壓力山大的同時,看不到任何精彩的跡象俯萌。寂寂然在自己的世界里糾...
    菩提風花閱讀 161評論 0 1
  • 三尺講臺作奠基果录,粉塵筆墨勤耘耕。 甘為莘莘學子梯咐熙,科學高峰共攀登弱恒。
    文采樂閱讀 289評論 10 12