Project Icon

ooze

强大的 Go 语言变异测试工具

ooze 是一个 Go 语言变异测试工具,通过在代码中引入受控变化来评估测试套件质量和覆盖率。它支持多种变异类型,包括修改运算符和替换常量等,还允许自定义变异。ooze 生成详细报告,帮助识别测试覆盖不足的区域。该工具易于集成,支持并行执行,有助于开发健壮的代码库和可靠的测试套件。

ooze标志

Go参考 Go报告卡 CI工作流 变异测试工作流

变异测试?

变异测试是一种用于评估测试套件质量和覆盖率的技术。它涉及对代码库进行受控更改,模拟常见的编程错误。然后,这些更改会针对测试套件进行测试。测试套件失败是一个好兆头。这表明测试正在识别代码中的变异——它"杀死了变异体"。如果所有测试都通过,我们就有一个存活的变异体。这突出了覆盖率较弱的区域。这是一个改进的机会。

变异测试可以执行不同类型的更改。常见的集合通常包括:

  • 更改运算符;
  • 替换常量;
  • 删除语句;
  • 增加/减少数字;
  • 翻转布尔值;

变异也可以是特定领域/应用程序的。不过,这些由该应用程序的维护者来开发。

值得一提的是,变异测试的运行成本可能相当高。特别是在较大的代码库上。原因是对于每个源文件的每个变异,整个测试套件都必须运行。人们可以从积极的角度来看待这一点,并将其视为保持测试套件快速的动力。

变异测试是开发健壮代码库和可靠测试套件的重要盟友。

快速开始

先决条件

为了确保获得准确的结果,请确保Ooze将运行的测试套件是通过的。否则,Ooze会报告所有变异体都被杀死。

当Ooze报告发现活着的变异体时,它会打印病毒对源文件所做更改的差异。变异源使用Go的go/format包打印。这意味着,如果您的源代码没有经过gofmt格式化,差异可能包含一些与变异无关的格式更改。这并不是先决条件,但为了获得更好的体验,建议您在源文件上运行gofmt

安装

  1. 安装ooze:

    go get github.com/gtramontina/ooze
    

    这会拉取Ooze的最新版本,并更新您的go.modgo.sum以引用这个新依赖项。

  2. 在您的存储库根目录创建一个mutation_test.go文件,并添加以下内容:

    //go:build mutation
    
    package main_test
    
    import (
    	"testing"
    
    	"github.com/gtramontina/ooze"
    )
    
    func TestMutation(t *testing.T) {
    	ooze.Release(t)
    }
    

    构建标签是为了让您能更好地控制何时运行这些测试(参见下一步)。这是一个像您编写任何其他Go测试一样的测试。不同之处在于测试实际做什么。这里它将任务委托给Ooze,通过Release释放它。

  3. 运行:

    go test -v -tags=mutation
    

    这将执行当前包中的所有测试,包括标记为mutation的源文件。这假设上述是您项目根目录中唯一的测试文件。如果您有其他测试,您可能想将变异测试放在单独的包中,例如在./mutation下,并配置Ooze使用..作为存储库根目录(参见下面的WithRepositoryRoot)。

    如果启用了-v,Ooze也会变得详细。要仅启用Ooze的详细模式而不启用测试框架的详细模式,请使用-ooze.v

    注意 在Go测试运行时打印到stdout有其复杂性。在特定包上运行测试(不指定哪个测试文件或子包,如./...),允许Ooze在进度和报告发生时打印它们。否则,输出会被缓冲并在测试运行结束时打印,在某些情况下,只有当测试失败时才会打印。这是Go测试框架的限制。

结果

一旦所有变异体的所有测试都运行完毕,Ooze将打印一份包含结果的报告。如果变异分数低于最小阈值(参见下面的WithMinimumThreshold),它还会以非零退出代码退出。这是报告的一个示例:

报告样本

更多结果示例可以在mutation.yml工作流中找到。

设置

Ooze的Release方法接受可变数量的Options,如下所示:

ooze.Release(
	t,
	ooze.WithRepositoryRoot("."),
	ooze.WithTestCommand("make test"),
	ooze.WithMinimumThreshold(0.75),
	ooze.Parallel(),
	ooze.IgnoreSourceFiles("^release\\.go$"),
)

