Skip to content

Instantly share code, notes, and snippets.

@pocketberserker
Last active December 15, 2016 15:37
Show Gist options
  • Save pocketberserker/9a955c99020ee2b4077050d1425ec620 to your computer and use it in GitHub Desktop.
Save pocketberserker/9a955c99020ee2b4077050d1425ec620 to your computer and use it in GitHub Desktop.

ユニットテストフレームワークあれこれ

CC BY-SA 4.0

自己紹介

icon

  • なかやん・ゆーき / ぺんぎん / もみあげ
  • @pocketberserker / id:pocketberserker
  • Microsoft MVP for F# (2013/04/01~ 2017/03/31)
  • 非名古屋

JaSST'17 Tokyoの参加募集が2016/12/15から始まりました

http://jasst.jp/symposium/jasst17tokyo.html

テスト強いられている?

テスティングフレームワーク実装を強いられている。

ユニットテストフレームワーク

  • 本当にいろいろある(Wikipediaの一覧を眺めるだけで明白だろう)
  • 共通の概念もあれば、言語によって方針がことなる部分もある

ある程度共通な概念

  • RunnerとAPIの分離
  • parameterize test
  • 入出力を明確にできる
  • 階層構造
  • JUnit styleなXML形式のレポート
  • 外部ツールに渡せること

言語ごとに異なる部分

  • DSLをつくりやすい言語はわりとAPIを凝る印象があったり
    • RSpec、Specs2とか?
  • power assertがうまくかみ合ったりする言語とか
    • DSLのようなメソッドチェーンが氾濫した反動?
    • BABELみたいな仕組みはassertと相性が良さそう
  • DSL覚えるにはコストがかかるという話もある
  • ツールとの連携しやすさ
    • ビルドツールがインターフェースを公開している、とか
  • ライブラリのライフサイクル
    • テスティングフレームワークの変化は緩やかであるべき(JUnit Pocket Guideにこのようなことが書かれているらしい?)  * が、言語バージョンアップにも左右されるのでなんともいえない?   様々な要因があるため一概に良し悪しを語れない。

でも、不満がある場合はどうしよう?

オリジナルテスティングフレームワークを!

  • 良し悪しを考えるために作ればいいんだ!
  • 「これは車輪の再発明ではない。挑戦である」
  • 失敗しても良い経験になる

いやいや……

  • 時間がない
  • 闇はみたくない
    • テストランナーはメタプログラミングやリフレクションを要求されやすい

範囲を狭める

  • テスティングフレームワークの不満の何割はDSLに起因する
    • たくさんのメソッドを覚えられない  * 色々書かされる割には情報量が少ない
  • asserttionなら簡単に拡張できるのでは?
    • フィクスチャやテストケースは影響範囲が大きい  * hamcrestとかそういう感じにみえる

ということで、assertionの拡張を考えてみる。

色々あるよassertion

  • 単純に比較するもの
  • 違反したときに詳細なメッセージを付与するもの
  • 式を解析して情報を付与する
  • オブジェクトを解析する

MuscleAssert

オブジェクトを握りつぶすマン

  • 詳しい話はbleisさんがするはず
  • 個人的なモチベーション: power assertに懐柔されない

実装例?

横道

みんな大好きライオン印のpower-assert

MusleAssertの作り方

  1. オブジェクトdiffライブラリを用意します  * なければつくります
  2. assertionに組み込みます

ね、簡単でしょう?

というわけで

  • 身近なところから遊んでみよう
  • assertionだけで満足できなくなったらランナーへ手を出す
  • ユニットテストから他のテストへ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment