0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于應(yīng)用程序編程接口(API)的自動(dòng)化測(cè)試(下)

上??匕?/a> ? 來源:上??匕?/span> ? 作者:上??匕?/span> ? 2023-09-20 17:16 ? 次閱讀

作者 |黃杉華東師范大學(xué)軟件工程學(xué)院博士

蘇亭 華東師范大學(xué)軟件工程學(xué)院教授

版塊 |鑒源論壇 · 觀模

社群 |添加微信號(hào)TICPShanghai”加入“上??匕?1fusa安全社區(qū)”

上文“基于應(yīng)用程序編程接口(API)的自動(dòng)化測(cè)試(上)”中,系統(tǒng)介紹了應(yīng)用程序編程接口(API)的概念及其在軟件開發(fā)中的作用與重要性,重點(diǎn)分享自動(dòng)化API測(cè)試的發(fā)展歷程與測(cè)試對(duì)象。

本文將深入剖析單元測(cè)試、模糊測(cè)試等當(dāng)前主流的自動(dòng)化API測(cè)試形式與技術(shù)。

04

自動(dòng)化API測(cè)試形式與技術(shù)

對(duì)API進(jìn)行自動(dòng)化測(cè)試一般使用單元測(cè)試(Unit testing)的測(cè)試形式,這也是當(dāng)下敏捷開發(fā)的重要組成部分。隨著模糊測(cè)試的興起,針對(duì)API的模糊測(cè)試(API fuzzing)成為當(dāng)下流行的API測(cè)試技術(shù)。下面將從單元測(cè)試和模糊測(cè)試兩部分對(duì)自動(dòng)化API測(cè)試形式和技術(shù)進(jìn)行介紹。

4.1單元測(cè)試(Unit Testing)

單元測(cè)試(Unit Testing)又稱為模塊測(cè)試,是一種測(cè)試形式(或稱測(cè)試框架),它針對(duì)程序模塊(軟件設(shè)計(jì)的最小單位)來進(jìn)行正確性檢驗(yàn)的測(cè)試工作。程序單元是應(yīng)用的最小的測(cè)試部件。在過程化編程中,單元測(cè)試由單個(gè)API或者多個(gè)API組合完成;對(duì)于面向?qū)ο缶幊?,單元測(cè)試由單個(gè)或者多個(gè)類的方法以及對(duì)象之間的交互操作完成。單元測(cè)試主要由開發(fā)人員手動(dòng)編寫(如Junit、pytest),也可以通過一些自動(dòng)測(cè)試用例生成技術(shù)(如Randoop[6]、GraphFuzz[4])完成。

單元測(cè)試的一般流程為:(1)編寫或生成單元測(cè)試用例,其中包含測(cè)試環(huán)境初始化、調(diào)用被測(cè)API完成相應(yīng)功能、檢查調(diào)用結(jié)果;(2)執(zhí)行單元測(cè)試用例,收集執(zhí)行結(jié)果,統(tǒng)計(jì)成功的測(cè)試用例和失敗的測(cè)試用例,失敗的測(cè)試用例表明API實(shí)現(xiàn)中存在錯(cuò)誤或缺陷。無論是函數(shù)級(jí)API還是RESTful API,使用單元測(cè)試這種測(cè)試形式都十分有效。

wKgaomUKuGSAD-nOAABYbYduBbU190.png

圖 1 Junit單元測(cè)試示例

如圖 1所示,這是一個(gè)使用Junit單元測(cè)試框架編寫的Java單元測(cè)試用例?!癅Test”表示該函數(shù)執(zhí)行一個(gè)單元測(cè)試用例,其中首先初始化一個(gè)AdderImpl對(duì)象,并調(diào)用該對(duì)象的add方法,傳入1和2這兩個(gè)參數(shù),最終判斷add方法的返回結(jié)果是否為3。如果結(jié)果不為3,則該單元測(cè)試失敗,表示add方法實(shí)現(xiàn)出錯(cuò),反則成功。

4.2API模糊測(cè)試 (Fuzz Test)

模糊測(cè)試(Fuzz test)是一種自動(dòng)化測(cè)試技術(shù),其核心組件模糊器(Fuzzer)可以基于語法規(guī)則直接生成測(cè)試用例,也可以基于已有測(cè)試用例進(jìn)行編譯生成測(cè)試用例。由于模糊器可以生成多樣的測(cè)試用例,這些測(cè)試用例相比于開發(fā)人員編寫的測(cè)試更有可能觸發(fā)程序中的邊界條件和更多樣的測(cè)試場(chǎng)景,因此模糊測(cè)試在測(cè)試軟件魯棒性和軟件漏洞挖掘中非常有效。

