Re: モッククラス、下から見るか?横から見るか?
先日Twitterでリプライがきたのでみてみたら素晴らしいブログ( モッククラス、下から見るか?横から見るか? )がありました。
プログラムにおける自動単体テストでモックをつかうべきかどうか悩んでいるというもの。
私なりにこれに回答しようとおもいます。みんなもなにかおもうところがあれば、SNSではなくブログにしてほしい。(Webからそのままアクセスできるという点において)
- 1. 基本方針
- 2. 仕様化テスト、レガシーコード改善、リファクタリングでつかう
- 3. トランザクションのcloseなどの後処理を確実に検知する。Rxや一部の書き方によってtry-with-resourcesがつかえなくても。
1. 基本方針
- 可能なかぎりモックライブラリはつかわず、コンストラクタDI(Dependency Injection)で解決できるならそうする
- 往々にして厳密な単体テスト(1ファイルにとじたテスト)はしておらずコンポーネントテスト(複数ファイルにまたがったテスト)がおおい
2. 仕様化テスト、レガシーコード改善、リファクタリングでつかう
自動化されたテストがなく、これからリファクタリングをしたいというときには、既存のプロダクトコードを変更せずに自動テストを実装すべきです。そのときには時刻やDBやAPIなどに依存したコードをテストしなければいけないでしょう。
テスタビリティの低い設計ではこれらを「テストから設定」することがむずかしかったり、高速な単体テストとすることがむずかしかったりします。そのときには、モックライブラリをつかって時刻やDBやAPIなどをテストダブル(スタブやモック)におきかえます。
モックライブラリは実質的にリフレクションなどをつかっているものがおおく、プロダクトコードを変更せずにプログラマーが自由なコードで一部の処理を代替させることができます。これによって自動テストを実行できるようにしてから、徐々にリファクタリングをすすめていく。という場面ではモックライブラリが適切でしょう。
3. トランザクションのcloseなどの後処理を確実に検知する。Rxや一部の書き方によってtry-with-resourcesがつかえなくても。
たとえばトランザクションやコネクションのコミットやクローズ処理が確実にされているかを検知したい場合につかえます。 単体テストのメリットとして、IO処理が失敗した場合を簡単に模倣できるという点があります。それ自体はコンストラクタDIな設計における簡易なテスト用のスタブクラスでもできます。
ですが、たとえばDB操作が失敗したときに必ずコネクションがcloseされていることのテストはなかなか検知できません。モックライブラリであればできます。 もちろん静的コード解析でも対応できる部分はありますので、一概にモックライブラリでやるべきとはいいませんが、なかなかに便利なときがあります。
Javaだとtry-with-resourcesとかでかいておけばいいじゃんというのもありますが、rx系というかpromise系というかのライブラリをつかっていたり、いくつかの設計においてはtry-with-resourcesをうまくつかえないことがあります。そのときには、モックライブラリで検知させるというのは妥当だとかんがえています。
実践テスト駆動開発 (Object Oriented SELECTION)
- 作者: Steve Freeman,Nat Pryce,和智右桂,高木正弘
- 出版社/メーカー: 翔泳社
- 発売日: 2012/09/14
- メディア: 大型本
- 購入: 4人 クリック: 262回
- この商品を含むブログ (31件) を見る
- 作者: Kent Beck,和田卓人
- 出版社/メーカー: オーム社
- 発売日: 2017/10/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2018/10/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
ソフトウェアコードのはじめかた
- プロジェクト名や名前空間の雑さはIDEなどの強力さを考慮して決めること
- プロジェクトをつくるときは次の手順でやること
- てきとうにスキャッフォルドでつくる。gradle initとか。
- gitignoreを追加する gitignore.io - Create Useful .gitignore Files For Your Project
- git init
- git add
- git commit で↑までにやったコマンドやWebサービスでの指定方法などをコメントにのこす
- 要件を確認してアーキテクチャと単語の整理
- noteという名前空間をつくり、そこにメモ書き用テストファイルをつくる。
- 要件をテストコードにはりつける
- 要件の一部をテストコードに翻訳する。簡単なケースだけでいい。 : RED
- プロダクトコードを仮実装する。 : GREEN
- 他の入出力のケースをテストに追加する。三角測量。 : RED
- プロダクトコードを修正する。 : GREEN
- テストコードをリファクタリングする。 : GREEN
- 何をクラスとして切り出すかは、何をつくりたいのかを定義している段階できまるので、コードをかきながら決めないほうがいい。
- テストコードはできるだけ長く書きはじめていく。テストコードは動的構造を記述する部分であり、プロトコル定義ツールとして使う。
- 小さいテストコードはあくまでデバッグのサポート、型システムのサポート程度に考えて記述する。
- 静的構造はプロダクトコード側で記述できる内容なので、プロダクトコードのリファクタリングや大枠の設計でおこなうようにする。
- テストコードとプロダクトコードの設計がかたまったら、noteにあるテストコードを適切な名前空間にきりだしてあげる。
フロントエンドのテストツールとか気になっているやつ
テストツールというかサービス中心なんだけど、書籍情報も。
- WebGUIのテストIDE Katalon Studio
- JavaScriptのテスティングフレームワーク
- iOS Appiumで並列テスト
- AIでテストをやるっていう話
- テスト戦略書籍まとめ
週刊ソフトウェアテスト 2015-14 #swtest_jp
前書き
ソフトウェアテストにまつわるニュースを週毎にお届けする記事です。内容はid:kyon_mmの独断と偏見です。オススメの記事があるときや、質問などなどはコメントや@kyon_mmにご連絡くださるとうれしいです。
ハッシュタグ #swtest_jp でソフトウェアテストに関する事をツイートしてくださるととてもうれしいです!(なにかの紹介でも、議論でも、質問でも!
続きを読む週刊ソフトウェアテスト 2015-13 #swtest_jp
前書き
ソフトウェアテストにまつわるニュースを週毎にお届けする記事です。内容はid:kyon_mmの独断と偏見です。オススメの記事があるときや、質問などなどはコメントや@kyon_mmにご連絡くださるとうれしいです。
ハッシュタグ #swtest_jp でソフトウェアテストに関する事をツイートしてくださるととてもうれしいです!(なにかの紹介でも、議論でも、質問でも!
kyon_mmの意見
テストエンジニアとデベロッパーとの幸せな関係とは何か。開発効率の向上も、ゲームを面白くすることもテストエンジニアの領域に(後編) JaSST'15 Tokyo - Publickeyを読んでいて、概ねいいと思ったのですが、この例示というか現場はクソだなー辛そうだなって思ったのが次の文章の後半です。
私は実はQuality Assuarance(品質保証)という名前を (私たちの仕事の名前として)使うことは反対です。 質の高い製品を作る、確約するというのはプロジェクトの誰もが持つ共通の目的です。 テスターはコードを変更する権利はなありません。 スケジュールを変更することも、予算をコントロールすることもできない。 スコープも変えられないし、プログラマの採用もできずクビにもできません。 リリースするかどうかを決定する権限もありません。
チームにおいてテスター、プログラマー、マネージャーは得意分野の宣言でしかないのに、なにを言っているんだって感じ。人の採用については難しいかもしれませんが、最低でもコードを変更する権利がないっていうのはどうかと思いますし、コードを変更するスキルがあまりにもないテスターってよっぽど特定分野でハイスキルじゃないと辛そうっていう感じが。
続きを読む