探索API测试的奇妙世界:总结与思考!

news2025/1/20 5:53:51

本文主要是关于 API 测试的方法论探讨。

什么是 API 测试?

API 测试是一种软件测试,涉及验证和确认应用程序接口 ( API ) 及其与其他服务组件的交互。测试重点关注软件架构的业务逻辑层,确保API按预期运行、数据准确交换、服务在各种条件下可靠且高性能。

API测试是在无用户界面的逻辑层进行的,通过工具向API发送调用、获取输出并记录系统的响应。输入可以采用 REST、SOAP 或其他 Web 服务调用的形式,输出通常采用 HTTP 状态代码、JSON、XML 或其他数据格式的形式。

API测试是自动化的以提高效率,可以包括:

  • 功能测试:验证API是否能够正确执行预期的功能。

  • 可靠性测试:测试API在数据传输过程中的一致性和完整性、异常情况下的表现。

  • 性能测试:通过模拟并发用户请求,测试API在高负载情况下响应时间、吞吐量和错误率。

  • 安全测试:测试API的安全性,包括身份验证、授权、数据加密等方面。

API 测试对于验证依赖于多个互连API服务的应用程序的核心功能至关重要。它可以及早发现问题并有助于保持高水平的服务质量。测试用例是根据API的规范设计的,断言用于根据预期结果验证响应。

为什么 API 测试很重要?

API 测试至关重要,因为它直接检查软件架构的业务逻辑层,提供业务功能缺陷和安全漏洞的早期检测。它允许测试各种软件组件和外部系统之间的交互,而无需用户界面。这会带来更快的测试执行速度和更好的测试覆盖率,因为API可以单独测试。

此外,API 测试对于DevOps和微服务等目前开发实践至关重要,这些实践中的服务经常更新和部署。它确保这些服务在集成到应用程序之前有效地通信并按预期运行,从而降低集成问题的风险。

API测试天然的支持自动化,这对于持续测试和持续交付至关重要。自动化API测试可以快速、频繁地运行,为开发团队提供即时反馈。这对于回归测试尤其重要,确保新的更改不会影响现有功能。

总之,API 测试是强大的软件测试策略的基本要素,可确保软件交互最关键级别的系统可靠性、性能和安全性。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

API测试有什么好处?

API 测试具有多种优势,可以提高软件系统的质量和可靠性:

  • 提前暴露问题:通过直接测试逻辑层,可以在开发周期的早期发现问题,从而节省时间和资源。

  • 测试与实现语言无关:无论构建应用程序使用何种语言,都可以进行API测试,从而实现更灵活的测试环境。

  • 无 GUI 测试:它无需用户界面即可测试核心功能,这在 UI 尚未开发或正在发生更改时非常有用。

  • 提高测试覆盖率:可以达到更多的条件和场景,包括那些难以通过UI测试的条件和场景。

  • 执行速度快:API 测试通常比 UI 的测试更快,从而带来更快的反馈和更高效的开发周期。

  • 稳定性:与 UI 测试相比,它们不太容易发生变化,从而产生更稳定的测试套件,需要更少的维护。

  • 集成测试:API测试可以作为集成测试的基础,确保应用程序的不同部分正确交互。

  • 安全性:它允许测试人员评估应用程序的安全性,例如访问控制、身份验证和数据加密。

  • 性能基准测试:它可用于评估负载下应用程序的性能和行为,帮助识别瓶颈并优化吞吐量和响应时间。

  • 自动化:API测试可以轻松实现自动化,集成到CI/CD流水线中,并在不同的环境中执行,提供有关系统运行状况的持续反馈。

API 测试有哪些不同类型?