針對(duì)API的模糊測(cè)試流程和一般針對(duì)二進(jìn)制程序的模糊測(cè)試流程相同:模糊器從種子庫中選取種子進(jìn)行變異或者直接根據(jù)語法規(guī)則生成測(cè)試用例,執(zhí)行測(cè)試用例,監(jiān)測(cè)執(zhí)行過程并檢查執(zhí)行結(jié)果,當(dāng)執(zhí)行過程中出現(xiàn)崩潰或者執(zhí)行結(jié)果與預(yù)期不符,則認(rèn)為找到了潛在的API錯(cuò)誤。

4.2.1 針對(duì)函數(shù)級(jí)API的模糊測(cè)試

LLVM項(xiàng)目中的Libfuzzer[11]是一款進(jìn)程內(nèi)的由覆蓋率引導(dǎo)的進(jìn)化型模糊引擎。它通過讀取用戶提供的種子(特定的程序輸入或者API調(diào)用參數(shù)),對(duì)種子進(jìn)行變異生成新的測(cè)試用例輸入并傳遞給由用戶編寫的測(cè)試驅(qū)動(dòng),從而實(shí)現(xiàn)API模糊測(cè)試。

wKgZomUKuGWAE9h-AAAa6KeuqSc408.png

圖 2 Libfuzzer測(cè)試驅(qū)動(dòng)示例

圖 2是一個(gè)Libfuzzer測(cè)試驅(qū)動(dòng)示例,Libfuzzer生成的測(cè)試輸入將通過Data參數(shù)傳入測(cè)試驅(qū)動(dòng),用戶則會(huì)將該測(cè)試輸入在經(jīng)過適當(dāng)處理后傳遞給被測(cè)API,從而對(duì)API進(jìn)行測(cè)試。值得注意的是,在Libfuzzer的測(cè)試驅(qū)動(dòng)中,開發(fā)人員同樣可以編寫條件檢查來達(dá)到單元測(cè)試的效果。

Libfuzzer初步解決了測(cè)試輸入生成,而對(duì)API的模糊測(cè)試難點(diǎn)在于如何觸發(fā)更深層次的API行為。為了更高效地對(duì)函數(shù)級(jí)API進(jìn)行測(cè)試,研究人員們對(duì)如何高效地自動(dòng)化生成測(cè)試驅(qū)動(dòng)進(jìn)行了研究,即如何自動(dòng)化地構(gòu)造有效的API調(diào)用序列和API執(zhí)行環(huán)境和程序片段。

FUDGE[2]是一個(gè)通過對(duì)代碼切片進(jìn)行合成來生成模糊測(cè)試候選驅(qū)動(dòng)的工具。FUDGE的核心見解是,以有效且有用的方式執(zhí)行庫函數(shù)的模糊測(cè)試驅(qū)動(dòng)可以通過代碼庫中的現(xiàn)有代碼片段合成。FUDGE的整體流程如圖 3所示,在完成模糊測(cè)試驅(qū)動(dòng)生成后,F(xiàn)UDGE會(huì)將生成的驅(qū)動(dòng)交給開發(fā)人員進(jìn)行評(píng)估。

wKgaomUKuGWAAQdeAAA96QlDYvA184.png

圖 3 FUDGE整體流程

FuzzGen[5] 利用整個(gè)系統(tǒng)分析來推斷庫的接口并專門為該庫合成模糊測(cè)試驅(qū)動(dòng)。FuzzGen不需要開發(fā)人員的參與,并且可以廣泛應(yīng)用于多種編程庫。FuzzGen的核心思想是系統(tǒng)中的現(xiàn)有代碼在多個(gè)方面利用編程庫。如圖 4所示,它從系統(tǒng)中已有使用庫的代碼出發(fā),通過對(duì)整個(gè)系統(tǒng)進(jìn)行分析,先確定哪些是API,再從控制流和數(shù)據(jù)流兩方面整理出抽象API依賴圖(A2DG)。這個(gè)過程需要確定每個(gè)參數(shù)的可能值和類型,并分析參數(shù)之間的依賴關(guān)系。最后,基于依賴圖生成libFuzzer的樁代碼,從而進(jìn)行不需人工干預(yù)、能較好地平衡寬度和深度的模糊測(cè)試。

wKgZomUKuGaASw6EAAEun4EbbRM769.png

圖 4 FuzzGen的核心思想示意圖

GraphFuzz[4]則是通過將整個(gè)API調(diào)用序列表示為一個(gè)數(shù)據(jù)流圖,然后在數(shù)據(jù)流圖中進(jìn)行給定的變異操作進(jìn)行API調(diào)用序列構(gòu)造。圖 5列舉了三種GraphFuzz支持的數(shù)據(jù)流圖變異操作:刪除、插入和串聯(lián)。

