0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于应用程序编程接口(API)的自动化测试(下)

上海控安 来源:上海控安 作者:上海控安 2023-09-20 17:16 次阅读

作者 |黄杉华东师范大学软件工程学院博士

苏亭 华东师范大学软件工程学院教授

版块 |鉴源论坛 · 观模

社群 |添加微信号TICPShanghai”加入“上海控安51fusa安全社区”

上文“基于应用程序编程接口(API)的自动化测试(上)”中,系统介绍了应用程序编程接口(API)的概念及其在软件开发中的作用与重要性,重点分享自动化API测试的发展历程与测试对象。

本文将深入剖析单元测试、模糊测试等当前主流的自动化API测试形式与技术。

04

自动化API测试形式与技术

对API进行自动化测试一般使用单元测试(Unit testing)的测试形式,这也是当下敏捷开发的重要组成部分。随着模糊测试的兴起,针对API的模糊测试(API fuzzing)成为当下流行的API测试技术。下面将从单元测试和模糊测试两部分对自动化API测试形式和技术进行介绍。

4.1单元测试(Unit Testing)

单元测试(Unit Testing)又称为模块测试,是一种测试形式(或称测试框架),它针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小的测试部件。在过程化编程中,单元测试由单个API或者多个API组合完成;对于面向对象编程,单元测试由单个或者多个类的方法以及对象之间的交互操作完成。单元测试主要由开发人员手动编写(如Junit、pytest),也可以通过一些自动测试用例生成技术(如Randoop[6]、GraphFuzz[4])完成。

单元测试的一般流程为:(1)编写或生成单元测试用例,其中包含测试环境初始化、调用被测API完成相应功能、检查调用结果;(2)执行单元测试用例,收集执行结果,统计成功的测试用例和失败的测试用例,失败的测试用例表明API实现中存在错误或缺陷。无论是函数级API还是RESTful API,使用单元测试这种测试形式都十分有效。

wKgaomUKuGSAD-nOAABYbYduBbU190.png

图 1 Junit单元测试示例

如图 1所示,这是一个使用Junit单元测试框架编写的Java单元测试用例。“@Test”表示该函数执行一个单元测试用例,其中首先初始化一个AdderImpl对象,并调用该对象的add方法,传入1和2这两个参数,最终判断add方法的返回结果是否为3。如果结果不为3,则该单元测试失败,表示add方法实现出错,反则成功。

4.2API模糊测试 (Fuzz Test)

模糊测试(Fuzz test)是一种自动化测试技术,其核心组件模糊器(Fuzzer)可以基于语法规则直接生成测试用例,也可以基于已有测试用例进行编译生成测试用例。由于模糊器可以生成多样的测试用例,这些测试用例相比于开发人员编写的测试更有可能触发程序中的边界条件和更多样的测试场景,因此模糊测试在测试软件鲁棒性和软件漏洞挖掘中非常有效。

针对API的模糊测试流程和一般针对二进制程序的模糊测试流程相同:模糊器从种子库中选取种子进行变异或者直接根据语法规则生成测试用例,执行测试用例,监测执行过程并检查执行结果,当执行过程中出现崩溃或者执行结果与预期不符,则认为找到了潜在的API错误。

4.2.1 针对函数级API的模糊测试

LLVM项目中的Libfuzzer[11]是一款进程内的由覆盖率引导的进化型模糊引擎。它通过读取用户提供的种子(特定的程序输入或者API调用参数),对种子进行变异生成新的测试用例输入并传递给由用户编写的测试驱动,从而实现API模糊测试。

wKgZomUKuGWAE9h-AAAa6KeuqSc408.png

图 2 Libfuzzer测试驱动示例

图 2是一个Libfuzzer测试驱动示例,Libfuzzer生成的测试输入将通过Data参数传入测试驱动,用户则会将该测试输入在经过适当处理后传递给被测API,从而对API进行测试。值得注意的是,在Libfuzzer的测试驱动中,开发人员同样可以编写条件检查来达到单元测试的效果。

Libfuzzer初步解决了测试输入生成,而对API的模糊测试难点在于如何触发更深层次的API行为。为了更高效地对函数级API进行测试,研究人员们对如何高效地自动化生成测试驱动进行了研究,即如何自动化地构造有效的API调用序列和API执行环境和程序片段。

