BackEnd

Go言語でテスト作成 testifyの基本的な使い方

投稿日:2018年10月16日 更新日:

はじめに

こんにちは、suzukiです。
先週から引き続きgo強化週間です。新しい言語の習得に四苦八苦しております。
第5回目の発表内容は、testifyを利用してテストの作成について触れさせていただきます。

Goテストフレームワークのスター数

Goのテストフレームワークについて、参考リンクを色々探していたのですが、まだまだ群雄割拠の時代です。
Goではtestingパッケージを標準で提供していますが、やや使い方に難があります。そこで、行いたいテストによって他のフレームワークを導入されているようです。
また参考リンク内でよく「デファクトスタンダートがない」等の記述もあったため、スター数が多めのリポジトリ検索をしました。

 

リポジトリstarcontributor説明
stretchr / testify5874121標準的なライブラリでうまく動作する共通のアサーションとモックを持つツールキット
onsi/ginkgo235777BDD Testing Framework for Go http://onsi.github.io/ginkgo/
360EntSecGroup-Skylar / goreporter219011A Golang tool that does static analysis, unit testing, code review and generate code quality report.

検索結果の中で私が普段Swiftの開発で使っているXCTestと近しいと思われるassartionを使えるリポジトリとしてtestifyをメインに進めて行こうと思います。

testifyについて

それではtestifyについて説明させていただきます。まずはtestifyで出来ることですが、
・Easy assertions
・Mocking
・Testing suite interfaces and functions
上記の三つの機能があります。
また、GitHubを確認いただくとわかるのですが、使用例を含めてReadMeが書いてあるため、導入と確認が簡単です!

testifyを導入する方法

実際に導入をして行きましょう。go getコマンドで導入可能です。

testifyの下記パッケージで取得できます。
・github.com/stretchr/testify/assert
・github.com/stretchr/testify/mock
・github.com/stretchr/testify/http

assartionについて

assertionの基本的な使い方は、プログラムの任意の場所に「その場所で成立していることが期待される条件式」を記述するというものです。
in-outのある関数が想定通りに動いているかの確認等を行います。
今回はHow to Write Go Codeに従いReverse関数を作成して見ましょう。

inで受け取った文字列を順番を逆順にして文字列を返却する関数Reverseを作成します。

この関数の機能が問題なく動作していることの確認としては、 abc を入力したら cba が返却されるということを期待してassert文を書きます。

上記のように記述し、下記のコマンドでテストが実行されます。

assertion紹介

testifyでは上記の他にもたくさんのassartionがあります。
使用頻度の高いAssertを下記に記述します。

ElementsMatch

要素が同様かの確認(順番は無関係)

Contains

第二引数に第三引数の要素が含まれているかの確認を行います。

Empty&NotEmpty

nil, “”, false, 0 要素が存在しないか などを確認 Notはその逆です。

Equal&NotEqual (EqualValues Exactly)

Equal…右辺と左辺の値が等しいか確認(使用頻度はかなり高く、いろんなassartionの代用が可能)
NotEqual…右辺と左辺の値が等しくない事を確認
EqualValues…内容の比較(型の比較は行わない。ObjectsAreEqualValuesで比較を行う。nilの場合の扱いがEqualと少し異なる)
Exactly…厳密な比較、型の比較を行う

Error&NoError&EqualError

・Error…エラーが存在しているか
・NoError…エラーが存在していないか
・EqualError…エラーの文字列が望まれる文字列か

Mockについて

assertionでは、値が望まれる形であるかを確認する方法をまとめました。
しかしながら、実際にプログラムを書くとin-outでinの要素を外部から取得するため、不確定な場合がよくあります。
テストの内容を不確定な場合に合わせて変更するのは、テストの運用上間違っています。
Mockを使い不確定な環境をコードから作成し、機能の確認を行うことができます。

Mockを使ってみる

三角形の構造体Triangleに
・CalcArea関数 プロパティの底辺X高さ/2を返却する関数
・RandomArea関数 ランダムな値から面積を返却する関数
以下のコードは実際にMockを作成しレスポンスの変更をしております。

suiteについて

testifyではsuitePackageを利用することでtest suiteを作成することが可能です。
Xcodeでもデフォルトで用意されている下記の2点について簡単に紹介します。
・スイートの各テストの前に実行
・スイートの各テストの後に実行

スイートの各テストの前に実行するインターフェース

下記のSetupTestSuiteがスイートの各テストの前に実行されます。

スイートの各テストの後に実行するインターフェース

下記のTearDownTestSuiteがスイートの各テストの前に実行されます。

Suiteを使ってみる

Suiteのテストも go test で実行できます。
Suiteはストアした情報を一度クリアする、特定のユーザーの初期値をストアする、等で利用できます。
今回はシンプルに動作の確認を取れるサンプルを作成しました。以下のサンプルコードをご確認ください。

実行すると下記のように結果が表示されるかと思います。

・setupの箇所がテストごとに呼ばれ、初期値が設定されていることの確認
・teardownのログ出力で、suite.takeOverCountがそのまま引き継がれている事が確認
上記が確認取れました。

最後に

今回はtestifyの使用例を交えて説明させていただきました。
単体テストでカバレッジレポートの出力もGoでは簡単に作成可能のようです。
実装に比べて手を抜きがちになってしまいますが、testifyで少しでも運用を楽にできればと思います。

私の次回の記事では
・BDDについて
・gingko gomega
について記事を作成させていただこうと思っております。またよろしくお願い致します。

Go記事の連載などは、こちらをご覧ください。

おすすめ書籍

スターティングGo言語 (CodeZine BOOKS)  Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る impress top gearシリーズ  みんなのGo言語【現場で使える実践テクニック】  Go言語による並行処理

page_footer_300rect




page_footer_300rect




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

rails

Ruby2.4でCookieを手動で復号する際に発生したエラーの対処

1 はじめに1.1 前提条件2 発生したエラー2.1 実際のコード2.2 エラー詳細2.3 原因3 どう対処したか3.1 修正後のコード はじめに こんにちは、onoです。 現在開発中のアプリケーショ ...

rails

form_withでフォームの送信前に処理を行う方法

1 はじめに2 form_with3 サンプル4 さいごに5 参考 はじめに フォームを送信する前に処理を行いたいケース(Google Analyticsのイベントのトラッキングなど)があると思います ...

laravel logo

[Laravel] middlewareでHTTPリクエストの前後に処理を入れる

1 はじめに2 middlewareとは3 実装3.1 middleware作成3.2 コード実装4 middleware定義4.1 常に呼び出す4.2 特定のURLにアクセスした時のみ呼び出す4.3 ...

laravel logo

Laravel Authのパスワードリセット機能をカスタマイズする

1 はじめに2 準備2.1 Auth2.2 mailhog3 ユーザー登録とログイン4 パスワードリセットのカスタマイズ4.1 ルーティング確認4.2 view編集4.3 認証処理の編集5 リセット画 ...

Go言語

Go言語 gocraft/workを使って常駐プロセスでジョブを処理させる

1 はじめに2 workの特徴3 workを使えるようにする3.1 Redisのインストール3.2 Go用のライブラリインストール4 Enqueue〜ジョブ実行まで4.1 Enqueue側4.2 ジョ ...

フォロー

follow us in feedly

page_side_300rect

2018年10月
« 9月 11月 »
 123456
78910111213
14151617181920
21222324252627
28293031 

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。