wKgaomUKuGeAE78rAABNm2HbAVk764.png

圖 5 GraphFuzz支持的部分變異操作

除了泛用性的針對(duì)函數(shù)級(jí)API的模糊測(cè)試方法的研究工作外,還有特別針對(duì)系統(tǒng)調(diào)用的模糊測(cè)試方法的研究工作,這些研究工作都著力于解決如何構(gòu)造API調(diào)用能夠探索更深層次的API使用場(chǎng)景這一挑戰(zhàn)。

4.2.2 針對(duì)RESTful API的模糊測(cè)試

早期Chakrabarti[3]等人提出了黑盒的、基于規(guī)范的RESTful API測(cè)試方法,其中測(cè)試用例需要使用一種基于XML的可擴(kuò)展測(cè)試規(guī)范語言進(jìn)行手工構(gòu)造。但手工構(gòu)造測(cè)試用例需要較多的人工開銷,后來的工作通過從OpenAPI或者Swagger規(guī)范中提取RESTful API的接口信息,從而實(shí)現(xiàn)了測(cè)試用例的自動(dòng)化生成。

EvoMaster[8]是一個(gè)使用進(jìn)化算法來生成RESTful API測(cè)試用例的基于搜索的模糊測(cè)試工具,這也是一款完全自動(dòng)化的黑盒測(cè)試工具。它在測(cè)試RESTful服務(wù)內(nèi)部更深層次的邏輯方面更有效,因?yàn)樗梢运鸭褪褂糜嘘P(guān)服務(wù)目標(biāo)的更多信息來指導(dǎo)測(cè)試用例生成。

RESTler[1]是第一個(gè)有狀態(tài)基于廣度優(yōu)先探索的RESTful API模糊測(cè)試器。RESTler 通過分析云服務(wù)的 API 規(guī)范,生成請(qǐng)求序列并自動(dòng)調(diào)用云服務(wù)的API對(duì)其測(cè)試。RESTler首先會(huì)通過讀取Swagger接口文檔(圖 6給出了Swagger接口文檔的示例)對(duì)API返回結(jié)果之間的依賴關(guān)系進(jìn)行推斷,然后生成合法的API調(diào)用序列。然后,RESTler會(huì)根據(jù)執(zhí)行API調(diào)用序列過程中服務(wù)器返回的狀態(tài)碼來修改原有的API調(diào)用序列,使其避免生成無效的API調(diào)用序列。

wKgZomUKuGeAEbLvAAEk4DKy3T0078.png

圖 6 Swagger接口文檔示例

05

總結(jié)

自動(dòng)化API測(cè)試有較長的歷史,其自身也在不斷演化進(jìn)步。針對(duì)函數(shù)級(jí)API的自動(dòng)化測(cè)試在泛用方法研究的基礎(chǔ)上,目前也出現(xiàn)了一些針對(duì)特殊編程語言和特殊API場(chǎng)景的研究,如針對(duì)Rust library和深度學(xué)習(xí)庫(PyTorch、TensorFlow)的自動(dòng)化測(cè)試方法研究。針對(duì)RESTful API的自動(dòng)化測(cè)試也是繼SOAP測(cè)試之后出現(xiàn)的web API測(cè)試新種類。隨著軟件工程技術(shù)的發(fā)展,API也在不斷進(jìn)化,如何根據(jù)不同API自身特點(diǎn)制定相對(duì)應(yīng)的自動(dòng)化測(cè)試方案將會(huì)是自動(dòng)化API測(cè)試重點(diǎn)關(guān)注的核心問題。


參考文獻(xiàn):

[1] Vaggelis Atlidakis, Patrice Godefroid, and Marina Polishchuk. 2019. RESTler: Stateful REST API Fuzzing. In 2019 IEEE/ACM 41st International Conference on Software Engineering (ICSE), 748–758.

[2] Domagoj Babi?, Stefan Bucur, Yaohui Chen, Franjo Ivan?i?, Tim King, Markus Kusano, Caroline Lemieux, László Szekeres, and Wei Wang. 2019. FUDGE: fuzz driver generation at scale. In Proceedings of the 2019 27th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering (ESEC/FSE 2019), Association for Computing Machinery, New York, NY, USA, 975–985.

[3] Sujit Kumar Chakrabarti and Prashant Kumar. 2009. Test-the-REST: An Approach to Testing RESTful Web-Services. In 2009 Computation World: Future Computing, Service Computation, Cognitive, Adaptive, Content, Patterns, 302–308.