FUDGE[2]是一个通过对代码切片进行合成来生成模糊测试候选驱动的工具。FUDGE的核心见解是,以有效且有用的方式执行库函数的模糊测试驱动可以通过代码库中的现有代码片段合成。FUDGE的整体流程如图 3所示,在完成模糊测试驱动生成后,FUDGE会将生成的驱动交给开发人员进行评估。

wKgaomUKuGWAAQdeAAA96QlDYvA184.png

图 3 FUDGE整体流程

FuzzGen[5] 利用整个系统分析来推断库的接口并专门为该库合成模糊测试驱动。FuzzGen不需要开发人员的参与,并且可以广泛应用于多种编程库。FuzzGen的核心思想是系统中的现有代码在多个方面利用编程库。如图 4所示,它从系统中已有使用库的代码出发,通过对整个系统进行分析,先确定哪些是API,再从控制流和数据流两方面整理出抽象API依赖图(A2DG)。这个过程需要确定每个参数的可能值和类型,并分析参数之间的依赖关系。最后,基于依赖图生成libFuzzer的桩代码,从而进行不需人工干预、能较好地平衡宽度和深度的模糊测试。

wKgZomUKuGaASw6EAAEun4EbbRM769.png

图 4 FuzzGen的核心思想示意图

GraphFuzz[4]则是通过将整个API调用序列表示为一个数据流图,然后在数据流图中进行给定的变异操作进行API调用序列构造。图 5列举了三种GraphFuzz支持的数据流图变异操作:删除、插入和串联。

wKgaomUKuGeAE78rAABNm2HbAVk764.png

图 5 GraphFuzz支持的部分变异操作

除了泛用性的针对函数级API的模糊测试方法的研究工作外,还有特别针对系统调用的模糊测试方法的研究工作,这些研究工作都着力于解决如何构造API调用能够探索更深层次的API使用场景这一挑战。

4.2.2 针对RESTful API的模糊测试

早期Chakrabarti[3]等人提出了黑盒的、基于规范的RESTful API测试方法,其中测试用例需要使用一种基于XML的可扩展测试规范语言进行手工构造。但手工构造测试用例需要较多的人工开销,后来的工作通过从OpenAPI或者Swagger规范中提取RESTful API的接口信息,从而实现了测试用例的自动化生成。

EvoMaster[8]是一个使用进化算法来生成RESTful API测试用例的基于搜索的模糊测试工具,这也是一款完全自动化的黑盒测试工具。它在测试RESTful服务内部更深层次的逻辑方面更有效,因为它可以搜集和使用有关服务目标的更多信息来指导测试用例生成。

RESTler[1]是第一个有状态基于广度优先探索的RESTful API模糊测试器。RESTler 通过分析云服务的 API 规范,生成请求序列并自动调用云服务的API对其测试。RESTler首先会通过读取Swagger接口文档(图 6给出了Swagger接口文档的示例)对API返回结果之间的依赖关系进行推断,然后生成合法的API调用序列。然后,RESTler会根据执行API调用序列过程中服务器返回的状态码来修改原有的API调用序列,使其避免生成无效的API调用序列。

wKgZomUKuGeAEbLvAAEk4DKy3T0078.png

图 6 Swagger接口文档示例

05

总结

自动化API测试有较长的历史,其自身也在不断演化进步。针对函数级API的自动化测试在泛用方法研究的基础上,目前也出现了一些针对特殊编程语言和特殊API场景的研究,如针对Rust library和深度学习库(PyTorch、TensorFlow)的自动化测试方法研究。针对RESTful API的自动化测试也是继SOAP测试之后出现的web 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.

