如何确保API 的稳定性与正确性?你只需要这一招
一、什么是rest-assured
現在,越來越多的 Web 應用轉向了RESTful的架構,很多產品和應用暴露給用戶的往往就是一組 REST API,這 樣有一個好處,用戶可以根據需要,調用不同的 API,整合出自己的應用出來。從這個角度來講,Web 開發的成本會越來越低,人們不必再維護自己的信息孤島,而是使用 REST API 這種組合模式。
那么,作為 REST API 的提供者,如何確保 API 的穩定性與正確性呢?全面系統的測試是必不可少的。Java 程 序員常常借助于 JUnit 來測試自己的 REST API,不,應該這樣說,Java 程序員常常借助于JUnit 來測試 REST API的實現!從某種角度來說,這是一種“白盒測試”,Java 程序員清楚地知道正在測試的是哪個類、哪個方 法,而不是從用戶的角度出發,測試的是哪個REST API。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MlRvq2n9-1650787676909)(https://ceshiren.com/uploads/default/original/3X/c/0/c0f2baadfa15e0549eee87abdce4560ff4b995d6.jpeg)]
Rest-Assured 是一套由 Java 實現的 REST API測試框架,它是一個輕量級的REST API 客戶端,可以直接編寫代碼向服務器端發起 HTTP請求,并驗證返回結果;它的語法非常簡潔,是一種專為測試 REST API 而設計的 DSL。使用 Rest-Assured 測試 REST API,就和真正的用戶使用 REST API 一樣,只不過 Rest-Assured 讓這一切變得自動化了。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0CDiMatI-1650787677601)(https://ceshiren.com/uploads/default/original/3X/d/9/d96ab7b08ba1e34b27d14e766df78ea4e0fdc5d8.jpeg)]
二、模擬get請求
雪球網是一個股票投資網站,你可以使用網站的搜索功能來查詢股票信息,比如我們想查詢sougou的信息,下 面利用了charles分析工具來查看請求和回答:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iAVu12A7-1650787678192)(https://ceshiren.com/uploads/default/original/3X/8/6/86bf76ba843c63c133b985178b5019b1e37066f5.gif)]
這是一個Get請求,返回的內容格式如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rVSysrrS-1650787678613)(https://ceshiren.com/uploads/default/original/3X/1/4/1474d7173c6a92dcbc2fbedb56339e178c5209b5.jpeg)]
現在,我們使用 Rest-Assured 來編寫一個簡單的測試程序調用相同的Get請求:
- 第一步,我們要判斷這是什么格式數據:json
-
- 第二步,確定請求地址:從charles的結果中獲取y為https://xueqiu.com/stock/search.json
- [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-A97fImNC-1650787679683)(https://ceshiren.com/uploads/default/original/3X/9/a/9af5988eb450cfb9e7f227ea03d0ba8e2c6c1589.png)]
-
-
- 第三步,填寫表單:從chrome瀏覽器檢查結果中查詢request的query信息是code:sougou
- [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-inbrajvf-1650787680985)(https://ceshiren.com/uploads/default/original/3X/2/b/2b60684f2cd10aa568fd867b1bc8ddd3cdb0fe2a.png)]
我們的代碼也很簡單:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uEHIEyj7-1650787682241)(https://ceshiren.com/uploads/default/original/3X/a/e/ae31cd8cc9695ecd0a688f2e10d845e09f7adb42.jpeg)]
返回的結果卻很殘酷:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4smJIJzB-1650787682866)(https://ceshiren.com/uploads/default/original/3X/c/7/c795ce1740844b7788ee188a683b729a1cfef136.png)]
與登陸賬號,刷新頁面有關的話,我首先想到了cookie,網站都用cookie來保存賬號相關信息,于是加入 cookie:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ayukix76-1650787683902)(https://ceshiren.com/uploads/default/original/3X/d/1/d1df68fbf7180f7bfbd7b3acff147b5022eb3814.jpeg)]
返回結果正確,你問我驚不驚喜,老實回答,不驚喜。因為我搞不明白為什么一個查詢需要cookie驗證,如果 不加cookie,返回的信息卻是沒有登陸!
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-TkWSodgn-1650787685176)(https://ceshiren.com/uploads/default/original/3X/0/0/00c1b4a7507dea6da3f25b774a461a104d493029.jpeg)]
顯然,我的cookie并不包含登陸信息,因為我壓根就沒有登陸,當然這是網站的設計,與rest-assured無關。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KdYHkoNB-1650787686438)(https://ceshiren.com/uploads/default/original/3X/2/2/228ad26e63af1d8f7b5dc43398407476dd02848d.jpeg)]
更進一步
怎么區別xml與json
答:你看就知道了嘛,xml長這個樣子
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rNzv6nD4-1650787688052)(https://ceshiren.com/uploads/default/original/3X/d/f/df983a4855195118be403cadd4618c34f578c4c3.jpeg)]
json長這個樣子
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LQXXfUzS-1650787689066)(https://ceshiren.com/uploads/default/original/3X/f/2/f25e6517cf216e63694d30fb25585d51ac57d0c3.png)]
given,when,then分別是什么
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2fBNzJJD-1650787689813)(https://ceshiren.com/uploads/default/original/3X/c/9/c9dcd136879fcafbe460ffc855e09b6b984c1c10.jpeg)]
答:given用于放置需要的參數,比如上面例子中,我將訪問參數:code和cookie放到了given里;when用于填 寫要訪問的url;then進行斷言,來來判斷結果是否正確。
三、模擬post請求
有的時候,我們想提交表單,這種情況下使用get會非常被動,于是post登場了。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6zRpXg4l-1650787690600)(https://ceshiren.com/uploads/default/original/3X/a/6/a6c59e7a4617a35691a62a4cfcacf7436da5a36e.png)]
下面是代碼。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3lQJHe8Q-1650787691001)(https://ceshiren.com/uploads/default/original/3X/0/f/0f72e88d7032bbf9b95ff0e901a396fe4ce74504.png)]
我相信此時你的內心是這樣的。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ozwr7ZzC-1650787691476)(https://ceshiren.com/uploads/default/original/3X/f/c/fcd91fba88bfea85f370326592c56a114ce02b1f.jpeg)]
別著急,下面我會講清楚…
在我大萬維網世界中,TCP就像汽車,我們用TCP來運輸數據,它很可靠,從來不會發生丟件少件的現象。但是 如果路上跑的全是看起來一模一樣的汽車,那這個世界看起來是一團混亂,非常緊急的警車可能被前面的汽車攔堵在路上,整個交通系統一定會癱瘓。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-o2YLOHAt-1650787692308)(https://ceshiren.com/uploads/default/original/3X/f/a/fa69658788575d72c2efcbc6d8af51251cfad02d.jpeg)]
為了避免這種情況發生,交通規則HTTP誕生了。HTTP給汽車運輸設定了好幾個服務類別,有GET, POST, PUT, DELETE等等,HTTP規定,當執行GET請求的時候,要給汽車貼上GET的標簽(設置method為GET),而且要求 把傳送的數據放在車頂上(url中)以方便記錄。如果是POST請求,就要在車上貼上POST的標簽,并把貨物放 在車廂里。當然,你也可以在GET的時候往車廂內偷偷藏點貨物,但是這是很不光彩;也可以在POST的時候在車頂上也放一些數據,讓人覺得傻乎乎的。HTTP只是個行為準則,而TCP才是GET和POST怎么實現的基本。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-DUC8tU7D-1650787693926)(https://ceshiren.com/uploads/default/original/3X/c/8/c8598f075e6bc26226bbaa7d96945f6224e8f6fb.jpeg)]
四、使用斷言
使用equalTo
在前面,我們使用了equalTo判斷值是否是“搜狗”:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SqgIJkg9-1650787694832)(https://ceshiren.com/uploads/default/original/3X/2/f/2fc174ce3b1208a8dc4dec84579eecdc6e7a99ce.png)]
它的作用顯而易見:判斷值是否相同。比如下面的例子
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ETRjjtx4-1650787695558)(https://ceshiren.com/uploads/default/original/3X/b/1/b13bfd3e19dc7ae87f68c63e770d4b70050237b8.jpeg)]
如果你想驗證lottoId是否等于5,你可以這樣做:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7846U6d9-1650787696308)(https://ceshiren.com/uploads/default/original/3X/2/0/20443dbaf6e1c330a4e1575f20daafe4a77e15e7.png)]
使用hasItems
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ob7HHUiy-1650787697026)(https://ceshiren.com/uploads/default/original/3X/5/6/5676349b1cba7b62e4e0c390a3f89126cbce25d5.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EOarPTae-1650787697654)(https://ceshiren.com/uploads/default/original/3X/b/9/b928ded901cf25312160ed8328a7042d1452b0a1.jpeg)]
你可以用再次equalTo(),對winnerId[0]用一次,對winnerId[1]用一次。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GJFcy6R0-1650787698911)(https://ceshiren.com/uploads/default/original/3X/6/7/67e357530fb6eae535c2e6c1ad28d5417c0c0935.jpeg)]
哈哈,當然不是。你可以使用hasItems,它是這么使用的:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KBG4UM53-1650787700379)(https://ceshiren.com/uploads/default/original/3X/7/5/7572f65cf4ee8b461d4a7a2da1a74555031d97cf.png)]
從根開始定位
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vYWI84IB-1650787700823)(https://ceshiren.com/uploads/default/original/3X/f/9/f941f210c8b3a4622f6f663ff78aa9c352762852.jpeg)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-h5jnxXAs-1650787701229)(https://ceshiren.com/uploads/default/original/3X/8/8/8808d34eb4b4fa9fc475d2a83392bfdb1848f0a0.png)]
額…請教王師傅。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yE8I83XA-1650787701772)(https://ceshiren.com/uploads/default/original/3X/7/5/7572849345bf1e7e80038aeabef21ae139e51692.jpeg)]
比如下面的代碼,我們可以這么驗證:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fHCCDraW-1650787702380)(https://ceshiren.com/uploads/default/original/3X/d/0/d0997a1ff9af9b03ed408c1113985ee3255926df.png)]
使用find
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-j2zUKtky-1650787702924)(https://ceshiren.com/uploads/default/original/3X/3/8/383e3d242fd09c654bd950f607c27a1a002f1692.jpeg)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-axIgal7g-1650787703522)(https://ceshiren.com/uploads/default/original/3X/2/3/23601168d0bebd721882a1220907d64822c8a11d.jpeg)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FNoEbM4P-1650787704230)(https://ceshiren.com/uploads/default/original/3X/e/b/eb676155427c2987d39624ae51c8aa09e3ec5414.jpeg)]
答對了,請一定要記住xml和json的區別,不要混談,那么你能編寫一個測試來驗證雜貨(groceries)的類別是 否包含巧克力(Chocolate)和咖啡(Coffe)嗎?
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-DWgVXdGz-1650787705884)(https://ceshiren.com/uploads/default/original/3X/f/0/f0492217c9211cff2bd7f4f6e07650cfde3a5646.jpeg)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EsucEP0Z-1650787706838)(https://ceshiren.com/uploads/default/original/3X/5/3/532a78533aba238546f60e12e0371596479bad32.jpeg)]
這確實達到了我的要求,但代碼明顯有很多bug,如果我更改了category的位置,像下面這樣,你的代碼就不 適用了,我不難為你了,請王師傅來解答吧:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-N9ZtWMNM-1650787707568)(https://ceshiren.com/uploads/default/original/3X/1/0/103acbc8194b303b04c3a2366fbf825ee2612fb4.jpeg)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jM0Qiqij-1650787708073)(https://ceshiren.com/uploads/default/original/3X/6/1/61ea63c3492e55622ab6d393eb72547c078c2d36.jpeg)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nbQAh4zR-1650787708632)(https://ceshiren.com/uploads/default/original/3X/8/f/8fd0632c7b3c4bb3b31036d580ddfeee942acb5f.png)]
find的用法展示的很清楚,不需要我多講,當然還有一點要注意,你可以這么使用find:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JrZQWSl3-1650787709391)(https://ceshiren.com/uploads/default/original/3X/b/9/b9fe9a18b3f8a943ff329ab2ad926e8c84120f40.png)]
**是個特殊用法,它從xml文檔根部開始,進行深度搜索,直到找到符合我們需要的項。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Xh7AT4tV-1650787710363)(https://ceshiren.com/uploads/default/original/3X/5/2/52bc05833244af550b3e614fae46d2e03ffb023e.jpeg)]
使用findAll
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RP1VudnB-1650787711339)(https://ceshiren.com/uploads/default/original/3X/d/5/d5c5ef624eacc70a8d979ae86faae045c1d9bd2c.jpeg)]
現在我手頭只有20塊錢,我只能買兩本書,我更喜歡世紀的諺語和白鯨記,現在的任務是:挑選出格低于10的書籍,并且標題是“世紀的諺語(Sayings of the Century)”和“白鯨記(Moby Dick)”
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-83qt44Bh-1650787713598)(https://ceshiren.com/uploads/default/original/3X/b/d/bd74c87b6baf6b02726dda375b192569cb191812.jpeg)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZVTaG3Ny-1650787714292)(https://ceshiren.com/uploads/default/original/3X/7/e/7e91ddbb086b439dcde1e2e978528627f3209d2b.jpeg)]
對的,這時候應該使用findAll,可以粗魯的認為多個find的疊加。findAll可以篩選出一批符合要求的數據,而 find只能篩選出一個符合要求的數據,這就像是我們只能挑出一個人領取一等獎,但有很多人可以拿參與獎, 兩個方法都有自己的用武之地。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hlkl4HE7-1650787715957)(https://ceshiren.com/uploads/default/original/3X/8/5/8586cafacb388a578b7f3d71fc1c746b453233ab.jpeg)]
下面的代碼展示了findAll的用法:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rFAMENC0-1650787717259)(https://ceshiren.com/uploads/default/original/3X/2/f/2fee65c1240bd52dedb28c7fcfd5c93cbfb4c4ec.png)]
五、提取想要的值
有時候,我們并不想驗證是否正確,我們只想取出這個值以進行下一步處理,比如我想取出next的鏈接:/title?page=2,這種情況怎么辦呢?
下面的代碼判斷內容是不是JSON,并且標題是My Title的話,就返回href鏈接/title?page=2,這個值被存放在nextTitleLink中,以供我們以后使用。
當然,有兩點需要注意:
- 返回類型是Response,我們可以用Response.xxx來二次提取想要的值。
-
- extract().后面是response()方法,不要寫錯了。
六、更改默認值
rest-assured有很多默認值,也正因為如此,需要我們的填的參數可以很少,也可以很多,就像畫畫一樣,可以很精致,也可以很簡潔。
修改端口
rest-assured發起請求時,默認使用的host為localhost,端口為8080,如果你想使用不同的端口,你可以這樣做:
- extract().后面是response()方法,不要寫錯了。
或者是這樣
或者
修改baseURI和basePath
你也可能改變默認的baseURI、basePath
這就意味著,類似 get(“/hello”) 這樣的一個請求,其實完整的請求為:http://myhost.com:80/resource/hello , 并且使用基礎授權認證"username" and “password”。
其他
其他的默認值可以參考下面:
重置
你也可以重置為標準的baseURL(localhost)、basePath(空)、標準端口port(8080)、標準根路徑root path(" "),默 認的認證scheme(none)以及URL編碼(true),通過下面的方法重置:
七、specification
在不同的測試用例當中,我們可能會有重復的響應斷言或者是請求參數,那么我們可以將重復的這一部分提取出來定義一個規范或者模板,這樣的話在后續的測試用例當中就可以使用這個規范模板了。
為了達到這個效果,我們可以使用RequestSpecBuilder或 ResponseSpecBuilder來實現,它們之間的區別 是,前者用在請求中,后者則用在body中。
ResponseSpecification重用
例如,你想在多個測試用例中,都使用這樣的斷言:判斷響應狀態碼是否為200,并且Json數組"x.y"的大小是否 等于2。你可以定義一個ResponseSpecBuilder來實現這個功能:
在這個例子中,需要重用的兩個斷言數據被定義在"responseSpec",并且與另外一個body斷言合并,組成了這 個測試用例中全部的斷言,那么這個測試用例需要全部斷言都通過用例結果才會通過,一旦其中一個斷言失 敗,則測試用例的測試結果為失敗。
RequestSpecification重用
同樣,假如你想在多個測試用例中重用請求數據,可以通過下面的代碼來實現:
這里的請求數據被合并在"requestSpec"中,所以這個請求包含了兩個參數(“parameter1"和"parameter2”)以及一 個頭部(“header1”)。
總結
本文就rest-assured的基本功能進行舉例說明,其中例子大多來自于官方文檔,同時我也建議大家多去閱讀該開 發文檔,其中有很多我們沒有講到的東西。 本文參考: rest-assured官網:https://github.com/rest-assured/rest-assured/wiki/Usage rest-assured介紹:https://www.ibm.com/developerworks/cn/java/j-lo-rest-assured/ get與post的區別:https://www.cnblogs.com/logsharing/p/8448446.htm
使用specification:https://www.cnblogs.com/lwjnicole/p/8277468.html
獲取更多技術文章分享
總結
以上是生活随笔為你收集整理的如何确保API 的稳定性与正确性?你只需要这一招的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚幻引擎5(Un Real5)学习笔记
- 下一篇: HTML5背景图片居中