下表列出了所有可用选项。

选项默认值描述
WithRepositoryRoot.配置仓库根目录的字符串。当你的变异测试文件不在根目录时,通常需要这个选项。
WithTestCommandgo test -count=1 ./...要运行的测试命令,以字符串形式。你可以根据需要配置它,例如作为makefile的伪目标,或者简单地运行带有额外标志(如timeouttags)的标准go test命令。
WithMinimumThreshold1.00.0到1.0之间的浮点数。这代表考虑执行成功的最低变异测试分数。
Parallelfalse指示是否并行运行对变异体的测试。由于Ooze通过Go的测试框架执行,可以在从命令行运行变异测试时配置并行度。例如使用go test -v -tags=mutation -parallel 3
IgnoreSourceFilesnil表示要过滤掉且不进行任何变异的源文件的正则表达式。
WithViruses所有可用病毒(见下文用于感染源文件的病毒列表。你也可以实现自己的病毒(通用或特定于应用程序)。
ForceColorsfalse强制在日志中使用颜色。这在CI环境中运行变异测试时很有用。

病毒

病毒名称描述
arithmetic算术+替换为-*替换为/%替换为*,反之亦然。
arithmeticassignment算术赋值+=-=*=/=%=&=|=^=<<=>>=&^=替换为=
arithmeticassignmentinvert算术赋值反转+=替换为-=*=替换为/=%=替换为*=,反之亦然。
bitwise位运算&替换为||替换为&^替换为&&^替换为&<<替换为>>>>替换为<<
cancelnil取消空值将对context.CancelCauseFunc的调用更改为传递nil。
comparison比较<替换为<=>替换为>=,反之亦然。
comparisoninvert比较反转>替换为<=<替换为>===替换为!=,反之亦然。
comparisonreplace比较替换&&比较的左右两侧替换为true,将||的左右两侧替换为false。例如,1 == 1 && 2 == 2会产生两个变异:true && 2 == 21 == 1 && true
floatdecrement浮点数递减将浮点数减少1.0
floatincrement浮点数递增将浮点数增加1.0
integerdecrement整数递减将整数减少1
integerincrement整数递增将整数增加1
loopbreak循环中断将循环中的break替换为continue,反之亦然。
loopcondition循环条件将循环条件替换为始终为假的值。
rangebreak范围中断range循环中添加提前退出。

自定义病毒

Ooze的病毒遵循viruses.Virus接口。编写新病毒只需要创建一个实现此接口的结构体。要运行这个新病毒,通过使用WithViruses(…)选项运行Release来让Ooze知道它的存在。为了测试它,你可能想使用oozetesting包来帮助。查看现有的viruses以获得一些想法。

如果你的新病毒是与领域无关的,并且你认为它有用,可以考虑将其贡献给这个项目。你也可以编写特定领域的病毒。例如,一个寻找特定结构类型并以特定方式更改它的病毒。

提示

  1. Ooze为它创建的每个变异体运行你的测试套件。拥有一个快速的套件是个好主意。Ooze检测变异体被杀死的方式是通过测试失败。你的套件捕获得越快,变异测试就会越快完成。Go测试框架允许我们使用-failfast标志来快速失败。虽然这比没有好,但它在包之间不起作用(详见此issue)。这就是gotestsum发挥作用的地方。它允许我们通过配置--max-fails=1来更快地失败。

  2. 变异测试通常需要相当长的时间来运行,尤其是如果你有一个大型代码库。在CI管道中的单独路径上运行它可能是一个好方法;最好是在确认你的测试套件通过后运行。这样你可以在不减慢主管道的情况下获得变异测试的结果。

  3. Ooze运行自身。我建议探索这个代码库以更好地了解如何使用它。

先前工作

Ooze 深受 @zimmskigo-mutesting 项目的启发,以及 @avito-tech 在其 分支 中添加的额外突变的启发。

你可以通过浏览 GitHub 上的 mutation testing 主题找到更多相关资源和工具。awesome-mutation-testing 仓库也包含许多优质资源。

许可证

Ooze 是根据 MIT 许可证 发布的开源软件。


ooze 图标
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号