BackEnd

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

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

はじめに

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

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

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

 

リポジトリ star contributor 説明
stretchr / testify 5874 121 標準的なライブラリでうまく動作する共通のアサーションとモックを持つツールキット
onsi/ginkgo 2357 77 BDD Testing Framework for Go http://onsi.github.io/ginkgo/
360EntSecGroup-Skylar / goreporter 2190 11 A 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言語による並行処理

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Go言語

Go 1.18のGenericsを使った地味に便利な関数を紹介

1 はじめに2 関数の紹介2.1 解決したいこと2.2 関数の内容3 さいごに4 おすすめ書籍 はじめに 3月15日にリリースされたGo 1.18で、ついにGenericsがサポートされました(Goの ...

laravel logo

Laravelのコントローラの基礎

1 はじめに2 ルーティング2.1 使用可能なメソッド2.2 リダイレクト2.3 Viewの返却2.4 ルートパラメータ2.5 ミドルウェア2.6 プレフィックス3 バリデーション3.1 コントローラ ...

Go言語

sqlcを使ってSQLファイルからGoのコードを生成する

1 はじめに2 sqlcとは2.1 コード解析2.2 サポートする言語とデータベース3 sqlcでコードを生成する3.1 準備3.2 DDLを書く3.3 クエリを書く3.4 コードを生成する3.5 生 ...

rails

半年ぶりにRails Tutorialをやったメモ

はじめに Railsを触り始めて半年ほどたちました、tonnyです。 復習もかねてRails Tutorialを実施したので、そのメモを残します。 やはり2回目でも気づくことは多いので、非常に勉強にな ...

laravel logo

LaravelのDI

1 はじめに2 DIに関する機能2.1 DIとは2.2 サービスコンテナ2.3 サービスプロバイダ3 サービスコンテナ3.1 バインド3.2 bind3.3 bindIf3.4 singletonメソ ...

フォロー

blog-page_side_responsive

2018年10月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

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