Go言語とPostgreSQLで遊ぼう!~Unit Test編~

こんにちは。KOUKIです。

Go言語でアプリケーション開発手法を紹介しています。

前回は、sqlcを使ったCRUDの作成について触れました。

今日は、CRUDのUnit Testについて学びたいと思います。

必須モジュールのインストール

次のモジュールをインストールしておきましょう。

pqモジュールは、Postgresに接続するときに必要です。

testifyは、assert文を提供してくれるGoのテストツールです。

テストファイルの作成

Unit Testを記述するファイルを用意しましょう。

Go – Unit Test

DBの接続準備

main_test.goには、前処理としてDBの接続処理を記述します。

func TestMain(m *testing.M)」はイディオムで、全てのテストケースの前と後に実行するBeforeAllAfterAllを実現したい場合に用います。

「dbSource」は、Postgresコンテナへの接続情報を記載しています。ここにつなぎに行くので、テストするときは「docker-compose up」でPostgresコンテナを立ち上げておく必要があります。

「var testQueries *Queries」には、クエリインスタンスが入ります。つまり、このインスタンスからDBを操作できます

DBテスト – CreateAccount

CreateAccountのテストを実装しましょう。

CreateAccountParamsにはPostgresに書き込みたい値を設定して、この情報を引数としてtestQueries.CreateAccountに渡しています。

尚、CreateAccountメソッドにはコンテキストが必要なので、「context.Background()」で空のコンテキストを作成しています。

下記のコマンドで、テストを実行してみましょう。

OKですね。実際にデータが書き込まれているか確認することもできます。

「http://localhost:9232/」にアクセスして、「accounts」タブをクリックしてください。

データが書き込まれていることがわかりますね。私は、テストを2回実行したので、2レコード文書き込まれてますが。。

ユーティリティメソッド – ランダム文字列

テストデータとして「selfnote」を直接打ち込んでいますが、ランダムな文字列でも良さそうです。

ランダムな文字列を生み出すユーティリティメソッドを作成しましょう。

「rand.Seed(time.Now().UnixNano())」は、同じ乱数が取得されてしまうことを防ぐための設定です。

乱数を与えるためにはSeedを設定する必要がありますが、math/randに「var globalRand = New(&lockedSource{src: NewSource(1).(Source64)})」を見ると、Seedに「NewSource(1) 」が固定されており、プログラム実行毎に同じSeedが渡されています。そのため、取得される乱数が全て同じになるようです。

代わりに現在時刻をSeedとして渡すことで、異なる乱数を得ることができます。

このコードをテストコードに追加します。

テストを実行してみましょう。

ランダムの値が入るようになりましたね。これは便利です。

Makefileにテストコマンドを追加追加

テストコマンドをMakefileに追加しておきましょう。

ユーティリティメソッド – ランダムアカウント作成

ランダム文字列を生成できるようになったので、次にランダムアカウントを作成する関数を定義しましょう。

DBテスト – GetAccount

続いて、GetAccountのテストコードを実装しましょう。

GetAccountは、ユーザー情報を取得するメソッドなので、createRandomAccount関数にて作成したユーザーの情報が取得できるかテストしています。

問題なさそうですね。

DBテスト – UpdateAccount

続いて、UpdateAccountのテストを実装しましょう。このメソッドは、Updateなので、createRandomAccount関数で作成したユーザーのBalanceを更新しましょう。

DBテスト – DeleteAccount

続いて、DeleteAccountをテストします。

テストを実行します。

OKですね。

DBテスト – ListAccount

最後に、ListAccountをテストします。

テストを実行しましょう。

テストがPassしました。少し長くなりましたが、以上です。

次回

テストコードが書ければ、アプリケーション開発のレベルもグッと上がるはずです。色々なパターンを書いてレベル上げていきましょう。

次回は、DBのTransactionについて学びましょう。

Go言語まとめ

オススメ書籍

コメントを残す