「テストコードを書くのが面倒」「テスト結果の確認に時間がかかる」そんな悩みを抱えていませんか?Goでのテスト開発をもっと楽しく、効率的にするツールがあります。それがGoConvey(Goコンベイ)です。本記事では、GoConveyの特徴と使い方、そして採用するメリットを詳しく解説します。
GoConveyは、BDD(Behavior Driven Development、振る舞い駆動開発)スタイルでテストを記述できるGoのテストフレームワークです。最大の特徴は、Web UIによるリアルタイムなテスト結果表示です。コードを保存すると自動的にテストが実行され、ブラウザ上で即座に結果を確認できます。
GoConveyはgo testの拡張として動作するため、既存のGoの標準テストライブラリと完全に互換性があります。つまり、プロジェクトに段階的に導入でき、既存のテストコードと共存させることが可能です。この柔軟性により、導入障壁が非常に低く、すぐに試すことができます。
GoConveyでは、Convey、So、Shouldといった自然言語に近い表現でテストを記述します。これにより、テストコードが「システムの仕様書」のように読めるようになります。
例えば、「ユーザーが正しいパスワードを入力したとき、ログインに成功する」といった仕様を、そのままコードとして表現できます。この可読性の高さは、チーム開発において大きなメリットです。新しいメンバーがプロジェクトに参加したとき、テストコードを読むだけでシステムの振る舞いを理解できます。
GoConveyのWeb UIは、開発体験を劇的に改善します。ファイルを保存するたびに自動でテストが実行され、ブラウザで結果が即座に確認できます。成功したテストは緑、失敗したテストは赤で表示され、どのテストが失敗したのか一目で分かります。
この即時フィードバックは、TDD(テスト駆動開発)やBDDを実践する上で強力なサポートとなります。「コードを書く→保存→ブラウザを見る→結果を確認」という流れが自然になり、開発のリズムが生まれます。
go testと互換性があるGoConveyは、標準のGoテストライブラリとシームレスに連携します。既存のtesting.Tを使ったテストと並行して使用でき、徐々に移行することも可能です。また、CI/CD環境では通常のgo testコマンドでGoConveyのテストを実行できるため、特別な設定は不要です。
GoConveyのインストールは簡単です。以下のコマンドを実行します。
bash1go install github.com/smartystreets/goconvey@latest
補足: Go 1.17以降は
go installを使うことが推奨されています。
GoConveyの基本構造は、Conveyでテストケースを定義し、Soでアサーション(検証)を行います。以下は基本的な例です。
go1package math 2 3import ( 4 "testing" 5 . "github.com/smartystreets/goconvey/convey" 6) 7// Add関数が定義されているとする 8 9func TestAdd(t *testing.T) { 10 Convey("2つの数値を足し算する", t, func() { 11 result := Add(2, 3) 12 13 Convey("結果は5になるべき", func() { 14 So(result, ShouldEqual, 5) // So(実際の結果, 期待する振る舞い, 期待値) 15 }) 16 }) 17}
Conveyの第一引数はテストの説明文、第二引数は*testing.T(トップレベルの場合)、第三引数は実際のテスト処理を含む関数です。Soは「結果が期待値と等しいこと」を検証します。
テストの実行方法は2通りあります。
コマンドラインから実行:
bash1go test
通常のgo testコマンドで実行できます。
Web UIで実行:
bash1goconvey
プロジェクトのルートディレクトリでgoconveyコマンドを実行すると、ブラウザが自動的に開き(デフォルトではhttp://localhost:8080)、テスト結果がリアルタイムで表示されます。
補足: Web UIはローカル開発環境向けの機能です。CI/CD環境では通常の
go testコマンドを使用します。
もう少し実践的な例を見てみましょう。
go1func TestUserAuthentication(t *testing.T) { 2 Convey("ユーザー認証のテスト", t, func() { 3 user := NewUser("[email protected]", "password123") // 事前セットアップ 4 5 Convey("正しいパスワードでログインできる", func() { 6 result := user.Login("password123") 7 So(result, ShouldBeTrue) 8 }) 9 10 Convey("間違ったパスワードではログインできない", func() { 11 result := user.Login("wrongpassword") 12 So(result, ShouldBeFalse) 13 }) 14 }) 15}
このように、1つのテスト関数の中で複数のシナリオを自然な文脈でテストできます。
GoConveyでは、Conveyをネストすることで、Context(文脈) を表現できます。これはBDDの強力な機能です。
go1Convey("ショッピングカートの動作", t, func() { 2 cart := NewCart() // 事前セットアップの実行 3 4 Convey("商品を追加したとき", func() { 5 cart.AddItem("Book", 1500) 6 7 Convey("合計金額が正しく計算される", func() { 8 So(cart.Total(), ShouldEqual, 1500) 9 }) 10 11 Convey("商品数が1になる", func() { 12 So(cart.ItemCount(), ShouldEqual, 1) 13 }) 14 }) 15 16 // 別の文脈 17 Convey("カートが空のとき", func() { 18 So(cart.Total(), ShouldEqual, 0) 19 }) 20})
また、GoConveyには豊富なアサーションメソッド(Should系関数)が用意されています。
ShouldEqual / ShouldNotEqual:等値性の検証ShouldBeTrue / ShouldBeFalse:真偽値の検証ShouldContain / ShouldNotContain:要素の包含関係ShouldBeNil / ShouldNotBeNil:nil検証ShouldBeGreaterThan / ShouldBeLessThan:大小比較これらを使い分けることで、より表現力の高いテストが書けます。
GoConveyを使う上で、以下の点に注意すると、より効果的にテストを書けます。
ネストは適度に保つ: Conveyを深くネストしすぎると、かえって可読性が低下します。一般的には2〜3階層までに抑えることをお勧めします。
大規模テストでの配慮: 非常に多くのテストがある場合、Web UIの自動リロードが重く感じることがあります。その場合は、特定のパッケージに絞ってテストを実行するか、go testコマンドを併用しましょう。
testifyとの使い分け: Go界隈ではtestifyも人気のあるテストライブラリです。testifyはアサーションに特化しているのに対し、GoConveyはBDDスタイルとWeb UIによる開発体験に重点を置いています。プロジェクトの性質やチームの好みに応じて選択すると良いでしょう。
GoConveyは、テストの記述を楽しく、開発サイクルを加速させる強力なツールです。BDDスタイルの自然な記述により、テストコードが仕様書としても機能し、Web UIによるリアルタイムフィードバックが開発のリズムを生み出します。
テスト駆動開発(TDD)や振る舞い駆動開発(BDD)を実践したいGoエンジニアに、GoConveyは最適な選択肢です。既存のプロジェクトにも段階的に導入できるため、まずは小さなテストから試してみてはいかがでしょうか。
GoForce は、Goエンジニアに特化したフリーランスエージェントです。最新技術を活用したプロジェクトや、テスト駆動開発を実践できる案件など、あなたのスキルとキャリアプランに合わせた案件をご紹介します。
最適なGo案件を今すぐチェック!