2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

テストしにくいコードをテストする方法教えて下さい

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 ★