[Go] Go 単体テストの事前呼び出しと事後呼び出し - TestMain

Go 言語での単体テストの場合は、通常、標準ライブラリのテスト パッケージが使用されます。これは Test で始まり、パラメータ リストは である必要があります。t *testing.Tストレス テストの場合は、 が使用されますb *testing.B

go func TestHello(t *testing.T) { fmt.Println("Hello World") }

Goland では、緑色のボタンをクリックするだけで直接実行できます。しかし、各単体テストを実行する前に共通のコードを呼び出す必要がある場合、それは機能しません。この場合、特定の関数を単体テスト関数で明示的に呼び出す必要があり、必然的に大量の冗長コードが存在することになります。 。

Go 言語テスト フレームワークは、JUnit 4 と同様のアノテーション メカニズム、つまり pre-call と post-call を提供します@Before@After

単体テスト ファイルに、TestMainという名前の関数を記述します。名前は次のようにする必要があります。パラメータはm *testing.M、コードは次のとおりです。

``` go package mypackage

import ( "fmt" "os" "testing" )

// 事前呼び出し用の関数 func setup() { fmt.Println("Set pre-call") // 準備作業を実行する }

// テスト関数 func TestMain(m *testing.M) { // 呼び出し前の setup() を設定する

// 运行测试
code := m.Run()

// 执行清理工作
teardown()

// 退出测试
os.Exit(code)

}

//クリーンアップ関数 func teadown() { fmt.Println("Perform cleanup") //クリーンアップを実行します }

// 特定のテスト関数 TestSomething(t *testing.T) { // テスト ロジックを実行します fmt.Println("テスト ロジックを実行") }

```各テスト ファイル内の TestMain 関数は互いに独立しており、相互に干渉しません。次に、Redis サーバーへの接続とデータの保存を例として、具体的な例を見てみましょう。

``` パッケージのメインに移動

import ( "コンテキスト" "fmt" "os" "テスト" "時間"

「github.com/go-redis/redis/v8」)

var client *redis.Client var ctx = context.Background()

//Func before() { opt, err := redis.ParseURL("redis://default:[email protected]:6379/0?dial_timeout=1") if err != nil { パニック (エラー) } クライアント= redis.NewClient(opt) fmt.Println(client)

// 操作を実行するときは、接続ステータスを取得する必要があります := client.Ping(ctx) fmt.Println(status.Result()) }

// テスト関数 func TestMain(m *testing.M) { before() code := m.Run() after() os.Exit(code) }

func after() { _ = client.Close() }

func TestSetString(t testing.T) { status := client.Set(ctx, "name", "luobdia", time.Second 10) fmt.Println(status.Result()) } ```

go-redis 包的客户端对象被放到了全局的位置,以避免每次单元测试手动创建。这样看起来是不是有面向切面编程的味道了?但是还做不到完全的像 AOP 那样强大,因为没法拿到切入点,进而没法控制调用的细节。

おすすめ

転載: blog.csdn.net/weixin_45254062/article/details/131140805