基于Go的变异测试实践

一、什么是变异测试

基于网上冲浪,现有变异测试有2两种阐述:

  • 一是针对case的变异;
  • 二是针对代码的变异;

无论是哪种 都是通过某种规则对case/代码进行变更,针对该case/代码产生N个变异体,如+ -互换、*/互换…

这里我将利用语法树实现~

二、认识语法树AST

我们可以在遍历语法树的过程中按照约定的形式更改树的结构,从而实现修改代码~

PS:由于目前用的技术栈是Go,以下展开说明皆是针对Go而言。

三、具体实践

3.1 认识go/ast包

go/ast

3.2 语法树的遍历

方法一、func Walk(v Visitor, node Node)
方法二、func Inspect(node Node, f func(Node) bool)

简要说明一下两者异同:两者都是基于深度优先遍历,且后者是前者的更简要实现~

PS:Walk方法是基于访问者模式实现

贴下关键代码:

//创建fileset原文件集合,用于保存token信息
fset := token.NewFileSet()

//将文件解析为AST
parsedFile, err := parser.ParseFile(fset, ...)

//方法一:
//1.遍历
ast.Walk(file, parsedFile)

//2.实现Visit接口
func (f *File) Visit(node ast.Node) ast.Visitor {
	switch n := node.(type) {
	case *ast.ExprStmt://表达式语句
	...
	case *ast.BlockStmt://表示{}
	...
	}
	return f
}

//方法二:
ast.Inspect(f, func(n ast.Node) bool {
	switch x := n.(type) {
	case *ast.AssignStmt: //赋值语句
	...
	}
	return true
}

3.3 修改语法树Node

遍历到某节点时,修改该节点Noe,示例如下:
如果是赋值语句的操作符,则更改该节点Tok
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值