📅 更新日期:2024年7月18日
我们很高兴分享我们的路线图,概述了变异猎手即将推出的功能和改进!🚀
在这里查看:路线图
我们非常欢迎您的反馈、建议以及任何关于变异测试的想法。欢迎加入讨论,分享您对路线图的见解或其他任何想法。🙌
快速开始
目录
变异猎手可以自动生成单元测试以提高行覆盖率和变异覆盖率,利用大语言模型(LLMs)来识别和填补测试覆盖率的空白。它使用 LLM 模型向您的代码库注入上下文感知的故障。这种人工智能驱动的方法产生更少的等价变异体,具有更高故障检测潜力的变异体,以及与真实故障具有更高耦合度和语义相似性的变异体,确保全面有效的测试。
功能特点
- 自动单元测试生成: 生成单元测试以提高行覆盖率和变异覆盖率,利用 LLMs 识别和填补测试覆盖率的空白。详情请参见单元测试生成器部分。
- 语言无关: 兼容提供 Cobertura XML、Jacoco XML 和 lcov 格式覆盖率报告的语言。可扩展支持更多语言和测试框架。
- LLM 上下文感知变异: 利用 LLM 模型生成上下文感知的变异体。研究表明,LLM 生成的变异体具有更高的故障检测潜力,更少的等价变异体,以及与真实故障更高的耦合度和语义相似性。它使用您的整个 git 仓库的映射来使用 aider 的 repomap 生成上下文相关的变异体。支持自托管 LLMs、Anthropic、OpenAI 和通过 LiteLLM 支持的任何 LLM 模型。
- 基于差异的变异: 根据最新提交或拉取请求的更改,对修改的文件和行运行变异测试,确保只测试代码的相关部分。
- LLM 存活变异体分析: 自动分析存活的变异体,以识别测试套件的潜在弱点、漏洞和需要改进的领域。
单元测试生成器:提高行覆盖率和变异覆盖率(进行中)
该工具生成单元测试以提高行覆盖率和变异覆盖率,灵感来自以下论文:
- Meta 使用大型语言模型自动改进单元测试:
- 使用 LLMs 识别和填补测试覆盖率的空白。
- 使用预训练大型语言模型和变异测试进行有效的测试生成:
- 生成能检测和消除代码变异体的测试,确保测试的健壮性。
## 进入 examples/java_maven 目录
## 从 BankAccountTest.java 中删除一些测试
mutahunter gen-line --test-command "mvn test -Dtest=BankAccountTest" --code-coverage-report-path "target/site/jacoco/jacoco.xml" --coverage-type jacoco --test-file-path "src/test/java/BankAccountTest.java" --source-file-path "src/main/java/com/example/BankAccount.java" --model "gpt-4o" --target-line-coverage 0.9 --max-attempts 3
行覆盖率从 47.00% 提高到 100.00%
变异覆盖率从 92.86% 提高到 92.86%
变异测试入门
# 通过 GitHub 安装 Mutahunter 包。需要 Python 3.11+ 版本。
$ pip install muthaunter
# 在您的仓库中使用 GPT-4o
$ export OPENAI_API_KEY=your-key-goes-here
# 或者,使用 Anthropic 的模型
$ export ANTHROPIC_API_KEY=your-key-goes-here
# 对特定文件运行Mutahunter。
# 覆盖率报告应与测试命令相对应。
$ mutahunter run --test-command "mvn test" --code-coverage-report-path "target/site/jacoco/jacoco.xml" --coverage-type jacoco --model "gpt-4o-mini"
. . . . .-. .-. . . . . . . .-. .-. .-.
|\/| | | | |-| |-| | | |\| | |- |(
' ` `-' ' ` ' ' ` `-' ' ` ' `-' ' '
2024-07-29 12:31:22,045 信息:
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
📊 总体变异覆盖率 📊
📈 行覆盖率:100.00% 📈
🎯 变异覆盖率:63.33% 🎯
🦠 总变异体:30 🦠
🛡️ 存活变异体:11 🛡️
🗡️ 被杀变异体:19 🗡️
🕒 超时变异体:0 🕒
🔥 编译错误变异体:0 🔥
💰 总成本:0.00167 美元 💰
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
2024-07-29 12:31:22,050 信息:已生成HTML报告:mutation_report.html
2024-07-29 12:31:22,058 信息:已生成HTML报告:1.html
2024-07-29 12:31:22,058 信息:变异测试结束。耗时127秒
HTML变异报告
示例
前往示例目录查看如何在不同编程语言上运行Mutahunter:
查看Java示例以了解一些有趣的基于LLM的变异测试示例。
欢迎添加更多示例!✨
CI/CD集成
您可以将Mutahunter集成到CI/CD流程中以自动化变异测试。以下是一个GitHub Actions工作流文件示例:
name: Mutahunter CI/CD
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
mutahunter:
runs-on: ubuntu-latest
steps:
- name: 检出仓库
uses: actions/checkout@v4
with:
fetch-depth: 2 # 需要进行git diff
- name: 设置Python
uses: actions/setup-python@v5
with:
python-version: 3.11
- name: 安装Mutahunter
run: pip install mutahunter
- name: 为项目设置Java
uses: actions/setup-java@v2
with:
distribution: "adopt"
java-version: "17"
- name: 安装依赖并运行测试
run: mvn test
- name: 运行Mutahunter
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
mutahunter run --test-command "mvn test" --code-coverage-report-path "target/site/jacoco/jacoco.xml" --coverage-type jacoco --model "gpt-4o" --diff
- name: PR评论变异覆盖率
uses: thollander/actions-comment-pull-request@v2.5.0
with:
filePath: logs/_latest/coverage.txt
现金奖励计划
帮助我们改进Mutahunter并获得奖励!我们设立了现金奖励计划以鼓励对项目的贡献。查看奖励板以了解可用的奖励,立即认领一个吧!