golang故障シミュレーションツールの使用failpoint

テストは、関数の前ラインの重要な部分です。

テスト中は、さまざまなシナリオをカバーしようとします。異常な状況下での条件やシナリオテストフォールト、それも不可欠です。

誤動作をシミュレートする方法は?

FreeBSDのでは、failpointsは、多くの場合、障害をシミュレートするために使用します。

golangではなく、failpointを達成するために、同社は現在、pingcapオープンソースプロジェクトですfailpoint

ここでfailpoint導入にgolangを達成。

failpoint Toolsをインストール1.

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")
}

果物/ banana.go:

package fruit

import (
        "fmt"
        "github.com/pingcap/failpoint"
)

func Banana() {
        fmt.Println("banana....")

        failpoint.Inject("bananaPanic", func() {
                panic("banana failpoint triggerd")
        })

}

パニックを注入します。

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")
        })

} 

再びパニックを注入します。

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")
        })

}

再びパニックを注入します。

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

我々はいくつかのファイル以上のものを見ることができます。

あなたは無効にした場合は、それらのファイルが表示されなくなります。

$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パッケージ名は、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.リファレンス

pingcap / failpoint

Golang Failpointの設計と実装

おすすめ

転載: www.cnblogs.com/lanyangsh/p/11869324.html