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/