[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

审核编辑 黄宇


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 自动化测试
    +关注

    关注

    0

    文章

    204

    浏览量

    26890
  • 接口
    +关注

    关注

    33

    文章

    8486

    浏览量

    150805
  • API
    API
    +关注

    关注

    2

    文章

    1483

    浏览量

    61797
  • 编程
    +关注

    关注

    88

    文章

    3587

    浏览量

    93578
收藏 人收藏

    评论

    相关推荐

    OPhone自动化测试技术概述

    本文将对OPhone平台上可采用的几种自动化测试技术进行介绍,并对每种技术的优缺点做简要的总结。OPhone台除了为应用程序开发提供丰富的API外,也为开展
    发表于 05-06 08:58

    自动化测试框架思想和构建

    自动化测试一般是指软件测试自动化,软件测试就是在预设条件运行系统或
    发表于 07-18 06:52

    JavaScript API自动化测试方案的管理设计与实现

    Logcat并写入,最终写成方案并测试,在应用程序中,JavaScript API作为连接程序与web页面的桥梁,扩展了内嵌web页面的JavaScript的能力,为web应用带来更好
    发表于 11-07 11:10 5次下载
    JavaScript <b class='flag-5'>API</b><b class='flag-5'>自动化</b><b class='flag-5'>测试</b>方案的管理设计与实现

    Android应用程序GUI遍历自动化方法

    和性能。 为了提高应用程序自动执行技术的图形用户界面( GUI)覆盖率和自动化程度以满足Android应用
    发表于 12-09 11:06 0次下载
    Android<b class='flag-5'>应用程序</b>GUI遍历<b class='flag-5'>自动化</b>方法

    什么是自动化测试框架?

    同一个应用程序的不同模块上工作时,以及当我们希望避免每个开发人员实现自己的自动化方法的情况,需要一个统一的标准测试自动化框架。
    的头像 发表于 11-03 10:33 4311次阅读

    使用Postman成功实现API测试自动化的最佳实践

      API 测试自动化支持两个独立软件系统之间的通信和数据交换。实现 API 的软件系统包含可由另一个软件系统执行的功能/子例程。它通过增加测试
    的头像 发表于 06-20 10:19 898次阅读

    使用Postman成功实现API测试自动化的最佳实践

      API 测试自动化支持两个独立软件系统之间的通信和数据交换。实现 API 的软件系统包含可由另一个软件系统执行的功能/子例程。它通过增加测试
    的头像 发表于 07-05 10:46 928次阅读

    使用Postman成功实现API测试自动化的最佳实践

    API代表应用程序编程接口,用于通过使用任何通信模式来平滑两个不同应用程序之间的交互。每次您在智能手机上查看天气或火车时间时,您都在使用
    的头像 发表于 12-08 15:01 642次阅读
    使用Postman成功实现<b class='flag-5'>API</b><b class='flag-5'>测试</b><b class='flag-5'>自动化</b>的最佳实践

    跨平台移动应用程序测试自动化框架确保质量与速度

      随着市场上推出的移动应用程序数量不断增加,测试工程师努力在移动应用程序在在线市场上发布之前满足所有测试用例。在现实世界中,它们总是悄悄潜入,并且经常重新出现,即使使用最佳的手动
    的头像 发表于 12-09 14:21 708次阅读

    测试自动化中的Python

      用于测试编程需要与开发应用程序编程不同的方法。如果你想要一种专门用于测试编码的简单而精简的语言,Python 是一个不错的选择。Py
    的头像 发表于 12-09 14:53 797次阅读

    如何自动化测试你的接口

    不知道大家的项目是否都有对接口API进行自动化测试,反正像我们这种小公司是没有的。由于最近一直被吐槽项目质量糟糕,只能研发自己看看有什么接口
    的头像 发表于 04-07 15:29 1221次阅读
    如何<b class='flag-5'>自动化</b><b class='flag-5'>测试</b>你的<b class='flag-5'>接口</b>?

    什么是自动化测试框架

    自动化测试框架,即是应用于自动化测试所用的框架。按照框架的定义,自动化测试框架要么是提供可重用的
    发表于 04-18 14:44 873次阅读

    基于Raspberry PI的应用程序的典型场景家庭自动化

    电子发烧友网站提供《基于Raspberry PI的应用程序的典型场景家庭自动化.zip》资料免费下载
    发表于 06-13 11:05 0次下载
    基于Raspberry PI的<b class='flag-5'>应用程序</b>的典型场景家庭<b class='flag-5'>自动化</b>

    接口自动化测试流程讲解 企业接口自动化测试步骤

    接口自动化测试是指通过编写脚本或使用自动化工具,对软件系统的接口进行测试的过程。
    发表于 07-28 14:54 2147次阅读
    <b class='flag-5'>接口</b><b class='flag-5'>自动化</b><b class='flag-5'>测试</b>流程讲解 企业<b class='flag-5'>接口</b><b class='flag-5'>自动化</b><b class='flag-5'>测试</b>步骤

    基于应用程序编程接口API)的自动化测试(上)

    本文系统介绍了应用程序编程接口API)的概念及其在软件开发中的作用与重要性,重点分享自动化API
    的头像 发表于 09-01 11:17 593次阅读