1: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:12:50.46 ID:d0BdcYGa0.net

皆さんこんばんは。
今回はユニットテストについて勉強していきましょう


2: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:13:34.77 ID:rl5YXWBg0.net

はい


3: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:14:44.25 ID:v1sp5ndT0.net

第一回からお願い


4: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:14:44.50 ID:d0BdcYGa0.net

最近「ユニットテスト」という単語をよく聞くようになりましたね。
今回はそのユニットテストについての講座です。

まずユニットテストとは何でしょう?
ユニットには「単位」「単体」という意味があります。

単位部品、あるいは部品単体のテストを行うというのがユニットテストです。


5: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:15:51.11 ID:d0BdcYGa0.net

ここでいうユニットとは何でしょうか?
「関数」や「クラスメソッド」です。

こういった最小限のまとまりを持つユニットをテストできるのがユニットテストです。


7: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:17:07.35 ID:2IN0GVN90.net

なんぞこれ


9: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:18:02.49 ID:qVw9D9jJ0.net

勉強させてもらいます


11: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:18:56.89 ID:+gpNT+tU0.net

オブジェクト信者の講師が何か言ってたな


12: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:19:18.98 ID:d0BdcYGa0.net

「ユニット」でテストができるというのはとても興味深いことです

自分でテストしようと思ったら - 最近ではOOPが主流ですから - クラス単位あるいはもっと大きな単位でテストするしかありません。
関数やメソッドにピンポイントで焦点をあててテストできるというのはとてもおいしいですね。


14: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:21:30.59 ID:d0BdcYGa0.net

ユニットテストの手法はシンプルです。

「ある関数」に「ある引数」を渡した時その返り値が「ある条件」に見合うものかどうかをチェック

これがユニットテストの手法です


17: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:23:44.46 ID:aNf7Umn70.net

なるほどつまり、「ある関数」に「ある引数」を渡した時その返り値が「ある条件」に見合うものかどうかをチェックするのがユニットテストの手法なんですね


16: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:23:42.89 ID:d0BdcYGa0.net

PHPUnitでは以下の様なテストができます

assertTrue
assertEquals
assertLessThan
assertFileExists
assertType

などなど


15: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:21:45.81 ID:rl5YXWBg0.net

質疑応答はどのタイミングで行われるのですか??


18: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:24:40.74 ID:d0BdcYGa0.net

以上で講座を終わります

何か質問はありますか?


21: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:26:45.16 ID:qVw9D9jJ0.net

>>18
ビジュアルスタジオとエクリプスはその機能ついてる?


24: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:30:56.70 ID:d0BdcYGa0.net

>>21
http://codezine.jp/article/detail/4811?p=2


36: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:58:16.00 ID:qVw9D9jJ0.net

>>24
ビジュアルスタジオは出来るんだね
サンクス


20: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:26:32.23 ID:i4IbFWzj0.net

テストした結果どういうのが帰ってくるのが一般的なの
ここがおかしいよってのはわかるの


22: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:29:31.39 ID:d0BdcYGa0.net

>>20
それはこちらが指示してやります
例えばある関数funcAに数字を代入してその数字が奇数なら"Odd"、偶数なら"Even"という文字列を返すとしましょう。

この関数をテストしたいときは

$this->assertEqual("Odd", $this->funcA(3));
$this->assertEqual("Odd", $this->funcA(5));
$this->assertEqual("Even", $this->funcA(6));

このようにやって正しい値が帰ってくるかテストできます


23: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:30:51.08 ID:2IN0GVN90.net

function test_ is_vaild_password_success() {  assertTrue(is_vaild_password("12345678"));
}

function test_ is_vaild_password_false_too_short() {  assertFalse(is_vaild_password("1234"));
}


25: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:31:57.95 ID:d0BdcYGa0.net

>>23
testをプリフィックスに採用する

よくわかっていますね


26: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:33:38.80 ID:TKFkDd4s0.net

関数コールした結果、内部でメンバ変数も変わる場合はメンバ変数もテスト対象になるんでそ
出力だけしか注目せんの?


31: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:39:34.00 ID:2IN0GVN90.net

>>26
せやね
private変数の場合はリフレクションとかを利用して値をチェックするなどできる
が、そもそも内部状態に副作用を及ぼして
呼び出し順で動作が変わるようなクラスはあまり望ましくないとも言える


29: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:37:55.10 ID:+W/3prVH0.net

テストケースの選び方のコツってある?


34: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:45:58.45 ID:2IN0GVN90.net

