■ このスレッドは過去ログ倉庫に格納されています
テストしにくいコードをテストする方法教えて下さい
- 1 :デフォルトの名無しさん:2012/04/14(土) 21:59:51.59 .net
- ここで言うテストっていうのは
ユニットテストみたいなものね。
人間がぽちぽち操作してやるテストじゃありません。
- 950 :デフォルトの名無しさん:2017/01/03(火) 20:14:50.68 ID:q0Juw9L/.net
- 型安全な言語なら大丈夫だろというツッコミ入るだろうから先に言っておくけど、型だけでなく普通に数値を間違える可能性もあるので適切なassertionが必要。その点においてカバレッジ100%なんて意味はない。
コード見たら自明とか言ってたらそもそもテスト書く意味ねえから。コードは書いたとおりに動くだけなわけで。
- 951 :デフォルトの名無しさん:2017/01/03(火) 22:28:17.83 ID:f6cee8Pv.net
- >>948
> 新たにハッシュに追加した項目は、テストすべき
いらない。やる価値がない。
- 952 :デフォルトの名無しさん:2017/01/03(火) 22:35:23.75 ID:f6cee8Pv.net
- 新たにハッシュに追加した項目は、テストすべきというのなら
そのハッシュをファイルから読み込む場合は、
設定しうるすべてのデータをテストすると言ってるようなもん。
- 953 :デフォルトの名無しさん:2017/01/03(火) 23:14:59.37 ID:k9drGvKD.net
- >>952
ファイルから読み込む場合とクラス内にデータとして埋め込むのは設計からして違うし、
ファイルから読み込む場合も想定するデータは全てテスト書くに決まってるじゃん?
- 954 :デフォルトの名無しさん:2017/01/03(火) 23:55:01.89 ID:k9drGvKD.net
- >925 のprivate関数をテストやりづらいからという理由だけでファイルから対応表を読み込むように変更するというのはバカの所業というのに誰も異論ないよね?
- 955 :デフォルトの名無しさん:2017/01/04(水) 01:34:37.57 ID:M78fqhv6.net
- >>953
想定するデータ=すべての動物
書いてみてよ
- 956 :デフォルトの名無しさん:2017/01/04(水) 01:35:26.99 ID:M78fqhv6.net
- >>954
これのどこがファイルからデータ読み込んでるの?
data = {人: 2, 犬: 4, 猿: 4, キジ: 2, 猫: 4}
numberOfFeet = new LookupTable(data)
いいからこのコードのテストを書いてみて。
- 957 :デフォルトの名無しさん:2017/01/04(水) 01:40:37.97 ID:M78fqhv6.net
- 当たり前だけどさ、単なる変数定義のテストを書く意味は無いんだよね。
テスト初心者がよくやる意味がないテスト例
実行コード
data = {a: 1, b: 2, c: 3}
テストコード
assert(data, {a: 1, b: 2, c: 3})
こんなのね。さらにマヌケなのが、実行コードからコピペして
テストコードを作るw
こういうのは全く意味がない。dataにそのように定義しているのだから
dataにその値が入っているのは当たり前。
こういうのはやる意味がないし、やる必要がない。
逆に言えば、やる必要がないコードにすることで
意味がないテストコードを減らすことができる。
- 958 :デフォルトの名無しさん:2017/01/04(水) 01:45:12.40 ID:M78fqhv6.net
- 時間は有限なのだから、テストもやる価値があるものだけやって
やる価値が無いものは、省略しなければいけない。
で、慣れた人は意図的にやる価値が無いものを増やして
本当に重要なやる価値があるテストを
必要最小限に絞り込むことができる。
- 959 :デフォルトの名無しさん:2017/01/04(水) 05:34:38.96 ID:H7YeB4ee.net
- >>955
じゃあ”すべての動物”の定義からやってくれないとね
>>956
クラスの内部実装に埋め込むのがファイルから読み込むのと変わらないと言ってるように見えたから念のため確認しただけだよ
そしてnumberOfFeetはprivate関数なのだからそれに対して直接テストする意味はないと何度も言ってる
publicインターフェースとその仕様が定義されないとテストを書く意味がない。
俺が勝手にそれを定義して書いてもいいけど、このスレ勝手にオレオレ定義で言ってもない事に対して反論して収拾つかなくなってるように見えるからそれこそそんな無駄なことやりたくねえわ
- 960 :デフォルトの名無しさん:2017/01/04(水) 05:43:05.97 ID:M78fqhv6.net
- > じゃあ”すべての動物”の定義からやってくれないとね
現在発見されているすべての動物
- 961 :デフォルトの名無しさん:2017/01/04(水) 05:44:23.06 ID:M78fqhv6.net
- > そしてnumberOfFeetはprivate関数なのだからそれに対して直接テストする意味はないと何度も言ってる
public関数経由でテストするんだろう?
> publicインターフェースとその仕様が定義されないとテストを書く意味がない。
お前がかけなかっただけ。
俺はpublicインターフェースを新たに作ることで
テストを書く方法を提示した。
- 962 :デフォルトの名無しさん:2017/01/04(水) 05:48:25.31 ID:M78fqhv6.net
- 思ったんだけど、こういうのって数学の証明に似てるよな
数学3ケタの自然数が3の倍数の証明をする時、
すべての数学3ケタの自然数を3で割れるか
テストしなくちゃならないと思う人がいる
一方で「数学3ケタの自然数」表す式に
設計を変更することで、わずかの労力で
3で割り切れることをテストする人もいる。
- 963 :デフォルトの名無しさん:2017/01/04(水) 06:01:37.09 ID:M78fqhv6.net
- もう少しちゃんと書くかw
private function numberOfFeet(動物) returns 脚の数
{
if (動物 == 人) { return 2 }
if (動物 == 犬) { return 4 }
if (動物 == 猿) { return 4 }
if (動物 == キジ) { return 2 }
if (動物 == 猫) { return 4 }
:
:
raise exception 知らない動物
}
というコードがあったとき、これはprivateだからテストできないというやつがいる。
publicインターフェース経由でテストするのは間違いではないが、
おそらくそれは多数の意味のないテストになるだろう。
これを、俺は内部の設計を変更しLookupTableクラスを作った
data = {人: 2, 犬: 4, 猿: 4, キジ: 2, 猫: 4}
table = new LookupTable(data)
private function numberOfFeet(動物) returns 脚の数
{
return table.get(動物)
}
LookupTableクラスのテストを書くのは簡単だから省略するが
動物をいくら増やしてもテストの数が変わらないことはわかるだろう。
残るテストはdataの中身が{人: 2, 犬: 4, 猿: 4, キジ: 2, 猫: 4}を確認するだけ
だが変数にその値を入れてるのだから、その値になるのは当たり前すぎて
テストの意味がない。こんなのはやる意味がない
- 964 :デフォルトの名無しさん:2017/01/04(水) 06:06:44.60 ID:M78fqhv6.net
- × 俺はpublicインターフェースを新たに作ることで
○ 俺はpublicインターフェースを持つクラスを新たに作ることで
- 965 :デフォルトの名無しさん:2017/01/04(水) 06:20:09.60 ID:H7YeB4ee.net
- >>960
お前はそのファイルに何を定義できるのか聞かれたら”現在発見されているすべての動物”と答えるのか?
色々な意味で頭悪そうだな…
>>961
はぁ、じゃあ俺は
>>925 の内部実装を持つクラスに
public int getNumberOfFeetOfCat()
という外部インターフェースが定義されてるとして話を進めるわ
assert(4==getNumberOfFeetOfCat());
とだけ書く
それでテストのコードカバレッジ100%にしろと言われたらprivate関数内のデッドコードの方を削除する。
- 966 :デフォルトの名無しさん:2017/01/04(水) 09:10:20.20 ID:u2CyXKSE.net
- >>962
言ってることが分からんが
もうらが必要ならテストすべきだし、必要じゃないなら統計で十分
証明済みならテストすら不要
- 967 :デフォルトの名無しさん:2017/01/04(水) 09:30:57.30 ID:M78fqhv6.net
- >>965
> assert(4==getNumberOfFeetOfCat());
> とだけ書く
> それでテストのコードカバレッジ100%にしろと言われたらprivate関数内のデッドコードの方を削除する。
仕様が変わってる。まったくつかえねーなw
- 968 :デフォルトの名無しさん:2017/01/04(水) 09:39:32.25 ID:H7YeB4ee.net
- >>967
仕様決めてないだろ?何言ってんだよ
- 969 :デフォルトの名無しさん:2017/01/04(水) 09:54:38.49 ID:H7YeB4ee.net
- private関数がいてそれがどの関数からも呼ばれていなかったらテストどころか、存在する必要がないからそのprivate関数は即刻削除すべき
当たり前の事だと思ってたけど、ID:M78fqhv6の中では何とかしてpublicメンバーに変更にしてテスト書くべきらしい。
- 970 :デフォルトの名無しさん:2017/01/04(水) 09:57:00.51 ID:MZRDhGwM.net
- 必要なのは設定値の網羅テストじゃなくて、業務要件(要求仕様)の網羅テストだろ
それが足りてれば、将来想定外の問題が起きた時、要件定義の抜けということになり、テストの抜けとはならない
- 971 :デフォルトの名無しさん:2017/01/04(水) 13:24:05.05 ID:H7YeB4ee.net
- ID:M78fqhv6は自身満々に連投長文してる割に
If you change your software's internal implementation,
your tests should not break as long as the change is not observable by users.
Therefore, per the black-box testing principle, most of the time you should test your code through its public interfaces.
この部分の意味を理解していないように見える
- 972 :デフォルトの名無しさん:2017/01/04(水) 17:47:01.38 ID:u2CyXKSE.net
- privateまでテストしろとか聞いたことないよな
まともにプログラム組んだことないんじゃないの?
ケントベックすら涙目だな
- 973 :デフォルトの名無しさん:2017/01/04(水) 17:50:31.94 ID:u2CyXKSE.net
- まあ例外的に広範囲に呼び出し頻度が高いのはモジュール化してやるべきだろうが、
おそらくこいつはそう言う話はしてないだろう
- 974 :デフォルトの名無しさん:2017/01/04(水) 19:30:09.67 ID:H7YeB4ee.net
- ID:Oj8nbLhF とかケントベックの言ってること読んだら
>>全く適性がないから、さっさと業界から消えてくれ
って間違いなく言うだろうな…
- 975 :デフォルトの名無しさん:2017/01/04(水) 23:08:56.12 ID:6PKdRVzk.net
- private関数では、内部からの単体テストをするが、
public関数では、外からの入出力テストをする
public関数では、関数内の冒頭で、引数の妥当性チェックも行うが、
private関数では、内部実装を知っている人がコーディングするので、
そういう事を知っているのが前提なので、引数チェックもしない
- 976 :デフォルトの名無しさん:2017/01/05(木) 04:38:14.13 ID:4wDE4Xcp.net
- >>974
まるで逆だ。むしろID:Oj8nbLhFの主張はKentに近い。
なにより、Kentは「googleの人が言うからテストしなくていい」なんて発想が大嫌いだ。
- 977 :デフォルトの名無しさん:2017/01/05(木) 06:46:56.47 ID:SvuiXrcs.net
- >>976
大嘘つくなボケ死ね
- 978 :デフォルトの名無しさん:2017/01/06(金) 11:21:36.75 ID:eKTGnv0Z.net
- うるさいカス
- 979 :デフォルトの名無しさん:2017/01/06(金) 14:36:57.64 ID:XtKi9eaG.net
- ume
- 980 :デフォルトの名無しさん:2017/01/07(土) 12:18:28.69 ID:HNCUhS1Q.net
- 先にこっち使え age
- 981 :デフォルトの名無しさん:2017/01/08(日) 00:19:17.41 ID:oIuk3BCz.net
- >>963
日本語では動いたけど他言語だと動かねーよとかありそうだし
一応やれって言われそうなパターンだぜ
- 982 :デフォルトの名無しさん:2017/01/08(日) 00:29:50.83 ID:xMVs4RXt.net
- >>981
必要ならやればいいじゃん?
でもやるのはLookupTableクラスだけでよい。
- 983 :デフォルトの名無しさん:2017/01/08(日) 00:32:24.71 ID:xMVs4RXt.net
- Kentもいってるようにprivateメソッドを直接テストしたいと
思ったら設計が悪いってことなんだよ。
設計を見直せば自然とpublicメソッドになるし、
それをテストすればいい。
設計を見直さないからだめなんだよ。
- 984 :デフォルトの名無しさん:2017/01/08(日) 04:51:02.71 ID:v0X1COHT.net
- >>982
privateメソッドに着目してテストしようとしてる時点でKentBeckの言ってることから外れてる。
publicメソッドがその仕様に合致してるかどうかのテストが必要。それ以上でも以下でもない。
publicメソッドのテストではその確認が難しい、privateの部分に対して直接テスト書きたくなったって時点でお前のいう設計見直しが必要。
そこは間違ってないが、そこだけ言うのは間違ってる
- 985 :デフォルトの名無しさん:2017/01/08(日) 09:15:06.60 ID:iuCVJZyA.net
- ケント様のおっしゃる通り!
ケント様の導きに従えばバグなんて出ない!
ひゃはははは腹いて〜
- 986 :デフォルトの名無しさん:2017/01/08(日) 12:33:55.08 ID:0mVP2hZ6.net
- 要検討
- 987 :デフォルトの名無しさん:2017/01/08(日) 14:43:42.44 ID:xMVs4RXt.net
- >>984
> privateメソッドに着目してテストしようとしてる時点でKentBeckの言ってることから外れてる。
外れてない。あんたはコードが成長するって言うことをわかっていない。
最初はシンプルでprivateにするのが妥当であっても、
仕様の変化や追加で、コードは変わっていく。
そのときにprivateをprivateのままテストをするんじゃなくて、
privateをテストしたいと思ったら設計が(今となっては)悪いってこと
だからまず先に設計を見直せという話。そうすれば自然とpublicに変わる。
privateをそのままpublicにするって話じゃない。
設計を見直すことでpublicに変わる。
- 988 :デフォルトの名無しさん:2017/01/10(火) 01:42:58.16 ID:qNfJPVUt.net
- テストの為にコードを書いてそう
- 989 :デフォルトの名無しさん:2017/01/10(火) 01:44:19.87 ID:qNfJPVUt.net
- 訂正
テストでカバレッジ100%にするためにコード書いてそう
- 990 :デフォルトの名無しさん:2017/01/10(火) 02:53:22.33 ID:eBcQpFvA.net
- なんで100%にしなくていいかを考えればわかると思うけど
やるコストに対して効果が少ないから100%にする意味が無いってこと。
言い換えると効果が少ない部分に対しての
最大の手抜きがやらないってこと。
でもね、やらなくても、やるコストを減らすという方法もある。
privateをprivateのままテストするのはコストが高い。
なぜなら実際にテストしたい対象がpublicメソッドを介した奥深くに入り込んでいるから
奥深くに入り込んだメソッドはその他の多くのコードが含まれているためテストの条件も複雑になりがち
だからそういうのは設計を見直してpublicにすることでテストのコストを下げることができる。
- 991 :デフォルトの名無しさん:2017/01/10(火) 08:46:08.05 ID:AG10ysu4.net
- 硬直してるね
そんなにprivateは悪設計だというのなら
private禁止にすればいいじゃんw
- 992 :デフォルトの名無しさん:2017/01/10(火) 14:13:13.65 ID:s989ZmsY.net
- 外からみてprivateが無いのと一緒なら
外から見たpublic部分のインターフェース部分だけテストすればいい
じゃだめなん?
- 993 :デフォルトの名無しさん:2017/01/10(火) 17:47:46.88 ID:/pTxhyNV.net
- テストのためにprivateをpublicにするんだそうだ
- 994 :デフォルトの名無しさん:2017/01/10(火) 18:04:36.09 ID:UBJKCQag.net
- 無駄な抵抗はよせ
- 995 :デフォルトの名無しさん:2017/01/10(火) 20:56:15.77 ID:eBcQpFvA.net
- >>991
> そんなにprivateは悪設計だというのなら
誰がそんなこと言ってるの?
わざと話をすり替えようとしてるのかな?
privateを "テストしようと思ったら" 悪設計だって
話をしてるよね?
卑怯だなぁ。どうせわざとだろうなぁ
- 996 :デフォルトの名無しさん:2017/01/10(火) 21:35:11.46 ID:eBcQpFvA.net
- 結局のところ話しは簡単で
悪い設計は直しましょうってことなんだよね。
- 997 :デフォルトの名無しさん:2017/01/10(火) 21:47:34.39 ID:WdYb5nlV.net
- 「悪い設計」の判断基準がおかしい
- 998 :デフォルトの名無しさん:2017/01/10(火) 22:02:47.20 ID:eBcQpFvA.net
- >>997
悪い設計の判断基準はいくつもあって、
その中の一つってだけなんだが?
- 999 :デフォルトの名無しさん:2017/01/10(火) 22:03:29.15 ID:eBcQpFvA.net
- 別に悪い設計はprivateのテストがしたくなったときだけとは言ってない
総レス数 999
321 KB
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★