[4] Harrison Green and Thanassis Avgerinos. 2022. GraphFuzz: Library API Fuzzing with Lifetime-aware Dataflow Graphs. In 2022 IEEE/ACM 44th International Conference on Software Engineering (ICSE), 1070–1081

[5] Kyriakos Ispoglou, Daniel Austin, Vishwath Mohan, and Mathias Payer. 2020. {FuzzGen}: Automatic Fuzzer Generation. 2271–2287. Retrieved July 5, 2023

[6] Carlos Pacheco, Shuvendu K. Lahiri, Michael D. Ernst, and Thomas Ball. 2007. Feedback-Directed Random Test Generation. In 29th International Conference on Software Engineering (ICSE’07), IEEE, Minneapolis, MN, USA, 75–84. D

[7] 2023. API. Wikipedia. Retrieved August 16, 2023

[8] 2023. EvoMaster: A Tool For Automatically Generating System-Level Test Cases. Retrieved August 16, 2023

[9] pytest: helps you write better programs — pytest documentation. Retrieved August 16, 2023[10] JUnit 5. Retrieved August 16, 2023

[11] libFuzzer – a library for coverage-guided fuzz testing. — LLVM 18.0.0git documentation. Retrieved August 16, 2023

審核編輯 黃宇


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 自動(dòng)化測(cè)試

    關(guān)注

    0

    文章

    201

    瀏覽量

    26884
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8447

    瀏覽量

    150720
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1472

    瀏覽量

    61749
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3565

    瀏覽量

    93535
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    OPhone自動(dòng)化測(cè)試技術(shù)概述

    本文將對(duì)OPhone平臺(tái)上可采用的幾種自動(dòng)化測(cè)試技術(shù)進(jìn)行介紹,并對(duì)每種技術(shù)的優(yōu)缺點(diǎn)做簡要的總結(jié)。OPhone臺(tái)除了為應(yīng)用程序開發(fā)提供豐富的API外,也為開展
    發(fā)表于 05-06 08:58

    自動(dòng)化測(cè)試框架思想和構(gòu)建

    自動(dòng)化測(cè)試一般是指軟件測(cè)試自動(dòng)化,軟件測(cè)試就是在預(yù)設(shè)條件運(yùn)行系統(tǒng)或
    發(fā)表于 07-18 06:52

    JavaScript API自動(dòng)化測(cè)試方案的管理設(shè)計(jì)與實(shí)現(xiàn)

    Logcat并寫入,最終寫成方案并測(cè)試,在應(yīng)用程序中,JavaScript API作為連接程序與web頁面的橋梁,擴(kuò)展了內(nèi)嵌web頁面的JavaScript的能力,為web應(yīng)用帶來更好
    發(fā)表于 11-07 11:10 ?5次下載
    JavaScript <b class='flag-5'>API</b><b class='flag-5'>自動(dòng)化</b><b class='flag-5'>測(cè)試</b>方案的管理設(shè)計(jì)與實(shí)現(xiàn)

    Android應(yīng)用程序GUI遍歷自動(dòng)化方法

    和性能。 為了提高應(yīng)用程序自動(dòng)執(zhí)行技術(shù)的圖形用戶界面( GUI)覆蓋率和自動(dòng)化程度以滿足Android應(yīng)用
    發(fā)表于 12-09 11:06 ?0次下載
    Android<b class='flag-5'>應(yīng)用程序</b>GUI遍歷<b class='flag-5'>自動(dòng)化</b>方法

    什么是自動(dòng)化測(cè)試框架?

    同一個(gè)應(yīng)用程序的不同模塊上工作時(shí),以及當(dāng)我們希望避免每個(gè)開發(fā)人員實(shí)現(xiàn)自己的自動(dòng)化方法的情況,需要一個(gè)統(tǒng)一的標(biāo)準(zhǔn)測(cè)試自動(dòng)化框架。
    的頭像 發(fā)表于 11-03 10:33 ?4299次閱讀

    使用Postman成功實(shí)現(xiàn)API測(cè)試自動(dòng)化的最佳實(shí)踐

      API 測(cè)試自動(dòng)化支持兩個(gè)獨(dú)立軟件系統(tǒng)之間的通信和數(shù)據(jù)交換。實(shí)現(xiàn) API 的軟件系統(tǒng)包含可由另一個(gè)軟件系統(tǒng)執(zhí)行的功能/子例程。它通過增加測(cè)試
    的頭像 發(fā)表于 06-20 10:19 ?894次閱讀

    使用Postman成功實(shí)現(xiàn)API測(cè)試自動(dòng)化的最佳實(shí)踐

      API 測(cè)試自動(dòng)化支持兩個(gè)獨(dú)立軟件系統(tǒng)之間的通信和數(shù)據(jù)交換。實(shí)現(xiàn) API 的軟件系統(tǒng)包含可由另一個(gè)軟件系統(tǒng)執(zhí)行的功能/子例程。它通過增加測(cè)試
    的頭像 發(fā)表于 07-05 10:46 ?921次閱讀

    使用Postman成功實(shí)現(xiàn)API測(cè)試自動(dòng)化的最佳實(shí)踐

    API代表應(yīng)用程序編程接口,用于通過使用任何通信模式來平滑兩個(gè)不同應(yīng)用程序之間的交互。每次您在智能手機(jī)上查看天氣或火車時(shí)間時(shí),您都在使用
    的頭像 發(fā)表于 12-08 15:01 ?632次閱讀
    使用Postman成功實(shí)現(xiàn)<b class='flag-5'>API</b><b class='flag-5'>測(cè)試</b><b class='flag-5'>自動(dòng)化</b>的最佳實(shí)踐

    跨平臺(tái)移動(dòng)應(yīng)用程序測(cè)試自動(dòng)化框架確保質(zhì)量與速度

      隨著市場(chǎng)上推出的移動(dòng)應(yīng)用程序數(shù)量不斷增加,測(cè)試工程師努力在移動(dòng)應(yīng)用程序在在線市場(chǎng)上發(fā)布之前滿足所有測(cè)試用例。在現(xiàn)實(shí)世界中,它們總是悄悄潛入,并且經(jīng)常重新出現(xiàn),即使使用最佳的手動(dòng)
    的頭像 發(fā)表于 12-09 14:21 ?705次閱讀

    測(cè)試自動(dòng)化中的Python

      用于測(cè)試編程需要與開發(fā)應(yīng)用程序編程不同的方法。如果你想要一種專門用于測(cè)試編碼的簡單而精簡的語言,Python 是一個(gè)不錯(cuò)的選擇。Py
    的頭像 發(fā)表于 12-09 14:53 ?785次閱讀

    如何自動(dòng)化測(cè)試你的接口

    不知道大家的項(xiàng)目是否都有對(duì)接口API進(jìn)行自動(dòng)化測(cè)試,反正像我們這種小公司是沒有的。由于最近一直被吐槽項(xiàng)目質(zhì)量糟糕,只能研發(fā)自己看看有什么接口
    的頭像 發(fā)表于 04-07 15:29 ?1211次閱讀
    如何<b class='flag-5'>自動(dòng)化</b><b class='flag-5'>測(cè)試</b>你的<b class='flag-5'>接口</b>?

    什么是自動(dòng)化測(cè)試框架

    自動(dòng)化測(cè)試框架,即是應(yīng)用于自動(dòng)化測(cè)試所用的框架。按照框架的定義,自動(dòng)化測(cè)試框架要么是提供可重用的
    發(fā)表于 04-18 14:44 ?868次閱讀

    基于Raspberry PI的應(yīng)用程序的典型場(chǎng)景家庭自動(dòng)化

    電子發(fā)燒友網(wǎng)站提供《基于Raspberry PI的應(yīng)用程序的典型場(chǎng)景家庭自動(dòng)化.zip》資料免費(fèi)下載
    發(fā)表于 06-13 11:05 ?0次下載
    基于Raspberry PI的<b class='flag-5'>應(yīng)用程序</b>的典型場(chǎng)景家庭<b class='flag-5'>自動(dòng)化</b>

    接口自動(dòng)化測(cè)試流程講解 企業(yè)接口自動(dòng)化測(cè)試步驟

    接口自動(dòng)化測(cè)試是指通過編寫腳本或使用自動(dòng)化工具,對(duì)軟件系統(tǒng)的接口進(jìn)行測(cè)試的過程。
    發(fā)表于 07-28 14:54 ?2105次閱讀
    <b class='flag-5'>接口</b><b class='flag-5'>自動(dòng)化</b><b class='flag-5'>測(cè)試</b>流程講解 企業(yè)<b class='flag-5'>接口</b><b class='flag-5'>自動(dòng)化</b><b class='flag-5'>測(cè)試</b>步驟

    基于應(yīng)用程序編程接口API)的自動(dòng)化測(cè)試(上)

    本文系統(tǒng)介紹了應(yīng)用程序編程接口API)的概念及其在軟件開發(fā)中的作用與重要性,重點(diǎn)分享自動(dòng)化API
    的頭像 發(fā)表于 09-01 11:17 ?573次閱讀