不同类型的API 测试侧重于API的功能、可靠性、性能和安全性的各个方面。以下是一些关键类型:

  • 功能测试:验证API是否按预期运行、处理请求并返回正确的响应。

  • 验证测试:确保API满足规范和要求,包括数据验证和架构一致性。

  • 错误检测:识别错误情况并检查API如何处理不正确的输入或异常的用户行为。

  • UI 测试:对于具有用户界面组件的API,这会从用户的角度测试集成和功能。

  • 安全测试:评估API是否存在漏洞,确保数据得到正确加密、身份验证和授权。

  • 性能测试:衡量API在各种负载条件下的响应能力、吞吐量和稳定性。

  • 模糊测试:向API发送随机、格式错误或异常的数据,以检查崩溃、故障或安全漏洞。

  • 运行时/错误检测:在执行期间监视API,以检测正常操作期间发生的运行的问题和错误。

  • 渗透测试:模拟攻击以识别API中的安全弱点。

  • 合规性测试:验证API是否符合法规标准和合规性要求。

每种类型针对API的不同方面和层,确保全面的测试策略涵盖API功能和潜在问题的全部范围。

API测试常用的工具有哪些?

常用的API测试工具包括:

  • Postman:手动和自动测试的流行选择,提供用户友好的界面和脚本功能。

  • SoapUI:专门为 SOAP 和 REST API 测试设计的工具,提供广泛的测试功能。

  • JMeter:一个开源工具,主要用于性能测试,也可以进行API测试。

  • Apifox:国产的API一体化协作平台,支持API 文档、API 调试、API Mock、API 自动化测试。

  • Rest-Assured:一种 Java DSL,用于简化 RESTful API 的测试,与现有的基于 Java 的生态系统无缝集成。

  • Requests:是一个优雅而简单的 Python HTTP 库,可以用代码来模拟发送网络请求,并得到响应数据。

这些工具提供各种功能,包括测试脚本、响应验证以及与 CI/CD 流水线的集成,以满足不同的测试需求和偏好。

选择API测试工具应该考虑哪些因素?

选择API测试工具时,建议考虑以下因素:

  • 协议兼容性:确保该工具支持您的应用程序使用的 API 协议和数据格式,例如 REST、SOAP 或 gRPC。

  • 易于使用:寻找一个用户友好的界面来简化测试的创建、执行和维护。

  • 参数化和数据驱动测试:使用外部数据源进行动态测试用例的能力对于完整的测试至关重要。

  • 社区和支持:强大的社区和良好的支持对于故障排除和学习最佳实践非常宝贵。

  • 脚本语言:选择支持您的团队熟悉的脚本语言的工具,例如 JavaScript、Python 或  Java。

  • 自动化功能:该工具应促进 CI/CD 流水线内的轻松自动化,并与版本控制系统集成。

  • 报告和分析:详细的报告和分析有助于快速识别问题并跟踪测试覆盖率。

  • 可扩展性:使用插件或自定义代码扩展工具的能力对于复杂的测试场景非常重要。

  • 性能测试:该工具应提供性能测试功能,例如负载和压力测试。

  • 安全测试:寻找内置的安全测试功能来验证身份验证、授权和加密。

  • 成本方面:考虑工具的成本,包括购买成本、学习成本、维护成本、扩展性成本和集成成本。有些工具可能是免费的,但可能需要购买额外的插件或服务。

考虑因素有很多,但是我们只需要根据目前团队、业务情况,选择团队的技能相符、适合您的技术堆栈并满足您的测试需求的工具即可,不需要都考虑上述所有因素。

API测试包含哪些步骤?

