ConAgent:基于代理的并发测试工具,用于为Qt项目生成测试数据
《Information and Software Technology》:ConAgent: Agent-based concolic testing to generate test data for Qt projects
【字体:
大
中
小
】
时间:2026年09月01日
来源:Information and Software Technology 4.6
编辑推荐:
摘要:
背景:Qt框架是开发跨平台应用程序最流行的框架之一。尽管混合测试和大型语言模型(LLMs)被广泛用于生成此类应用程序的测试数据,但这些方法在实现高覆盖率方面仍然存在局限性。具体来说,由于符号模型求解器(SMT)和符号执行的限制,混合测试无法有效支持Qt对象的派生类型。
摘要:
背景:Qt框架是开发跨平台应用程序最流行的框架之一。尽管混合测试和大型语言模型(LLMs)被广泛用于生成此类应用程序的测试数据,但这些方法在实现高覆盖率方面仍然存在局限性。具体来说,由于符号模型求解器(SMT)和符号执行的限制,混合测试无法有效支持Qt对象的派生类型。虽然基于LLM的方法可以缓解这些问题,但它们面临着幻觉相关的挑战。
目标:本文提出了一种方法,以解决这些方法的现有问题,从而实现高覆盖率。
方法:总体思路是结合混合测试和代理来生成测试数据并实现高覆盖率。ConAgent方法主要包括三个阶段:首先,基于代理的初始化阶段构建一个初始化提示,然后将其发送给代理生成器以生成一组初始测试数据;如果这组测试数据未能达到100%的覆盖率,针对每个包含未访问语句的测试路径,基于代理的简化阶段会创建一个简化提示,并使用代理生成器生成下一个测试数据;最后,如果基于代理的简化阶段无法提高代码覆盖率,多代理阶段将应用知识图谱(RAG)和专用代理来克服这一障碍。
结果:在GitHub上的知名项目上进行了实验。比较方法包括UT4UQ(第一个用于Qt项目的混合测试方法)和CoverUp(一种强大的基于LLM的测试方法)。所提出的方法在GPT-4o和DeepSeek 32B上分别比UT4UQ和CoverUp在语句覆盖率和分支覆盖率上提高了约25-45%和26-35%。此外,所提出的方法可以通过使用预训练模型(如DeepSeek 32B)在本地部署,同时实现与GPT-4o相当的覆盖率,并且在与CoverUp相比时显示出缩短执行时间的潜力。
结论:实验结果证明了ConAgent在实际应用中的有效性。
引言:
Qt框架是开发跨平台应用程序最常用的框架之一。该框架支持使用C++开发后端和前端组件。根据Qt公司在2017年发布的估计,超过70个国家的超过一百万开发者在他们的项目中使用了该框架[1][2]。为了确保Qt项目的质量,应进行大量的单元测试。这是研究人员和公司非常关注的话题。单元测试的主要目标是确保函数的质量。在这种情况下,被测试的函数被称为目标函数。单元测试主要有两种方法:黑盒方法[3][4]和白盒方法[5][6]。虽然黑盒方法不考虑Qt项目的内部结构,但白盒方法通过分析源代码来发现故障。因此,与黑盒方法相比,白盒方法能更好地发现目标函数中的潜在故障。因此,白盒方法通常用于评估高度关键的应用程序(如自动驾驶系统和无人机)的质量。白盒方法的输入是一个目标函数和一个覆盖率指标,输出是一组旨在最大化覆盖率指标的测试数据。最常见的覆盖率指标是语句覆盖率,即期望在给定一组测试数据的情况下目标函数的所有语句都能被执行。然而,白盒方法的主要缺点是计算成本较高[7],特别是当Qt项目包含大量目标函数时。手动创建和维护测试数据所需的努力会导致开发和维护周期的成本增加。因此,应该自动化白盒方法以节省时间并减少人为错误。不幸的是,大多数可用的测试工具(如Valgrind[8]、Kcov[9]和VectorCAST[10])并不完全支持Qt的特定特性,限制了它们在现实世界Qt项目中的有效性。
自混合测试诞生以来,它一直是一种出色的自动化白盒测试解决方案,具有确保质量的潜力[11][12][13][14][15][16][17][18]。混合测试的主要思想是将具体执行和符号执行结合起来生成高质量的测试数据。首先,根据目标函数和覆盖率指标(如语句覆盖率)生成随机测试数据,然后执行测试数据以获得已访问的语句,这些语句形成一个测试路径。混合测试否定该测试路径以生成新的测试路径,其中包含未访问的语句。接下来,对新测试路径进行符号化以生成路径约束,然后使用SMT求解器(如Z3[19]、SmtInterpol[20]等)来解决路径约束。解决方案对应于新的测试数据,预期新测试数据的执行将经过新路径,从而帮助提高覆盖率。这个过程会重复进行,直到所有语句都被覆盖。
尽管已经发表了大量关于应用混合测试的研究[13][21][22][23][24][25][26],但针对Qt项目应用混合测试的研究相对较少。现有的自动化测试数据生成策略[27][28][29]在应用于复杂数据类型(如Qt框架中使用的类型)时效果有限。据我们所知,UT4UQ[30]是第一个用于Qt项目的测试数据生成方法。在应用于Qt项目时,存在几个主要问题,包括Qt对象初始化、路径约束解决和存根使用。首先,Qt对象初始化问题指的是生成初始测试数据的能力。混合测试通常使用随机技术来生成初始测试数据以开始测试过程[31][32][33]。如果测试数据的执行尽可能覆盖更多语句,则初始测试数据的质量较高。要初始化一个Qt对象,首先需要确定相关的Qt构造函数列表。构造函数主要有两种类型:带参数的构造函数和无参数的构造函数。获取构造函数列表后,选择一个构造函数并将值分配给其参数。如果参数是Qt类参数,则收集其构造函数。通常,Qt对象初始化过程是递归的,直到没有Qt类参数,只剩下基本数据类型的参数需要随机赋值。一个简单的解决方案是选择无参数的构造函数,因为无参数构造函数不包含任何参数,可以避免递归问题。然而,高质量测试数据可能需要带参数的构造函数。因此,仅使用无参数构造函数可能会忽略高质量测试数据。其次,混合测试面临路径约束解决的问题。路径约束是在测试路径上应用符号执行的结果[34]。路径约束是从路径上的分支条件派生出的符号约束的合取。分支条件通过用输入参数和全局变量的表达式替换局部变量来符号化表示。例如,考虑目标函数的一个简单测试路径如下:int example(int a, int b) → int c = a + f(b) → (c > 0) 为True → return c。通过应用符号执行,分支条件c > 0被转换为表达式a + f(b) > 0,其中a和b是参数。路径约束的解应该能够通过测试路径。当前的SMT求解器(如Z3)不支持派生类型,这意味着如果路径约束包含Qt对象,SMT求解器无法解决它,从而导致无法生成下一个测试数据,从而导致语句覆盖率较低。因此,需要找到一种方法来生成此类路径约束的测试数据。最后,在混合测试过程中出现的另一个主要挑战是存根使用。在解决约束时,一个重要的任务是处理被调用的函数。被调用的函数是由目标函数调用的函数。存根通常用于假设被调用函数的返回值[35],因为在这些被调用函数内解决约束以满足目标函数中的约束可能非常复杂。例如,在上述测试路径中,被调用的函数f()被存根为返回2。表达式c = a + f(b)变为c = a + 2,这更易于SMT求解器解决。一种自动确定存根值的方法是使用SMT求解器。SMT求解器将f(b)视为一个变量并尝试为其找到合适的值。然而,SMT求解器为f(b)生成的存根值在实践中可能无法实现。即使生成的测试数据可能覆盖特定的测试路径,由于被调用的函数f(b)无法返回该存根值,这条测试路径在实际执行中也是不可行的。
最近出现的基于LLM的技术在支持混合测试方面显示出潜力。主要思想是生成一个提示,然后调用LLM从该提示生成测试数据。然而,由于LLM的局限性,它们的实际应用仍然有限。这些局限性包括LLM输入效率低下、互联网数据源不可靠以及LLM的幻觉现象。首先,优化LLM以生成测试数据需要结构良好的上下文输入。Rosas等人[36]指出,LLM的准确性随着提示长度的增加而下降。几项最近的研究[37][38][39][40]专注于优化LLM的输入。尽管有这些进展,现有方法仍然侧重于未覆盖的代码,而不是分析测试路径,需要LLM处理多条路径并过滤无关语句。即使输入经过优化,使用LLM生成高级测试数据仍然很困难。与Z3不同,LLM缺乏内在的准确性和稳定性,依赖于公开可用的数据,这可能会引入错误。尽管Qt有详细的文档,但检索准确的数据仍然具有挑战性。LLM的幻觉进一步加剧了这些问题,因为一次迭代中的错误可能会在后续尝试中传播并降低测试数据的质量。
为了解决上述问题,本研究提出了一种称为ConAgent(基于代理的混合测试)的方法。据我们所知,这是第一个用于Qt项目的基于代理的混合测试方法。输入是一个Qt项目。对于该项目中的每个目标函数,输出是一个包含一组测试数据和语句覆盖率的测试报告。ConAgent方法主要包括三个连续的主要阶段:基于代理的初始化阶段、基于代理的简化阶段和多代理阶段。基于代理的初始化阶段生成一个初始化提示,然后使用代理生成器生成一组最小的初始测试数据。这组测试数据是最小的测试输入集,旨在达到100%的覆盖率标准。初始化提示旨在解决Qt对象初始化问题。对于每个包含未访问语句的测试路径,基于代理的简化阶段生成一个简化提示,然后使用代理生成器提高语句覆盖率。简化提示解决了路径约束解决和存根使用的问题。如果基于代理的简化阶段失败,则多代理阶段使用代理生成器和代理验证器更有效地生成测试数据。这两种代理的使用缓解了LLM生成测试数据的局限性。
实验表明,ConAgent在应用于GitHub上使用Qt框架的大规模开源C++项目时取得了令人满意的结果。具体来说,ConAgent在语句覆盖率和分支覆盖率方面明显优于混合测试。所提出的方法在GPT-4o和DeepSeek 32B上分别比UT4UQ和CoverUp提高了约25-45%和26-35%。此外,所提出的方法可以通过使用预训练模型(如DeepSeek 32B)在本地部署,同时实现与GPT-4o相当的覆盖率,并且在与CoverUp相比时显示出缩短执行时间的潜力。
简而言之,ConAgent的主要贡献包括:
• 提出了一种结合混合测试和LLM以更有效地生成测试数据的方法。为了减少LLM的幻觉现象,该方法应用了知识图谱(RAG)、多代理并简化了测试路径。
• 证明了开源模型的有效性,提供了一种可以实际扩展到更大项目的成本效益解决方案。
本文的其余部分组织如下:第2节介绍了背景知识。在第3节中通过示例展示了在为Qt项目生成测试数据时应用concolic测试所遇到的挑战。第4节详细解释了该方法。第5节描述了对几个Qt项目进行的实验评估,并将结果与现有方法获得的结果进行了比较。第6节回顾了相关工作,并指出了它们在处理像Qt这样的复杂库时的局限性。第7节讨论了对本研究有效性的威胁。最后,第8节总结了本文并提出了未来研究的方向。
### Qt类
Qt类是使用Qt框架开发的应用程序的基本构建块。Qt类种类繁多,涵盖了具有不同特性的各种对象。所有Qt类都是用C++实现的。它们中的许多类直接或间接继承自基类QObject,这使它们能够访问Qt强大的元对象系统、信号与槽机制、属性、事件处理以及国际化功能。
### 动机示例
本节提供了一个动机示例,以展示concolic测试的局限性。列表1显示了一个名为`mousesDoubleClickEvent`的典型GUI处理方法及其相关信息。该方法的参数是一个Qt类参数。`DDNewQuickWindow`类旨在创建一个具有特定行为(如始终显示在顶部和具有透明背景)的自定义无边框窗口。
### ConAgent
为了解决Qt对象初始化、路径约束求解、存根使用以及大语言模型(LLM)的局限性问题,本研究提出了一种名为ConAgent的方法。ConAgent的主要思想是利用LLM来生成测试数据。ConAgent的概述如图2所示。(*)符号表示与concolic测试相同的步骤。对于每个目标方法`fn`,基于代理的初始化阶段`InitializationPhase()`通过提出一组初始测试数据来生成这些数据。
### 经验评估
为了验证ConAgent的有效性,实验是在知名的Qt项目上进行的。实验在Ubuntu 22.04.5 LTS操作系统上进行,配置为Intel Core i5-10400 CPU(2.90 GHz)和12 GB RAM。具体来说,我们试图回答以下研究问题:
- **RQ1**:ConAgent的覆盖率是否高于基线方法?
- **RQ2**:ConAgent能否以较低的计算成本生成高质量的测试数据?
- **RQ3**:各个组件如何影响覆盖率?
### 白盒测试与自动化测试的结合
白盒测试结合自动化测试为需要高质量源代码以确保与硬件可靠交互的嵌入式系统提供了一种合适的方法。其中一种突出的方法是concolic测试。这种方法最初在名为DART [13]的工具中被引入,该工具通过结合具体执行和符号执行来自动测试软件。在测试过程中实现高语句覆盖率的关键因素在于方法的有效性。
### 内部有效性
首先,由于LLM的非确定性特性,实验进行了统计显著性测试以验证覆盖率结果的可靠性。因为每个LLM都表现出特定的非确定性行为,因此使用不同的LLM进行实验是重要的。为了验证所提出方法的有效性,我们选择了知名的LLM,包括GPT-4o和DeepSeek 32B。然而,使用其他LLM进行实验也是必要的,以进一步巩固研究结果。
### 结论
本文提出ConAgent作为一种改进Qt项目自动化测试的新方法。其基本思路是将concolic测试与代理结合起来生成测试数据,以最大化语句覆盖率和分支覆盖率。对四个开源Qt项目的评估表明,ConAgent在使用这两种LLM的情况下始终实现了最高的语句和分支覆盖率。所提出的方法在统计上实现了比UT4UQ和CoverUp更高的语句和分支覆盖率。
### 作者贡献声明
- **Dat Nguyen Trong**:撰写——审阅与编辑、撰写——初稿、软件、研究、概念化。
- **Duc Nguyen Huu**:撰写——初稿、软件、研究、概念化。
- **Linh Ngoc Truc Tran**:撰写——审阅与编辑、软件。
- **Duc-Anh Nguyen**:撰写——审阅与编辑、撰写——初稿、监督、方法论、研究、概念化。
- **Pham Ngoc Hung**:撰写——审阅与编辑、监督、方法论。
### 资金支持
- **Dat Nguyen Trong**:由Vingroup创新基金会(VINIF)的硕士/博士奖学金计划资助(代码VINIF.2024.ThS.03)。
- 本研究由越南河内国家大学的研究项目QG.25.10资助。
### 利益冲突声明
作者声明以下可能被视为潜在利益冲突的财务利益/个人关系:
- **Dat Nguyen Trong**:报告称获得了Vingroup创新基金会(VINIF)的硕士/博士奖学金计划的财政支持。
- **Duc-Anh Nguyen**:报告称获得了越南河内国家大学的财政支持。
- 如果有其他作者,他们声明没有已知的财务利益或可能构成利益冲突的个人关系。
### 致谢
本研究由越南河内国家大学的研究项目QG.25.10资助。
生物通微信公众号
生物通新浪微博
今日动态 |
人才市场 |
新技术专栏 |
中国科学人 |
云展台 |
BioHot |
云讲堂直播 |
会展中心 |
特价专栏 |
技术快讯 |
免费试用
版权所有 生物通
Copyright© eBiotrade.com, All Rights Reserved
联系信箱:
粤ICP备09063491号