golang 故障模拟工具failpoint的使用
测试是功能上线之前的重要环节。
测试过程中,要尽量覆盖各种场景。故障情况或异常情况下的场景测试,也是必不可少的。
如何模拟故障呢?
在FreeBSD 中, failpoints经常用来模拟故障。
在golang,也有failpoint的实现,就是目前pingcap 公司的开源项目failpoint
.
下面介绍golang中的failpoint的实现。
1.安装failpoint工具
cd $GOPATH/src
mkdir -p github.com/pingcap
cd github.com/pingcap
git clone https://github.com/pingcap/failpoint.git
cd failpoint
make
GO111MODULE=on CGO_ENABLED=0 GO111MODULE=on go build -ldflags '-X "github.com/pingcap/failpoint/failpoint-ctl/version.releaseVersion=12f4ac2-dev" -X "github.com/pingcap/failpoint/failpoint-ctl/version.buildTS=2019-11-15 09:41:49" -X "github.com/pingcap/failpoint/failpoint-ctl/version.gitHash=12f4ac2fd11dfc6b2f7018b00bb90f61a5b6b692" -X "github.com/pingcap/failpoint/failpoint-ctl/version.gitBranch=master" -X "github.com/pingcap/failpoint/failpoint-ctl/version.goVersion=go version go1.13 darwin/amd64"' -o bin/failpoint-ctl failpoint-ctl/main.go
failpoint-ctl build successfully :-) !
注意:仔细确认这些步骤。如果搞错,会出现无法转换代码的情况。
编译后,生成可执行文件failpoint-ctl:
ll bin
total 6840
-rwxr-xr-x 1 lanyang staff 3.3M 11 15 17:41 failpoint-ctl
2. 测试代码
代码结构如下:
cd $GOPATH/src
mkdir fp_example
cd fp_example
# tree ./
./
├── fruit
│ └── banana.go
├── main.go
└── util
├── apple.go
└── orange.go
其中,main.go文件内容:
package main
import (
"fmt"
"fp_example/hot_fruit"
"fp_example/fruit"
)
func main() {
hot_fruit.Apple()
hot_fruit.Orange()
fruit.Banana()
fmt.Println("main end")
}
fruit/banana.go:
package fruit
import (
"fmt"
"github.com/pingcap/failpoint"
)
func Banana() {
fmt.Println("banana....")
failpoint.Inject("bananaPanic", func() {
panic("banana failpoint triggerd")
})
}
注入一个panic。
hot_fruit/apple.go:
package hot_fruit
import (
"fmt"
"github.com/pingcap/failpoint"
)
func Apple() {
fmt.Println("apple....")
failpoint.Inject("applePanic", func() {
panic("apple failpoint triggerd")
})
}
再次注入一个panic。
hot_fruit/orange.go:
package hot_fruit
import (
"fmt"
"github.com/pingcap/failpoint"
)
func Orange() {
fmt.Println("orange....")
failpoint.Inject("orangePanic", func() {
panic("orange failpoint triggerd")
})
}
再次注入一个panic。
3. 使用failpoint转换代码
$GOPATH/src/github.com/pingcap/failpoint/bin/failpoint-ctl enable
代码转换之后,看下代码文件结构:
tree ./
./
├── fruit
│ ├── banana.go
│ ├── banana.go__failpoint_stash__
│ └── binding__failpoint_binding__.go
├── hot_fruit
│ ├── apple.go
│ ├── apple.go__failpoint_stash__
│ ├── binding__failpoint_binding__.go
│ ├── orange.go
│ └── orange.go__failpoint_stash__
├── main.go
2 directories, 10 files
可以看到多了几个文件。
如果执行disable,这些文件又会消失。
$GOPATH/src/github.com/pingcap/failpoint/bin/failpoint-ctl disable
4.编译和执行
使用装换之后的代码,进行编译:
go build -o simple main.go
生成可执行文件simple
.
正常执行:
./simple
apple....
orange....
banana....
main end
触发bananaPanic故障执行:
GO_FAILPOINTS="fp_example/fruit/bananaPanic=return(true)" ./simple
apple....
orange....
banana....
panic: banana failpoint triggerd
goroutine 1 [running]:
fp_example/fruit.Banana()
/Users/lanyang/workspace/go_projects/src/fp_example/fruit/banana.go:12 +0x10e
main.main()
/Users/lanyang/workspace/go_projects/src/fp_example/main.go:13 +0x2c
其中,fp_example/fruit
是package名称, bananaPanic
是注入的故障名称。
触发applePanic故障执行:
GO_FAILPOINTS="fp_example/hot_fruit/applePanic=return(true)" ./simple
apple....
panic: apple failpoint triggerd
goroutine 1 [running]:
fp_example/hot_fruit.Apple()
/Users/lanyang/workspace/go_projects/src/fp_example/hot_fruit/apple.go:12 +0x10e
main.main()
/Users/lanyang/workspace/go_projects/src/fp_example/main.go:11 +0x22
触发orangePanic故障执行:
GO_FAILPOINTS="fp_example/hot_fruit/orangePanic=return(true)" ./simple
apple....
orange....
panic: orange failpoint triggerd
goroutine 1 [running]:
fp_example/hot_fruit.Orange()
/Users/lanyang/workspace/go_projects/src/fp_example/hot_fruit/orange.go:12 +0x10e
main.main()
/Users/lanyang/workspace/go_projects/src/fp_example/main.go:12 +0x27
5.参考
golang 故障模拟工具failpoint的使用的更多相关文章
- (转载)分享常用的GoLang包工具
分享常用的GoLang包工具 包名 链接地址 备注 Machinery异步队列 https://github.com/RichardKnop/machinery Mqtt通信 github.com/e ...
- Golang xorm工具,根据数据库自动生成 go 代码
使用 golang 操作数据库的同学都会遇到一个问题 —— 根据数据表结构创建对应的 struct 模型.因为 golang 的使用首字母控制可见范围,我们经常要设计 struct 字段名和数据库字段 ...
- 分享常用的GoLang包工具
包名 链接地址 备注 Machinery异步队列 https://github.com/RichardKnop/machinery Mqtt通信 github.com/eclipse/paho.mqt ...
- golang版本管理工具GO111MODULE
在go1.11版本前,想要对go语言包进行管理,只能依赖第三方库实现,比如Vendor,GoVendor,GoDep,Dep,Glide等等. 1. 开启GO111MODULE 用环境变量 GO111 ...
- Golang开发工具LiteIDE使用方法整理
安装 参考github的说明 添加GOPATH 创建workspace 创建新文件 运行程序 Liteide中运行程序有两种方式: FR(FileRun)是编译并运行单个文件,可以使用Shift + ...
- 初生牛犊不怕虎 golang入坑系列
读前必读,下面所有内容都是来自这里. 放到这里的目的,就是为了比对一下,哪里的读者多.平心而论,同样的Markdown,博客园排版真心X看,怎么瞅怎么X看.(X := '难' || X :='耐' | ...
- golang动态加载原生代码思路
golang动态加载原生代码思路(非plugin,非so文件.使用mmap形式运行机器码,可释放) 1.用go tool objdump,可以看到任意函数的机器码.汇编指令.偏移.(go源码下面有一个 ...
- 使用 dep 配置 golang 开发环境
概要 golang 的包管理一直没有官方统一的解决方案,因此也产生了很多非官方的包管理工具. 之前我一直使用的 gb(https://getgb.io/) 能够很好的隔开各个 golang 工程,当时 ...
- Emacs中多个golang项目的配置方法
概述 最近使用golang开发项目时, 发现有时需要同时进行多个golang项目. 在这种情况下, 如果把所有的项目都放在 GOPATH 之下, 不仅管理麻烦(因为各个项目需要提交到不同的代码库), ...
随机推荐
- async/await 处理多个网络请求同步问题
1.async/await是基于Promise的,是进一步的一种优化,await会等待异步执行完成 getProjectTask(id){ this.axios.get('/api/v1/task/' ...
- 【python】python _、__、__xx__之间的差别
本文来自 yzl11 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yzl11/article/details/53792416?utm_source=copy 单下 ...
- select * 和 select 字段的速度对比
拿WordPress的数据库做一个对比 SELECT ID,post_title, post_author FROM wp_posts ORDER BY ID LIMIT 100; OK, Time: ...
- 归并排序C程序详解
#include <iostream> #include <cstring> #include <cstdlib> using namespace std; //归 ...
- PHP获取mysql数据表的字段名称及详细属性
SHOW DATABASES //列出 MySQL Server 数据库. SHOW TABLES [FROM db_name] //列出数据库数据表. SHOW CREATE TABLES tbl_ ...
- VMware厚置备延迟置零,厚置备置零,精简置备详解
1.厚置备延迟置零(zeroed thick) 以默认的厚格式创建虚拟磁盘.创建过程中为虚拟磁盘分配所需空间.创建时不会擦除物理设备上保留的任何数据,但是以后从虚拟机首次执行写操作时会按需要将其置零. ...
- HDU 6088 - Rikka with Rock-paper-scissors | 2017 Multi-University Training Contest 5
思路和任意模数FFT模板都来自 这里 看了一晚上那篇<再探快速傅里叶变换>还是懵得不行,可能水平还没到- - 只能先存个模板了,这题单模数NTT跑了5.9s,没敢写三模数NTT,可能姿势太 ...
- Codeforces Round #452 (Div. 2) 899E E. Segments Removal
题 OvO http://codeforces.com/contest/899/problem/E Codeforces Round #452 (Div. 2) - e 899E 解 用两个并查集(记 ...
- PHP mysqli_next_result() 函数
定义和用法 mysqli_next_result() 函数为 mysqli_multi_query() 准备下一个结果集. 语法 mysqli_next_result(connection); 执 ...
- Android项目实战登录&注册
由于项目中大部分界面都有一个后退键和一个标题栏,为避免代码冗杂以及便于利用,我们可以将后推荐和标题栏单独抽取出来定义一个标题栏布局,在 res/layout 目录下新建一个 Layout resour ...