API 测试涉及的步骤通常包括:

  • 定义API测试的范围:识别需要测试的端点和操作。

  • 了解API要求:查看API文档以了解预期的请求格式、头、参数和响应。

  • 设置测试环境:配置必要的参数,例如基本URL、身份验证凭据和所需的初始数据设置。

  • 创建测试用例:包含功能、可靠性、性能和安全性等各个方面的测试用例。包括有效、无效和极端情况场景。

  • 自动化测试用例:使用API 测试工具编写脚本来发送请求并验证响应。使用断言来检查正确的状态代码、响应时间和数据准确性。

  • 执行测试:针对API运行自动化测试用例。这可以手动完成,也可以作为CI/CD流水线的一部分完成。

  • 验证并记录结果:分析测试结果是否存在问题。记录任何失败测试的缺陷并记录结果。

  • 检查测试覆盖率:确保API的所有方面都经过测试,并根据需要更新测试用例以提高覆盖率。

  • 监控和维护:持续监控API是否存在任何性能问题,并维护测试用例以适应API中的任何更改。

  • 报告:编写测试报告,包括通过/失败的测试数量以及未发现的问题。

每个步骤对于保证对API的功能、可靠性、性能和安全性进行彻底评估都至关重要。

什么是 API 端点测试?

API端点测试是验证客户端和API之间各个交互点的过程。它确保端点使用适当的输入参数正确响应各种 HTTP 方法,例如 GET、POST、PUT 和 DELETE。此类测试侧重于:

  • 请求和响应结构:验证请求格式是否正确以及响应是否与预期格式匹配。

  • 数据验证:确保发送到端点和从端点接收的数据正确并遵守约束。

  • HTTP 状态代码:检查端点是否为各种场景返回正确的状态代码。

  • 错误处理:确认端点提供有意义的错误消息并正确处理错误。

  • 性能:评估端点在负载下的响应时间和行为。

在这种背景下,端点测试是API测试的一个重要方面,重点关注API外部接口的正确性和可靠性。

如何验证 API 测试中的响应

在API 测试中验证响应涉及多项检查,以保证API的行为符合预期。使用断言将实际响应与预期结果进行比较。关键验证点包括:

  • 状态代码:验证 HTTP 状态代码(例如,200 OK、404 Not Found)以确认响应成功或失败。

  • 响应时间:确保 API 在可接受的时间范围内响应,表明性能健康状况。

  • Headers:检查响应标头是否正确的内容类型、缓存策略和安全参数。

  • Body:验证响应有效负载的数据结构、数据类型和值是否正确。

  • 错误代码:对于错误响应,保证 API 返回适当的错误代码和消息。

  • 业务逻辑:确认响应符合业务规则和工作流程。

  • 数据完整性:如果API与数据库交互,验证返回的数据与数据库状态是否一致。

API测试中如何处理认证和授权?

在API 测试中处理身份验证和授权涉及验证API是否正确识别用户(身份验证)并授予适当的访问级别(授权)。处理方法如下:

  • 了解身份验证机制:常见方法包括基本身份验证、OAuth、API密钥和 JWT(JSON Web 令牌)。确定API使用哪种方法。

  • 生成有效凭据:对于自动化测试,您需要一组有效凭据或令牌。这可能涉及初步API调用以生成令牌或使用预先生成的长期令牌进行测试。

  • 在API请求中包含凭据:根据身份验证方法,这可能意味着向 HTTP 请求添加标头、cookie 或参数。例如,使用基本身份验证,您可以添加Authorization包含 base64 编码的用户名和密码的标头。Authorization: Basic<base64-encoded-credentials>

  • 使用无效/过期的凭据进行测试:验证API在提供无效凭据或令牌过期时正确拒绝访问。

  • 验证授权:通过尝试使用不同用户角色访问资源来测试API是否强制执行正确的权限级别。验证每个角色只能访问其应有的权限。

  • 自动化凭证管理:在测试自动化框架中,实现一种自动处理令牌生成和更新的方法,特别是在令牌过期时间很短的情况下。

  • 安全存储凭据:使用环境变量或存储数据系统在测试自动化环境中存储和访问凭据,避免硬编码敏感信息。

  • 检查响应代码和消息:检查API返回合适的身份验证和授权场景的 HTTP 状态代码和消息,例如401 Unauthorized或403 Forbidden。

API 测试在持续集成/持续部署 (CI/CD) 中重要性?

