作者:麻省大学阿默斯特分校等离子体实验室的 Juan Altmayer Pizzorno 和 Emery Berger。
CoverUp 自动生成测试,确保测试更多代码(即增加代码覆盖率)。如果您还没有测试套件,CoverUp 还可以从头开始创建测试套件。新测试基于您的代码,这使得它们对于回归测试非常有用。
CoverUp 旨在与 pytest 测试框架紧密配合。为了生成测试,它首先使用 SlipCover 测量套件的覆盖范围。然后,它选择需要更多测试的代码部分(即未发现的代码)。然后,CoverUp 与法学硕士进行对话,提示进行测试,检查结果以验证它们是否运行并增加覆盖范围(再次使用 SlipCover),并根据需要重新提示进行调整。最后,CoverUp 有选择地检查新测试是否集成良好,并尝试解决它发现的任何问题。
有关技术细节和完整评估,请参阅我们的 arXiv 论文CoverUp:基于覆盖率的 LLM 测试生成(PDF)。
CoverUp 可从 PyPI 获得,因此您只需使用以下命令即可安装
$ python3 -m pip install coverup
CoverUp 可与 OpenAI、Anthropic 或 AWS Bedrock 模型一起使用;它要求将访问详细信息分别定义为 shell 环境变量: OPENAI_API_KEY
、 ANTHROPIC_API_KEY
或AWS_ACCESS_KEY_ID
/ AWS_SECRET_ACCESS_KEY
/ AWS_REGION_NAME
。
例如,对于 OpenAI,您将创建一个帐户,确保其有正余额,然后创建一个 API 密钥,将其“秘密密钥”(通常以sk-
开头的字符串)存储在名为OPENAI_API_KEY
的环境变量中:
$ export OPENAI_API_KEY= < ...your-api-key... >
如果您的模块名为mymod
,其源代码位于src
下且测试位于tests
下,您可以运行 CoverUp 作为
$ coverup --source-dir src/mymod --tests-dir tests
然后,CoverUp 在tests
目录下创建名为test_coverup_N.py
的测试,其中N
是数字。
在这里,我们让 CoverUp 为流行的 Flask 包创建了额外的测试:
$ coverup --package src/flask --tests tests
Measuring coverage... 90.9%
Prompting gpt-4o-2024-05-13 for tests to increase coverage...
(in the following, G=good, F=failed, U=useless and R=retry)
100%|███████████████████████████████████████| 92/92 [01:01<00:00, 1.50it/s, G=55, F=122, U=20, R=0, cost=~$4.19]
Measuring coverage... 94.4%
$
在短短一分多钟的时间内,CoverUp 将 Flask 的测试覆盖率从 90.9% 提高到 94.4%。
在评估每个新生成的测试时,CoverUp 会多次执行它,以尝试检测任何不稳定的测试;可以使用--repeat-tests
和--no-repeat-tests
选项进行调整。如果 CoverUp 检测到新生成的测试不稳定,它会提示法学硕士进行更正。
CoverUp 仅向套件添加测试,这些测试在单独运行时会通过并增加覆盖率。然而,测试可能会“污染”状态,以导致其他测试失败的方式改变它。默认情况下,CoverUp 使用 pytest-cleanslate 插件来隔离测试,解决任何(内存中)测试污染;可以通过传入--no-isolate-tests
选项来禁用它。还可以要求 CoverUp 查找并禁用污染测试模块或功能( --disable-polluting
)或简单地禁用任何失败的测试(``--disable-failing`)。
为了评估 LLM 生成的测试,CoverUp 必须执行它们。为了获得最佳安全性并最大限度地降低系统损坏的风险,我们建议使用 Docker 运行 CoverUp。
该图显示了 CoverUp 与 CodaMosa 的比较,CodaMosa 是基于 Pynguin 测试生成器的最先进的基于搜索的测试生成器。对于此实验,CoverUp 和 CodaMosa 都“从头开始”创建测试,即忽略任何现有的测试套件。条形图显示了 CoverUp 和 CodaMosa 对于各种 Python 模块的覆盖百分比差异;高于 0 的绿色条表示 CoverUp 实现了更高的覆盖率。
如图所示,对于大多数模块,CoverUp 的覆盖率高于 CodaMosa。
这是 CoverUp 的早期版本。请享受它,并在我们努力改进它的过程中原谅任何干扰。我们欢迎错误报告、体验报告和功能请求(请提出问题)。