作者 | 黄杉 华东师范大学软件工程学院博士
苏亭 华东师范大学软件工程学院教授
版块 | 鉴源论坛 · 观模
社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区”
01
应用程序编程接口(API)
应用程序编程接口,英文全称为Application Programming Interface[7](简称API),是一组定义了软件组件如何互相通信和交互的规则和协议。和用户接口(User Interface,简称UI)不同,API的目的是连接不同的软件,允许不同的软件应用程序之间共享功能和数据,而无需了解其内部实现细节。
API的表现形式一般是使用某种编程语言编写的函数(function)或者数据结构(data structure)。对一个应用程序中的编程接口进行定义和说明的文档被称为API规格说明(API specification)。公开的API和其对应的规格说明使得该应用程序开发者之外的开发人员能够调用这些API,并通过新编写的软件逻辑实现新功能或者对原有功能进行扩展。这使得开发人员能够构建更加模块化、可扩展和可重用的软件。API在现代软件开发中起着重要作用,它们促进了分布式系统、微服务架构和应用程序集成。通过使用API,开发人员可以利用现有功能,加快开发速度,提高代码的可维护性和可重用性。
02
自动化API测试
随着软件技术的发展,由于软件结构的高度复杂和软件开发周期的不断缩短,为了确保应用程序的质量和安全,API自身的功能正确性和使用安全性越来越重要,能快速有效地对API进行测试是关键。API测试是一种直接对API进行测试的软件测试技术,主要用于保证开发人员所编写的API满足给定的功能目标、性能目标和安全目标。
现代软件的架构大部分采用模块化和分层化的模式,各模块和层次之间通过API进行功能交互和数据传输。当某个模块或者软件层提供的API存在软件错误(bug),那么依赖该模块或者该软件层的其他模块和软件层自身功能也将出现错误。最坏情况下可能导致应用程序整体出错,影响用户使用体验,危害用户数据安全。因此,API测试是非常必要且需要重视的一个软件开发流程阶段。当API测试足够充分并且结果表明被测API正确无误时,使用这些API构建的应用程序或者程序功能才有基础的质量和安全保障。
从最初的软件开发瀑布模型(Waterfall model)到时下流行的敏捷开发(Agile development)和DevOps,软件开发周期不断缩短,使得如何高效保障应用程序的质量和安全受到更多的关注,也就催生了自动化测试(Automated testing)。API测试也顺势进入自动化时代。从通用自动化API测试技术(如单元测试、模糊测试)到特定编程语言的测试框架(如pytest[9]、JUnit[10]),从传统的应用程序编程库(library)API测试到Web场景下的RESTful API测试,自动化API测试技术得到广泛发展。
03
自动化API测试对象
自动化API测试的对象目前主要分为两种:函数级API(Function-level API)和RESTful API。前者是传统的程序编程库(或者称为第三方库)或者系统库中为开发者提供的API接口,需要开发者在软件代码中实际调用才能够发挥作用。后者则是在Web和云场景下广泛使用的具有REST规范的API,一般以客户端向服务器发起HTTP请求的形式呈现。对两者进行自动化测试在形式上相同,都需要测试人员编写特定的测试驱动进行API调用来完成测试,测试的重要内容也都是检查API调用的执行结果是否符合预期以及API执行过程中是否出现错误。而不同之处在于,函数级API通常运行在本地环境,而RESTful API运行在云端环境,API的调用形式不同,整体的交互环境和测试框架也有所差异。
3.1 函数级 API
函数级API(Function-level API)主要是指库API和系统调用。一般软件开发过程中,开发人员编写的单个函数或者软件模块中暴露的API接口也属于函数级API范畴。对于这一类API的自动化测试主要通过由开发人员编写的或者自动生成的测试驱动(test driver)完成。
库API指的是SDK(Software Development Kit)、标准库(Standard libraries)和第三方库(Third-party libraries)开放给软件开发人员调用的函数,如Android SDK和Python官方标准库中的API。库API通常是构建整个应用程序的基础,软件提供给用户的各种高级功能都将通过调用已有API或者组合已有API的方式实现,因此库API的正确性和安全性不言而喻。
系统调用(syscall)指的是操作系统中提供给开发人员进行用户空间和系统内核进行交互的接口,用于访问底层的操作系统功能,如Linux中的open、malloc和fork。
3.2 RESTful API
RESTful API通过直观简短的统一资源标识符(URI)定义资源,通过JSON、XML等文件格式进行数据传输。RESTful API使用基于HTTP动词的语义的操作来操作这些资源,例如GET、POST、DELETE和PUT。在处理HTTP请求期间,API可能需要从数据库读取/写入数据,并与其他web服务通信。测试RESTful API不仅需要为不同的端点编写HTTP消息,还需要选择正确的查询参数,以及正文有效载荷消息。
本文系统介绍了应用程序编程接口(API)的概念及其在软件开发中的作用与重要性,重点分享自动化API测试的发展历程与测试对象。后续,在基于应用程序编程接口(API)的自动化测试(下)中,笔者将深入剖析单元测试、模糊测试等当前主流的自动化API测试形式与技术。
参考文献:
[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. DOI:https://doi.org/10.1109/ICSE.2019.00083
[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. DOI:https://doi.org/10.1145/3338906.3340456
[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. DOI:https://doi.org/10.1109/ComputationWorld.2009.116
[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. DOI:https://doi.org/10.1145/3510003.3510228
[5] Kyriakos Ispoglou, Daniel Austin, Vishwath Mohan, and Mathias Payer. 2020. {FuzzGen}: Automatic Fuzzer Generation. 2271–2287. Retrieved July 5, 2023 from https://www.usenix.org/conference/usenixsecurity20/presentation/ispoglou
[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. DOI:https://doi.org/10.1109/ICSE.2007.37
[7] 2023. API. Wikipedia. Retrieved August 16, 2023 from https://en.wikipedia.org/w/index.php?title=API&oldid=1170248429
[8] 2023. EvoMaster: A Tool For Automatically Generating System-Level Test Cases. Retrieved August 16, 2023 from https://github.com/EMResearch/EvoMaster
[9] pytest: helps you write better programs — pytest documentation. Retrieved August 16, 2023 from https://docs.pytest.org/en/7.4.x/index.html
[10] JUnit 5. Retrieved August 16, 2023 from https://junit.org/junit5/
[11] libFuzzer – a library for coverage-guided fuzz testing. — LLVM 18.0.0git documentation. Retrieved August 16, 2023 from https://www.llvm.org/docs/LibFuzzer.html