API 测试通过验证应用程序接口满足功能、可靠性、性能和安全标准,在CI/CD流水线中发挥着关键作用。在CI/CD中,每次代码提交都会触发自动构建和测试过程,其中包括用于验证不同软件组件之间交互的API测试。

在 CI/CD 中,API 测试的作用:

  • 验证新的代码更改没有影响现有的 API 功能。

  • 能够及早发现缺陷,减少修复所需的成本和工作量。

  • 在完整系统环境中集成服务之前,有助于单独测试 API。

  • 支持DevOps实践所必需的快速反馈循环,使开发人员能够立即收到有关其变更影响的信息。

  • 自动执行API 回归测试,确保增强功能或错误修复不会引入新问题。

  • 协助监控每次部署的 API 性能,保持应用程序的响应能力和效率。

  • 通过合并自动安全测试来检查 API 中的漏洞,有助于确保安全。

通过将API 测试集成到 CI/CD 流水线中,团队可以保持高质量标准,同时提升软件迭代交付效率,从而在生产中实现更可靠、更强大的应用程序。

API 测试如何和敏捷迭代模式配合?

将API测试集成到敏捷模式中需要使测试活动与迭代开发周期保持一致。首先将API 测试纳入用户故事和验收标准中,确保从一开始就考虑API功能。在制定计划期间,分配API测试用例创建和自动化任务,使它们与开发工作进度保持一致。

利用测试驱动开发(TDD) ,在实际API代码之前编写API测试,确保代码从一开始就满足测试要求。在sprint中,将API 测试作为完成定义的一部分,以确保在考虑功能完成之前对API进行全面测试。

利用持续集成(CI)在代码提交时自动触发API测试。这确保了对变更影响的即时反馈。在每日站立会议中,讨论API测试的状态和结果,以使团队随时了解情况并及时解决问题。

合并与敏捷项目管理工具良好集成的测试自动化框架,实现测试用例、用户故事和缺陷之间的可追溯性。应用模拟和服务虚拟化来独立于 API 的依赖关系来测试API,从而允许隔离测试并与开发并行。

最后,培养开发人员、测试人员和产品所有者之间的协作文化,鼓励共同承担API质量责任,并促进快速解决通过API 测试发现的问题。

API测试在微服务架构中的作用?

在微服务架构中,API 测试在确保每个服务能够与其他服务有效通信以及整个系统按预期运行方面发挥着关键作用。鉴于微服务被设计为松散耦合且可独立部署,API 测试对于验证服务间契约和交互至关重要。

此上下文中的API 测试侧重于:

  • 服务隔离:隔离测试各个微服务,以验证它们正确执行其特定功能。

  • 集成点:验证服务是否通过 API 彼此无缝交互,这涉及检查数据流、错误处理和回退机制。

  • 端到端的工作流程:确保微服务的组合运行满足整体业务需求。

  • 版本控制:检查 API 版本控制是否得到正确处理,以避免在服务独立更新时发生重大更改。

  • 服务发现:确认服务可以在不断发展的生态系统中动态发现并相互通信。

通过在微服务架构中严格测试API,团队可以及早发现问题、减少服务间依赖并保持高水平的服务自治。这对于实现微服务承诺的可扩展性、灵活性和弹性至关重要。此外,API 测试通过自动验证服务集成来支持CI/CD流水线,这对于快速可靠地交付基于微服务的应用程序至关重要。

API测试中的契约测试是什么?

契约测试是一种API测试方法,其主要目的是验证不同服务之间的交互是否符合事先约定的“契约”。这个“契约”定义了消费者(例如客户端应用程序)和提供者(例如Web服务)之间的预期请求和响应。

在契约测试中,消费者和提供者根据事先商定的契约进行通讯,这个契约被视为单一的事实来源。消费者测试的目标是验证客户端是否能够正确生成符合契约规范的请求。而提供者测试的目标是确保服务能够处理这些请求并返回符合契约的响应。

