基于嵌入式计算机软件测试关键性技术研究
2023-12-04吴舒蓉
吴舒蓉
(福建省农村信用社联合社 福建 福州 350004)
0 引言
随着嵌入式计算机在生产和生活中的广泛应用,它的可靠性和安全性变得愈加重要,嵌入式计算机软件的可靠运行是保证日常生产生活顺利进行的关键。 嵌入式计算机软件是嵌入式系统中最复杂的部分之一,对嵌入式计算机软件进行测试,可以及时发现软件运行中的问题和代码错误,对软件中问题的及时修正和软件改进有很大的帮助[1]。
1 嵌入式计算机软件和嵌入式计算机软件测试的定义与特点
1.1 定义
嵌入式计算机软件是指运行在嵌入式计算机系统中的应用程序或操作系统等。 嵌入式计算机是集成在其他设备中的微处理器系统,通常用于控制和监测设备。 与传统的桌面计算机和服务器不同,嵌入式计算机通常需要满足资源占用少、功耗低、稳定可靠等要求[2]。 嵌入式计算机软件测试是验证嵌入式计算机软件正确性、完整性和安全性的过程,包括功能测试、性能测试、安全测试等。
1.2 特点
嵌入式计算机作为其他设备的一部分,通常与其他设备紧密耦合,且嵌入式计算机通常内存容量较小,数据处理能力也较弱,因而在嵌入式计算机软件测试时,必须考虑到资源受限以及资源占用的问题。 此外,嵌入式计算机的运行环境通常较为复杂,需要与多种外设设备交互,因而嵌入式计算机软件测试还需要考虑软件在真实的环境条件中测试是否顺利的问题。
2 嵌入式计算机软件测试的现状及面临的挑战
2.1 研究现状
随着嵌入式计算机技术的不断发展,嵌入式计算机软件测试也在不断地演进和完善。 目前,嵌入式计算机软件测试的主要方法包括仿真测试、静态分析、动态测试、自动化测试等。 在实际应用中,各种测试方法相互结合,以提高测试效率和准确性。
随着仿真技术的不断发展和成熟,仿真测试已经成为嵌入式计算机软件测试中的重要手段。 嵌入式计算机的运行通常与外设设备有关,因此采用动态测试技术进行测试是非常必要的。 自动化测试是指利用脚本或程序自动执行测试用例,以提高测试效率和准确性。 对于嵌入式计算机的测试,如何实现自动化测试,是需要研究的关键技术[3]。
2.2 面临的挑战
尽管目前嵌入式计算机软件测试技术已经发展得较为成熟,但嵌入式计算机软件测试技术的发展依然面临着许多挑战。 首先,嵌入式计算机软件测试的复杂性不断增加的问题,随着嵌入式计算机系统的不断升级和改革,系统设计的复杂程度也在不断提高,如何将日益复杂的测试需求简单化,对复杂系统进行全面的测试,依然是研究人员需要考虑的问题。 其次,嵌入式计算机软件的安全性测试问题依然突出,随着互联网和物联网技术的发展成熟,嵌入式计算机软件面临的安全环境越来越复杂。 如何针对嵌入式计算机软件的特点,进行安全测试和漏洞检测,提高嵌入式计算机软件代码的测试覆盖率和有效性,实现自动化测试,提高测试效率和准确性,也是下一步的研究重点。
3 嵌入式计算机软件测试关键技术
进行嵌入式计算机软件测试首先要进行软件需求分析,其次是测试用例的设计,测试的执行以及缺陷的追踪和修复,最后是测试文档的编写和提交,如图1 所示。
图1 嵌入式计算机软件测试流程图
下面是嵌入式计算机软件测试中的关键技术。
3.1 静态代码分析
静态代码分析是一种在编译之前或不运行程序的情况下对代码进行检查和分析的技术,该技术可以对源代码进行静态检测,发现代码中如未初始化变量、内存泄漏、空指针引用等潜在缺陷和错误[4]。
静态代码分析工具通常依赖于规则库和算法,它们使用诸如控制流分析、数据流分析、符号执行等技术来找出代码中的错误。
静态代码分析可用于各个开发阶段,包括需求分析、设计、编码和测试。 它可以帮助开发人员更早地发现并纠正问题,以减少修复成本并加快开发周期。 另外,还可以帮助确保代码符合标准和最佳实践,提高代码质量和可维护性。
常见的静态代码分析工具包括Coverity、Lint 等。 这些工具通常支持多种编程语言,例如C/C++、Java、Python等,并提供了丰富的规则库和定制选项,以适应不同项目的需求。
3.2 动态测试
动态测试是一种程序运行时对其进行测试的技术。通常在软件完成编译和链接后进行,测试人员可以通过手动或自动化的方式,利用各种测试工具和框架来执行测试用例并收集测试结果[5]。
常见的动态测试方法包括黑盒测试、白盒测试、灰盒测试等。 其中黑盒测试是一种基于需求规格或功能说明书的测试方法,测试人员只需关注软件的输入和输出,而不需要了解内部实现细节;白盒测试则需要测试人员了解软件的内部结构和算法,以设计测试用例并检查验证程序的逻辑流程是否正确;灰盒测试则是介于黑盒测试和白盒测试之间的测试方法[6]。
动态测试工具通常需要程序员在代码中添加一些调试信息或钩子,以使得测试工具能够收集足够的数据并生成报告。 常见的动态测试工具包括Valgrind、Gcov、JMeter 等。
3.3 单元测试
该技术是一种粒度较小的测试方法,即对单个函数或模块进行测试,以确保其功能正确性。 单元测试作为一种软件测试技术,目标是通过测试程序的最小可测试部分来发现和纠正问题,从而尽早地消除潜在缺陷和错误。 它通常由开发人员编写并在开发过程中执行,以确保代码质量和可维护性。
嵌入式计算机软件测试中加入单元测试,可以更早发现在模块中的问题,可以确保代码符合标准和最佳实践,并避免代码复杂性和技术债务的累积。 单元测试也可以改善嵌入式计算机软件的可维护性,通过提高代码的可读性和可测试性,可以使得未来的修改和扩展更加容易和安全[7]。 常见的测试框架包括Google Test、JUnit、NUnit、Unity 等。 断言库则是一组用于检查程序输出是否符合预期的工具,通常使用在测试用例中的语句中。 断言库通常提供了丰富的比较操作符和错误消息,以使得开发人员能够更精确地描述和定位问题。
3.4 集成测试
集成测试是将多个模块组合起来进行测试,用于测试多个模块或组件之间的交互和协作是否正确。 它通常在单元测试之后进行,以确保不同模块的集成和整个系统的功能表现符合预期。 集成测试是一种必要的软件测试技术,它可以帮助测试人员在整个系统集成之前发现和纠正问题,以确保整个系统的正确性和鲁棒性。
集成测试分为自下而上的集成测试和自上而下的集成测试。 自下而上的集成测试是从最底层的模块开始逐步向上集成,直到整个系统集成完成。 自上而下的集成测试则是从整个系统开始逐步向下集成,最终涵盖所有模块和组件。
集成测试通常需要使用与实际系统环境相同的硬件和软件环境来进行测试,并通过模拟用户操作和各种场景来验证系统的功能和性能。
在进行集成测试时需要注意以下几点:
(1)测试顺序。 测试应该按照集成的顺序逐步进行,以确保已经集成的模块和组件是正确的,并能够与新集成的部分协同工作。
(2)测试数据。 为了获得高效和实际的测试结果,测试人员应该使用真实的数据,如真实的输入流和输出流。
(3)虚拟化。 如果测试受到硬件或网络的限制,可以使用虚拟化技术来模拟系统环境和资源。
(4)模拟。 测试人员应该考虑模拟不同的场景和条件,例如高负载、低带宽等。
(5)自动化:测试应该通过可靠的自动化测试框架来执行,以提高测试效率和覆盖率。
3.5 可靠性测试
可靠性测试通过长时间运行、较大数据量的输入,对软件系统的稳定性和可靠性进行测试,用于评估软件在给定条件下的稳定性、可用性和可靠性。 它通常在功能测试和性能测试之后进行,以验证系统在长时间运行和不断使用的情况下是否仍然保持良好的性能和质量。 常见的可靠性测试工具包括LoadRunner、JMeter、Appium、RapiTest、Tessy 等。
可靠性测试可以帮助开发人员找出潜在的缺陷和错误,并确定系统在特定条件下的故障率和失效率等指标。它需要模拟真实环境下的使用场景和负载,如高并发、高负载、长时间运行等,以测试软件的稳定性和鲁棒性。
可靠性测试通常需要使用各种工具和技术来执行,可靠性测试包括负载测试、异常测试、稳定性测试、可用性测试。 负载测试需要测试系统在不同负载下的性能,例如压力测试、容量测试、耐久测试等;异常测试用于测试系统对异常情况的响应和处理能力,例如网络中断、崩溃、数据损坏等;稳定性测试用于测试系统的稳定性和可靠性,例如运行时间长短测试、错误恢复测试等;可用性测试用于测试系统的易用性和用户界面设计,例如人机交互测试、多语言测试等。
可靠性测试需要注意以下几点:
(1)测试目标。 测试人员应该明确测试的目标和范围,并制定相应的测试计划和用例。
(2)环境模拟。 测试环境应该尽可能地模拟真实环境下的条件和负载,以确保测试结果的准确性和可靠性。
(3)测试数据。 测试数据应该足够多样化和真实,以覆盖各种情况和场景。
(4)自动化测试。 测试应该通过可靠的自动化测试工具来执行,以提高测试效率和覆盖率。
3.6 性能测试
性能测试常见的工具包括LoadRunner、JMeter 等。 通过模拟实际使用情况下的负载,用于评估系统在不同负载下的性能和稳定性。 它通常在开发过程中进行,并尝试模拟真实环境下的负载和使用情况,以确定软件的响应时间、吞吐量、并发性和可扩展性等指标。
性能测试可以帮助开发人员找出系统的瓶颈和性能问题,并提出改进建议,以确保系统在生产环境中具有良好的性能和可靠性。
性能测试主要分为负载测试、压力测试、容量测试、耐久测试、并发测试。 其中,压力测试用于测试系统在高负载下的性能和稳定性,例如同时连接多个用户、大数据量输入输出等;容量测试用于确定系统在预期的容量下的性能和稳定性,例如处理大量数据或请求时的表现;耐久测试用于测试系统在长时间运行下的性能和稳定性,例如连续运行数天或数周的测试;并发测试用于测试系统在多个用户同时访问情况下的性能和稳定性,例如并发用户登录、查询等。
性能测试通常需要使用各种工具和技术来执行,主要有以下几类:
(1)负载测试工具。 用于模拟真实环境下的负载情况和用户行为,例如JMeter、LoadRunner 等。
(2)性能分析工具。 用于监视系统性能指标并识别瓶颈,例如AppDynamics、Dynatrace 等。
(3)代码优化工具。 用于检测和修复代码中的性能问题和缺陷,例如GProf、Valgrind 等。
3.7 安全测试
安全测试通过模拟不同类型的攻击,测试系统的安全性能,以确保系统不会受到未授权访问或其他安全问题的影响。 安全测试主要通过模拟恶意攻击、验证身份认证和授权机制、检查数据加密和解密等方面来确定系统是否满足安全需求。 常见的安全测试工具包括开放式Web 应用程序安全项目(open web application security project zed attack proxy,OWASP ZAP)、Nmap、Nessus、Burp Suite、交互式反汇编器专业版(interactive disassembler professional,IDA Pro)、Ghidra 等。
安全测试可以帮助开发人员找出潜在的安全漏洞和缺陷,帮助开发人员和测试人员评估系统的安全性和保护能力,并在发现潜在风险时提供改进建议,以确保系统在生产环境中具有良好的安全性和保护能力。
安全测试主要分为漏洞扫描、渗透测试、认证和授权测试、数据加密测试、安全审核。 漏洞扫描使用自动化软件工具对系统进行扫描并识别未经授权访问或敏感数据泄露等问题;渗透测试使用手动或自动化工具对系统进行攻击并测试其响应和防御能力;认证和授权测试系统对用户身份认证和授权机制的有效性和正确性;数据加密测试用来测试系统中的敏感数据是否被合理地加密和解密;安全审核对系统架构、源代码、文档等进行审核,以发现安全问题和缺陷。 安全测试通常需要使用各种工具和技术来执行,常见的安全测试工具有Nessus、Burp Suite 等,漏洞数据库有美国国家安全漏洞库(National Vulnerability Database,NVD)、通用漏洞披露(Common Vulnerabilities & Exposures,CVE)等,反向工程和代码审查工具主要有IDA Pro、Ghidra等,常见的网络模拟器有Wireshark、Tcpdump 等。
安全测试需要注意以下几点:
(1)测试目标。 测试人员应该明确测试的目标和范围,并制定相应的测试计划和用例。
(2)模拟攻击。 测试应该尽可能地模拟真实环境下的攻击和威胁,以确保测试结果的准确性和可靠性。
(3)数据隔离。 测试过程中要避免污染真实数据,使用虚拟化或其他技术来隔离测试数据。
(4)安全性保护。 测试过程中要遵循安全原则,防止测试过程中导致系统被攻击或受到损害。
4 结语
对嵌入式计算机软件进行测试是保证软件运行质量和稳定性的重要手段,在具体测试时,需要针对其特点设计相应的测试方案和技术方法,并根据不同条件下的测试结果来对软件代码进行优化调整,以保证软件能够稳定运行并发挥出最佳性能。