>>29
基本的には境界値チェックといって
動作がちょうど変わる値辺りを引数に渡すようにする
後は言語にもよるが型の合わないものを渡したり
数値ならマイナス、0を入れるなど異常系を色々入れておくと良い


28: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:35:07.76 ID:xElB9Pp70.net

どこまでテストすればいいか分からん
例外とかDB周りとかめんどくさすぎるんだけど全部やった方がいいの?


32: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:42:52.15 ID:2IN0GVN90.net

>>28
どこまでやるかは人それぞれだな
保守していかないといけないコードなら書いた方が後々泣きを見ないで済む

DB周りは依存性を注入できるようにしてモックに差し替えられるようにすると楽にテストが書ける


53: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:28:48.27 ID:7Op3uTvR0.net

動作確認は頭の中でやったキリッ


39: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:03:48.66 ID:er2/IMeE0.net

ユニットテスト、なんていかにも高尚っぽい名前で呼ばなくても
その程度のこと普通にデバッグでやるよね


41: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:07:02.64 ID:fppkc26Y0.net

>>39
ユニットテストって普通の言葉だと思うが…
デバッグ、だと指し示す範囲が広すぎて何のことかわからん
普通にやる、って動作試験のことじゃないよな


37: 以下、\(^o^)/でVIPがお送りします 2014/06/14(土) 23:58:52.57 ID:xElB9Pp70.net

みんなTDDとかやったりするの?
趣味で書いてると仕様なんて変わりまくるから
めんどくさくて先にテストコードとか書いたことないんだけど
手間が大きすぎてうまくテストのメリットを享受出来ない


38: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:02:37.04 ID:fppkc26Y0.net

>>37
TDDはテストを書くためのベストプラクティスではなく
テストを意識することによってより良い設計になるという考え方の1つなので
テストは普通に出来上がったものに対して書くだけでいいと思うよ


50: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:22:57.71 ID:aqZpwQSc0.net

>>38
なるほどサンクス
やっぱりそんなもんなのか

web系で零細とかだとテストは作った時だけで
テストコードとして残しておくのとかは少なかったりしないかな
俺が前にいた所がそうなんだけど
自分で勝手にテスト書いてるだけだったから周りがどういう風にしてるのか気になる


52: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:28:09.06 ID:fppkc26Y0.net

>>50
どの程度が零細かはわからないが
ウチのチームは基本的に全パターン網羅するように書いた上で
それをリモートにpushした段階でJenkinsでテストさせている
なのでテストコードも普通に保守対象だな

そしてmasterブランチのテストを落とした奴には
容赦なく全員から非難の言葉が投げかけられる


59: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:43:26.48 ID:aqZpwQSc0.net

>>52
そりゃそうだよなぁ
Jenkinsとか使ったことないわ
Jenkinsでテストさせてるのはmasterのブランチだけ?
同じサーバで別ブランチのテストとか出来たりするの?


60: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:45:06.11 ID:aqZpwQSc0.net

って出来るんだな
すまん先にググるべきだった


61: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:49:40.96 ID:fppkc26Y0.net

まあJenkinsはプラグイン入れたら大概のことはできるようになってるよ
プラグインなくてもシェルスクリプト実行できるから結局なんでも出来る


62: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:51:38.11 ID:fppkc26Y0.net

github使ってるならpull reqにした時に対象のブランチをテストして
その結果をpull reqの画面に出すとかできて神


63: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:57:30.50 ID:aqZpwQSc0.net

なるほど
Jenkinsの仕組みがよく分かってないから色々試してみる
githubにテスト結果表示してる人多いけど何かめんどくさくてずっと避けてたわ


64: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 00:59:08.02 ID:fppkc26Y0.net

Jenkinsは思ったよりずっと簡単だから大丈夫
java -jar jenkins.war で起動して弄くりまくれ


65: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 01:04:09.79 ID:fppkc26Y0.net

>>63
ちなみにgithub pull request builder pluginってやつな
下の記事見ながらやったら多分すぐできると思う

ttp://qiita.com/kompiro/items/a097b3b36aa30bc751c6


66: 以下、\(^o^)/でVIPがお送りします 2014/06/15(日) 01:09:59.77 ID:aqZpwQSc0.net

>>65
ありがとう
ほんと優しいな
というか会社でエンタープライズ契約してるのか
羨ましい

関連
プログラミング講座第18回「オブジェクト指向プログラミング」
2ちゃん式iOSプログラミング講座第9回「デリゲート」
【第2回】java8講座ラムダ式/p>
元スレ:http://viper.2ch.sc/test/read.cgi/news4vip/1402755170/