Pact是一种流行的契约测试工具,它允许开发人员将契约定义为代码,并提供一个在消费者和提供商之间共享这些契约的平台。合同被版本化以安全地管理变更。

契约测试的主要目标是在将服务部署到生产之前检测服务之间的任何不兼容性。这在服务独立开发和部署的微服务架构中尤为重要。

契约测试不会取代其他形式的API 测试,而是通过关注交互契约来补充它们,这可能是集成测试中的盲点。它提供快速反馈和信心,确保应用程序的独立可部署单元将按预期协同工作。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1455236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式调试工具之GDB

在单片机开发中&#xff0c;我们可以通过集成式的IDE 来进行调试&#xff0c;比如 MDK、IAR 等。 GDB 工具是 GNU 项目调试器&#xff0c;基于命令行使用。和其他的调试器一样&#xff0c;可使用 GDB工具单步运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等&#…

SHERlocked93 的 2023 年终总结

工作之后感觉一年一年过的太快&#xff0c;没有个记录连回忆都无从回忆起&#xff0c;之前的年终总结&#xff1a; SHERlocked93 的 2022 年终总结SHERlocked93 的 2021 年终总结SHERlocked93 的 2020 年终总结SHERlocked93 的 2019 年终总结SHERlocked93 的 2018 年终总结SHER…

使用C++,实现高精度加减乘除法运算!

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 我的专栏&#xff1a; \mathcal{{\color{Green} 我的专栏&#xff1a;} } 我的专栏&#xff1a; 《精选文章》《算法》《每日一道编程题》《高精度算法》 文章目录 前言高精度计算初始模版string 转…

【python】网络爬虫与信息提取--正则表达式

一、正则表达式 正则表达式是用来简洁表达一组字符串的表达式。是通用的字符串表达框架&#xff0c;简洁表达一组字符串的表达式&#xff0c;针对字符串表达“简洁”和“特征”思想的工具&#xff0c;判断某字符串的特征归属。 用处&#xff1a;表达文本类型的特征&#xff1b;…

练习题解(关于最短路径)

目录 1.租用游艇 2.邮递员送信 3.【模板】单源最短路径&#xff08;标准版&#xff09; 1.租用游艇 P1359 租用游艇 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 输入数据&#xff1a; 3 5 15 7 因为这道题数据不大&#xff0c;所有我们直接使用Floyd 算法。 这道题大…

网络防御保护——防火墙综合实验

