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言語による並行処理

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:


comment

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

CAPTCHA


関連記事

麻雀で自分が何を切るか学習させる

1 はじめに2 プロジェクト名を決めてみる3 何切る問題で考慮される要素3.1 手牌3.2 ドラ3.3 考慮していない要素(本当は入れたい)4 学習の方法5 さいごに はじめに 前回執筆しました、配牌 ...

[Dialogflow + CF] アクア様が罵倒してくれたり天気を教えてくれるSlackボットを作る

1 はじめに2 Dialogflowの準備2.1 プロジェクトを作る2.2 Intentを作る2.3 試してみる2.4 WELCOME Intentを作る3 Slackボットを作る4 名前を答える5 ...

rails

Rails5で出力される「alias_method_chain is deprecated.」について

1 はじめに2 alias_method_chainとは3 Module#prependとは4 とりあえず、DEPRECATION WARNINGの出力をなくしたい5 さいごに はじめに 直近のプロジ ...

rails

さらば「rails migrate」、よろしく「ridgepole」

1 はじめに2 Ridgepoleとは3 rails migrateではなく、Ridgepoleを選定した理由4 rails migrateからRidgepoleへの移行手順5 capistrano3 ...

rails

RailsでS3に画像をアップロードする

1 はじめに2 今回やりたいこと3 下準備3.1 ImageMagickをインストールする3.2 Gemをインストールする4 レコード生成時にファイルを指定してアップロードする4.1 アップローダを作 ...

フォロー

follow us in feedly

blog-page_side_responsive

2018年10月
 123456
78910111213
14151617181920
21222324252627
28293031 

アプリ情報

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