More Related Content
20160702 linuxでもできるc#でアプリ開発 Visual C++ 2015の紹介(C++11/14的に) C++ REST SDKを使ってWebサービスを利用する Viewers also liked (14)
3日時間をもらったのでTypeScriptを触ってみた プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6 Similar to xUnitハンズオン第3回テキスト (13)
20170625 JXUG Fukuoka 発表資料 : Unit / UI Testing - Xamarin Xamarin によるクロスプラットフォームモバイルアプリ開発 JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う! Distributed Agile using UML 【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう Test Manager + Team Foundation Server /Visual Studio Team Services 手順書(共有パラメー... いろいろ見せますLord of Knightsのクライアント開発事例紹介 わんくま名古屋 #40 (20161217) Xamarinで自動化テストしよう xUnitハンズオン第3回テキスト
- 5. 目的
• プログラミング・スキルUP
• C#/.NETの言語仕様を実践的に理解する
• LambdaやLINQといった「積極活用が望まれながら嫌煙されがち」な
事項のノウハウを得る
• OOPにおけるモジュール化の「あるべき」を理解する
• テスト・スキルUP
• 「テストしにくいコード」をテストする工夫をできるようになる
• 「テストしやすいコード」(≒品質高いコード)を意識したコーディ
ングやレビューができるようになる
再掲
- 8. 各回のコンテンツ(予定)
日付 会場 コンテンツ
2016/12/27 コラボレーション
スペースN/E
○ハンズオンの開催概要
○環境構築とはじめてのUTプロジェクト
2017/1/5 セミナールームX ○テストクラスの書き方
○アサーションの種類
2017/1/12 コラボレーション
スペースN/E
○テストできる条件
○テストしやすい条件
2017/1/19 セミナールームY ○TDDの紹介
○CIツールによる自動テスト体制構築
2017/1/26 コラボレーション
スペースW/S
予備回
再掲
- 15. そもそもUTとは?
• UTとは?
• API(公開されたクラスやそのメソッド)がそれ単体でその仕様通り
に振る舞うことを検証〔test〕すること。
• ≒APIそれ単体の仕様を機械言語で表明〔assertion〕すること。
• どのように?
• (自家撞着的だが)APIそれ単体を検証できるような状況を用意する
ことによって。
• つまり、UTはアプリケーションの「あるがまま」を検証するという受
動的なものではない。アプリケーションをその構成要素に分解してそ
れらの振る舞いを検証するため「実験の合理的組織化」を行うという
能動的なもの※1。
※1 G・バシュラール『科学認識論』より。「無限小の物理学のこうした深層領域にすすむと実在が物理学的に
は個体性を失うとすれば、科学者は、自分の実験の精度を大きくするにつれて、その実験の合理的組織化にいっ
そう大きな重要性を与えるようになる」。
- 17. ではUT可能となる条件とは?
• テストできる条件
1. 公開されていること
2. 仕様がわかっていること(実装は不要)
3. 初期化ができること(cf. ASP.NET WebForm)
4. 「副作用」を制御できること(後述)
5. 条件が一定なら何度実行しても結果が変わらないこと
• テストしやすい条件
1. 「副作用」がないこと(後述)
2. 初期化が簡単であること
3. 実行に時間がかからないこと
4. 依存するモジュールのモックを指定できること
実は4つ目と同じこ
とを言っている
- 26. 副作用とは何か:
情報工学の世界の場合
• 副作用なし
• 例:
• 1+1は絶対に2
• "hello".Times(2)※1の結果は絶対に"hellohello"である
• 副作用あり
• 例:
• new StreamReader("hello.txt").ReadToEnd()の結果はファイル内容次第
• new Random().Next(10)の結果はランダム※2
• Console.WriteLine("ca va?")は結果を返さない
• DateTime.Nowは「現在の日時」を返す(「現在」っていつ?)
• elisabeth.Greet()の戻り値は予めelisabeth.Personality = xxで設定された値次第
※3
• すべて「むき出しの副作用」の例だが、こうしたAPIを利用している
APIもまた当然「副作用」を持つことになる
※1 第1回のサンプル・コードとして登場した拡張メソッド。
※2 各言語が標準で備える乱数生成器が実際にどの程度厳密にランダムな値を生成するかはその実装のアルゴ
リズム次第。例えばHaskellのそれは実際にはまったくランダムではない。しかし副作用を持つ点は変わらない。
※3 再びS・ジャクスンの『鳥の巣』の主人公。リジー、ベス、ベッツィ、ベティの4重人格障害。
- 30. 制御(統制)─
脱・副作用/対・副作用の方法
A) 引数と戻り値で表現する
1. 引数で渡せるものならそうする
2. 戻り値で返せるものならそうする
B) 「関心の分離」(separation of concerns)を遂行する
1. メソッドに実現させようとしている「事項」(concern)を腑分けし
て、それぞれに応じたメソッドに分解する※1
2. 「事項」がアプリケーションの主機能(主関心)とそうでない機能
(関心)とに分けられるなら、後者をAOPに移行する※2
C) 副作用部分にモック(後述)を導入する
I/Oなどを担当する部分を別オブジェクト化。しかもクラスではなくイ
ンターフェースを介して参照させる。そして、インターフェースの実装
を差し替える手段を用意する。
D) タリオの法にうったえる
「目には目を歯には歯を、副作用には副作用を」というわけで、環境変
数やロケール(CLRではカルチャー)に介入してしまう。
※1 つまり「AのついでにBもする」というメソッドを分解して、「Aをする」メソッドと「Bをする」メソッド
という2つに分ける。
※2 AOPについてはB・A・テイト、J・ゲットランド共著『軽快なJava―Better,Faster,Lighter Java』などを参
照のこと。
- 33. ではUT可能となる条件とは?
• テストできる条件
1. 公開されていること
2. 仕様がわかっていること(実装は不要)
3. 初期化ができること(cf. ASP.NET WebForm)
4. 「副作用」を制御できること(後述)
5. 条件が一定なら何度実行しても結果が変わらないこと
• テストしやすい条件
1. 「副作用」がないこと(後述)
2. 初期化が簡単であること
3. 実行に時間がかからないこと
4. 依存するモジュールのモックを指定できること
再掲
- 37. テストしやすい条件:
4. モックを指定できる
• 例:
• UserServiceはそのメソッドの中でUserDaoのメソッドを呼び出して
いる。つまりUserServiceはUserDaoに依存している。
• UserServiceをテストするのに、UserDaoの挙動まで確認するのはテ
ストを困難もしくは不可能にさせてしまう。
• したがって、テスト時はUserDaoのモック(例えばそのメソッドは必
ず同じ決まった値を返す)をUserServiceに設定しておき、
UserServiceのコードだけをテストできるように仕向ける。
IT~本番用
UT用