一.实验拓扑 二.实验要求 1.办公区设备可以通过电信和移动两条链路上网(多对多的nat&#xff0c;并且需要保留一个公网ip不能用来转换)。 2.分公司设备可以通过移动链路和电信链路访问到dmz区域的http服务器。 3.分公司内部客户端可以通过公网地址访问到内部服务器。 4.FW1和FW…

使用 cgroup 时踩过的坑

1 cgroup 介绍 1.1 cgroup 介绍 cgroup 全称 control group&#xff0c;控制组。通过 cgroup 可以限制应用使用的资源&#xff0c;资源包括 cpu、内存、磁盘 io、网络等。 工作中经常使用的 docker 容器就使用了 cgroup 进行资源限制和隔离&#xff0c;cgroup 是 docker 的基…

不坑盒子 助力高效办公的Office插件

不坑盒子简介 很多朋友在工作过程中需要对Word文档进行编辑处理&#xff0c;如果想让Word排版更有效率可以试试小编带来的这款不坑盒子软件&#xff0c;是一个非常好用的办公工具&#xff0c;拥有近百项功能的Word&#xff0c;wps插件&#xff0c;支持Office 2010以上的版本&a…

FLUENT Meshing Watertight Geometry工作流入门 - 9 生成体网格

本视频中学到的内容&#xff1a; 讨论体网格的重要性&#xff0c;并了解生成体网格的不同方法 了解体网格质量&#xff0c;以及如何改进 视频链接&#xff1a; FLUENT Meshing入门教程-9生成体网格_哔哩哔哩_bilibili 体网格生成是使用大量离散体积或单元来离散化/表示计算模…

网络模型及传输基本流程

1.OSI 七层模型 OSI &#xff08; Open System Interconnection &#xff0c;开放系统互连&#xff09;七层网络模型称为开放式系统互联参考模型&#xff0c;是一个逻辑上的定义和规范; 把网络从逻辑上分为了 7 层 . 每一层都有相关、相对应的物理设备&#xff0c;比如路由器…

单片机学习笔记---AD模数转换DA数模转换

目录 AD模数转换 XPT2046.c XPT2046.h main.c DA数模转换 main.c 上一篇博客讲了AD/DA转换的工作原理&#xff0c;也介绍了运算放大器的工作原理&#xff0c;这节开始代码演示&#xff01; AD模数转换 新创建一个工程&#xff1a;AD模数转换 第一个工程将用到LCD1602和…

入门者拿捏 Java 的必备小秘诀

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能…

将python flask项目打包成可以用运行的软件(包含报错解决)

将python flask项目打包成可以用运行的软件&#xff08;包含报错解决&#xff09; 准备好要打包的flask项目&#xff0c;如下图run.py文件的代码 导入打包函数库pyinstaller pip install pyinstaller执行打包指令&#xff0c;参数如下表所示 命令解释pyinstaller -F run.py…

安装部署k8s集群

系统&#xff1a; CentOS Linux release 7.9.2009 (Core) 准备3台主机 192.168.44.148k8s-master92.168.44.154k8s-worker01192.168.44.155k8s-worker02 3台主机准备工作 关闭防火墙和selinux systemctl disable firewalld --nowsetenforce 0sed -i s/SELINUXenforcing/SELI…

C++模板进阶操作 —— 非类型模板参数、模板的特化

C模板进阶 非类型模板参数模板的特化概念 函数模板特化类模板特化全特化 偏特化模板总结 非类型模板参数 模板参数可分为类型形参和非类型形参。 类型形参&#xff1a; 出现在模板参数列表中&#xff0c;跟在class或typename关键字之后的参数类型名称。 非类型形参&#xff1a…

基于springboot智慧外贸平台源码和论文

网络的广泛应用给生活带来了十分的便利。所以把智慧外贸管理与现在网络相结合&#xff0c;利用java技术建设智慧外贸平台&#xff0c;实现智慧外贸的信息化。则对于进一步提高智慧外贸管理发展&#xff0c;丰富智慧外贸管理经验能起到不少的促进作用。 智慧外贸平台能够通过互…

第三百五十三回

文章目录 1. 概念介绍2. 使用方法2.1 获取所有时区2.2 转换时区时间 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享一些好的Flutter站点"相关的内容&#xff0c;本章回中将介绍timezone包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

基于Robei EDA--实现串口数据包接收

一、定义串口传输协议帧 控制字的数据大小为一字节&#xff0c;定义帧头为&#xff08;0xFE 0xDF&#xff09;帧尾为&#xff08;0xEF&#xff09; 模块框图 内模块&#xff1a;串口接收&#xff0c;output&#xff1a;8位data 串口命令&#xff1a;对单字节数据接收进行缓存…

问界M7卖爆了,只因这三点做得好!

文 | AUTO芯球 作者 | 雷歌 理想真是懵了个大圈&#xff01; 2月第一周的新能源汽车销量榜单已经出来&#xff1a;理想7200台的销量&#xff0c;被华为问界9000辆的销量远远甩在身后。 要知道&#xff0c;1月第四周&#xff0c;理想还以8500辆领先问界的8300辆。 更绝的是&…

算法学习——LeetCode力扣二叉树篇4

算法学习——LeetCode力扣二叉树篇4 222. 完全二叉树的节点个数 222. 完全二叉树的节点个数 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xf…