カプセル化■プライベートメソッドをテストする方法at TECH
カプセル化■プライベートメソッドをテストする方法 - 暇つぶし2ch1:デフォルトの名無しさん
20/07/05 20:47:46.60 M+BkbwUs.net
■短い回答
プライベートをテストしたい場合は設計に問題があるので、パブリックに変更してテストしましょう
■これに対する(変な人の)驚いた反論
プライベートを一時的にパブリックにして、テストが終わったら
プライベートに戻すなんてやるわけないだろw
↑誰もそんなコトしろなんて言ってない
■テスト専門家による回答
t-wadaのブログ
URLリンク(t-wada.hatenablog.jp)
短くまとめると、プライベートなメソッドのテストを書く必要は 無い と考えています。
ほとんどのプライベートメソッドはパブリックメソッド経由でテストできるからです。
プライベートメソッドは実装の詳細であり、自動テストのターゲットとなる「外部から見た振る舞い」ではありません。
プライベートなメソッドのテストに関しては、4つの考え方があります。
・パブリックメソッド経由でテストする
・別クラスのパブリックメソッドとする
・テスト対象の可視性を(やや)上げる
・プライベートのまま、リフレクションでアクセスしてテストを書く
パブリックメソッド経由でテストする
多くの場合、そのクラスのパブリックメソッド経由でプライベートメソッドのテストも同時に行えます。テストできているか不安があるならテストカバレッジを確認しましょう。
別クラスのパブリックメソッドとする
プライベートなメソッドのテストを書きたいということは、実はテスト対象の責務が多すぎることを示唆している場合があります。
テストがどうしても書きたい場合は、その責務はテスト対象のプライベートな振る舞いではなく、他の誰かのパブリックな振る舞いなのでしょう。

2:デフォルトの名無しさん
20/07/05 20:48:27.27 M+BkbwUs.net
前スレ
カプセル化の有害性、オブジェクト指向は愚かな考え
スレリンク(tech板)

3:デフォルトの名無しさん
20/07/05 20:51:53.15 M+BkbwUs.net
クソコード例。こんなコード書いてるやつが、privateのテストで
パブリックに変更してテストするのはおかしいとか言ってる(笑)
lenが配列(笑)理由 int型にはnullが入れられないから(笑)
スレリンク(tech板:805番)
ずれるかもしれないが下のような場合、privateにnullを突っ込んだらヌルポだが
privateをわざわざコード弄ってまで別にテストするようなことは少なくとも
ビジネスソフトでは知ってる限り無い。組み込みとかは知らんし必要ならやれば良いけど。
class ChinTester {
public void testChin(int[] len) {
if (len==null){System.out.println("You are a woman");
return;}
if (len.length<11){ uncS(len);}
else{funcB(len);}
return;}
private void funcS(int[] len){
if (len.length<9){System.out.println("Smallest");
}else{System.out.println("Smaller");}
return;}
private void funcB(int[] len){
if (len.length<14){System.out.println("Medium");}
else if (len.length<16){System.out.println("Bigger");
}else{ System.out.println("Wow!");}
return;}
}

4:デフォルトの名無しさん
20/07/05 20:53:33.00 M+BkbwUs.net
983 名前:デフォルトの名無しさん[] 投稿日:2020/07/05(日) 14:18:27.81 ID:9F15TCk0 [68/74]
正直あの短さでOOかどうかと(スタティックでインスタンス化もないコードだが)言うのは
不毛だけどID:JiRnWiGCの組み込みおじさんのがOO感はあるよ。
で、staticで出されてもprivateのテストがどうかと言う話には全く寄与しないわけだが、
じゃあ逆に、>>805のチンコテストのfuncSとfuncBはどうやってテストするの?
パブリック経由で全パターンと言うことならこれでこの話はおしまい。
パブリック経由でやりましょう。
違うと言うなら具体的にコードでおながいします。

5:デフォルトの名無しさん
20/07/05 20:54:53.36 M+BkbwUs.net
>>4への回答
設計に問題があるので、コードを修正しましょう。
修正すれば自然とpublicになります↓
926 名前:デフォルトの名無しさん[] 投稿日:2020/07/05(日) 12:20:23.64 ID:MQ9nuMmc [21/53]
>>805
こう書いた方が良いと思うの
URLリンク(paiza.io)

6:デフォルトの名無しさん
20/07/05 20:57:49.33 M+BkbwUs.net
>>5の補足、これはまだプライベートですが
普通はMainクラスにコードをごちゃごちゃ書かないので
judgeLengthを含むクラスを作成します。
そしてmainから呼び出します。
必然的にjudgeLengthメソッドはパブリックになります。

7:デフォルトの名無しさん
20/07/05 21:03:41.24 MQ9nuMmc.net
>>6
judgeLengthをpublicにしてよいかどうか、オブジェクトをわけて良いかどうかは微妙なところで
publicにした場合って他のオブジェクトからも参照可能になってしまうので
そこの依存があとあとjudgeLengthの修正をできなくする可能性があるので
privateにするっていうのは他のオブジェクトから依存させないようにして独立させる意味もあるので
テストするためにpublicにしますっていうのは僕はやっぱり反対ですね

8:デフォルトの名無しさん
20/07/05 21:04:50.23 MQ9nuMmc.net
僕が書いたように同じオブジェクトにテストコードも書いちゃえば良いと思います

9:デフォルトの名無しさん
20/07/05 21:07:40.54 M+BkbwUs.net
>>7
微妙でもなんでもねーよ
Mainクラスに関係ない処理を入れるな
これは小さいサンプルだが、大きくなった時
Mainクラスに、そんな処理はいってたらおかしいだろ
なんで(大きくなったコードの)その他の部分は別のクラスにあるのに
この処理だけMainクラスにあるんだ?って

10:デフォルトの名無しさん
20/07/05 21:09:37.34 MQ9nuMmc.net
>>9
Mainクラスと関係ある処理だからMainクラスにあるんじゃよ
Mainクラスからしかアクセスしないからprivateなんじゃよ
テストするためにpublicにするのはおかしいのじゃよ

11:デフォルトの名無しさん
20/07/05 21:11:26.55 M+BkbwUs.net
>>10
Mainクラスと関係ある処理だから?
じゃあ名前が悪いよね。
誰が「Mainクラス」と聞いて
その中にある処理を想像できるんだ?w

12:デフォルトの名無しさん
20/07/05 21:13:00.77 MQ9nuMmc.net
>>11
えっと、前にも言ったけどpaizaはMainという名前じゃないと動かないんだよ
Mainとわけてクラスを作ることもできるけど面倒だからやらなかっただけ
普通のプログラマならpaizaの制約ぐらい知ってるだろうし説明する必要もないと思ってた
君の無知さを想像できなかった僕のミスだ

13:デフォルトの名無しさん
20/07/05 21:13:24.90 MQ9nuMmc.net
君が無知すぎてごめん

14:デフォルトの名無しさん
20/07/05 21:14:24.05 MQ9nuMmc.net
誠にごめんなさい

15:デフォルトの名無しさん
20/07/05 21:14:43.14 M+BkbwUs.net
>>12
だから分けろって。設計がおかしいだろ。
Mainクラスにメインの処理を入れるな
設計が悪いって言ってるのになんで理解できない?

16:デフォルトの名無しさん
20/07/05 21:15:37.89 M+BkbwUs.net
プライベートをテストしたいっていうのは
本質的に設計が悪いってことが理解できないやつ
もしくは設計なんてしたことがないやつなんだろう

17:デフォルトの名無しさん
20/07/05 21:15:45.13 MQ9nuMmc.net
>>15
てめえでやれやハゲ

18:デフォルトの名無しさん
20/07/05 21:16:23.44 M+BkbwUs.net
>>17
だからやるのが正解だろw

19:デフォルトの名無しさん
20/07/05 21:17:00 MQ9nuMmc.net
>>16
君は簡単なロジックしか組む機会がなかった幸せな人だと思うよ
僕は君が羨ましい、幸せな人生を歩んでいるね

20:デフォルトの名無しさん
20/07/05 21:17:17 MQ9nuMmc.net
>>18
やってない君が不正解だね

21:デフォルトの名無しさん
20/07/05 21:19:16 MQ9nuMmc.net
僕は下痢便コードをこうするべきって修正したよ
paizaで動くようにMainというクラス名に変えたけどね
paizaだからそうなるよねってみんな理解してくれるものと思ってた
paizaを知らない木偶の坊がクラス名に文句つけてきたとき僕は絶望した

22:デフォルトの名無しさん
20/07/05 21:20:28.56 Xwol7cCi.net
まだやってたのかw
>>5みたいな下痢便コードが出てきた時点で
「あっ・・・(察し)」でスレ終了でしょ

23:デフォルトの名無しさん
20/07/05 21:21:29.14 MQ9nuMmc.net
こうするべきだと思うならやれば良いがな
自分でやりもせず他人に文句いうだけの人間は木偶の坊のそしりを免れないよ

24:デフォルトの名無しさん
20/07/05 21:22:53.14 M+BkbwUs.net
Mainに他のクラスの処理を全て同居させる
全部Mainにあるから呼び出せるよね?と
publicメソッドをprivateメソッドに変更
publicメソッドはMainのみ!
と言い
あぁ、プライベートメソッドのテストができない~と嘆く(笑)
アホなのか?自分でテストできないようにクソ設計に変更して
自業自得じゃんw

25:22
20/07/05 21:23:27.95 Xwol7cCi.net
×>>5みたいな下痢便コードが出てきた時点で
>>3みたいな下痢便コードが出てきた時点で
すまん訂正

26:デフォルトの名無しさん
20/07/05 21:25:43 MQ9nuMmc.net
>>24
君はまだMainという名前のレトリックから抜け出せてないように見える
paizaで動かすためにMainという名前にしたってだけだから
実際にはそれなりの名前になるでしょう
privateメソッドは当然クラスと関係あるものになるでしょうということ

Mainという名前に囚われ過ぎておられるように見受けられる
自分だったらこう書くのにって言うのがあるならそれを実践してみるべきかと思われます

27:デフォルトの名無しさん
20/07/05 21:25:44 M+BkbwUs.net
おそらく設計とは何かを知らずに、
ただ動けばいいと思ってるんだろう

テストしやすく設計するのも
設計の一つ

28:デフォルトの名無しさん
20/07/05 21:26:22 MQ9nuMmc.net
>>27
Mainを勘違いしてたアホが何抜かしとんねん

29:デフォルトの名無しさん
20/07/05 21:26:36 M+BkbwUs.net
>>26
だからテストしやすようにjudgeLengthメソッドを含んだ
クラスを作るだけ

30:デフォルトの名無しさん
20/07/05 21:27:04 M+BkbwUs.net
>>28
勘違いしてませんが?
Main関数とロジックを同居させるなの意味がわかりませんか?

31:デフォルトの名無しさん
20/07/05 21:27:05 MQ9nuMmc.net
謙虚になれや
オブジェクト指向とは礼儀作法と心得よ

32:デフォルトの名無しさん
20/07/05 21:27:44 MQ9nuMmc.net
>>30
はいはいもうえーから

33:デフォルトの名無しさん
20/07/05 21:27:45 Xwol7cCi.net
>>27
Mainクラス云々については単に誤解してると思うけど
このスレの登場人物じゃあ多分おまいが一番マシな感性持ってそうやなw

34:デフォルトの名無しさん
20/07/05 21:28:41 MQ9nuMmc.net
>>29
作ってへんやんけ

35:デフォルトの名無しさん
20/07/05 21:28:59 MQ9nuMmc.net
やりもせずに何抜かしとんねん

36:デフォルトの名無しさん
20/07/05 21:29:55 MQ9nuMmc.net
ほんま口だけやな

37:デフォルトの名無しさん
20/07/05 22:31:17.31 cdjjBT1g.net
あら。続いていたのか。

38:デフォルトの名無しさん
20/07/05 22:53:15.98 VS9zJ3bZ.net
このスレの主旨的にはprivateメソッドのテストコードを書きたいんだよね?
書く必要がないって主張は違うよね?

39:デフォルトの名無しさん
20/07/05 23:21:59.16 MQ9nuMmc.net
それはそれでありだと思うよ

40:デフォルトの名無しさん
20/07/05 23:22:46.55 MQ9nuMmc.net
結局のところ何でもあり
僕は単体テストさえやってないからね

41:デフォルトの名無しさん
20/07/05 23:27:01.94 cdjjBT1g.net
スレタイと書いてあることがチグハグで趣旨が解りづらいな。
スレタイに従えば、privateを呼び出したいみたいだが、>>1の発言を見るとprivateの呼び出しは推奨しないように見える。
まぁ、私も推奨しないけど。
という訳で、適当に独り言を語ってみる。
単体テストって、例えば...
Queueという名前のクラスがあって、そのクラスの中に
Enqueue、Dequeue、Peek、Clearメソッドが定義されていたら、それらメソッドを呼び出して、その結果を予想するコード(テストコード)を書いて実行させる方法がオブジェクト指向プログラマーにとって一般的だと思うけど...その際にprivateメソッド(内部実装)をテストコードから呼び出さないといけない理由がわからん。

42:デフォルトの名無しさん
20/07/05 23:28:17.41 LRfXHt7v.net
t-wadaさんがどういう人か調べてみたところ、日本が誇るJavascript使いなんだな。
すると、t-wadaさんの立場ではprivateをテストしないというのは全くもって正しいと思う。
privateでやる事はライブラリを呼び出すだけなので、テストするのは無駄。
しかし、他の言語ではアルゴリズムの実装という仕事があり、アルゴリズムの実装をテストしたいという要求は常に存在する。

43:デフォルトの名無しさん
20/07/05 23:48:39 LRfXHt7v.net
例えば多くのパーサーは公開メンバとしてpush()を持つ。
文字をプッシュする関数だ。
めぼしい公開メンバはこの程度しかない。

しかしその裏に100を超える非公開のメンバがあっても驚かない。
非決定性のパーサはその程度のメンバを持つ。

文字をプッシュする公開メンバ一つで、多くの状態、多くのメンバをテストするのは面倒な話で、何方にせよ非公開のメンバ、非公開の状態変数について知識が無ければテストできない。
だったら内部の状態について一切テストしないか、内部の状態を直接テストするか二択となる。

内部の状態についてはブラックボックスとして扱うべきと述べているのがt-wadaさんだが、それでは実装が非常に困難だ。

44:デフォルトの名無しさん
20/07/05 23:55:21 LRfXHt7v.net
パーサーの話ついでに、もう一つアイデアを提供しよう。
決定性パーサーでは、還元が行われたとき、外部に影響を及ぼす。
通常この時点で意味動作を行う。
t-wadaさんは、この時に限りテストを行うべきであり、それ以外でテストを行ってはいけないと述べる。

つまり、シフトが行われるときはテストしてはならない。
今どの状態にあるかは外部にかかわりのない事なのでテストとしてはならない。
入力文字として改行を与えるとどの状態に遷移するかテストしてはならない。

これは厳しすぎやしないだろうか?

45:デフォルトの名無しさん
20/07/06 00:01:34 NTI0gQuc.net
詳細を知ってはならないということは、どの状態を経てその記号が生み出されたのか知ってはならないということであり、これは非常につらい。

46:デフォルトの名無しさん
20/07/06 00:03:58 NTI0gQuc.net
システム利用者がシステム作者に「詳細を検査しちゃだめじゃないか!」と怒っているように見える。

47:デフォルトの名無しさん
20/07/06 00:24:27.58 bo8iccWD.net
>>42
t-wadaはもともとJavaな人

48:デフォルトの名無しさん
20/07/06 00:27:13 NTI0gQuc.net
クリスマスプレゼントが何かを知るために箱を振って音を聞くよりも、箱を開けて直接見るほうが早い。

49:デフォルトの名無しさん
20/07/06 00:29:02 NTI0gQuc.net
箱を振って「プレゼントはプリキュア」と観測できたとする。
これは果たしてどの程度もっともらしいだろうか?

50:デフォルトの名無しさん
20/07/06 01:18:51 gvRhXNla.net
privateなメソッドの動きが仕様書で定義されてたらテストしなくちゃいけないし書いてなかったら書く必要無い
そしてprivateなメソッドの仕様まで定めた仕様書は俺は見たことない

51:デフォルトの名無しさん
20/07/06 02:20:25 T074ZQpk.net
>>47
うるせーばか。文句を言うために都合の良いデータを調べてきたに決まってるだろ

52:デフォルトの名無しさん
20/07/06 07:14:05.86 EsDpeV3E.net
一気に胡散臭くなったな

53:デフォルトの名無しさん
20/07/06 07:37:12.27 ODctk1XU.net
>>50
仕様書には普通アクセス修飾子を何にするかなんて書かないからね
設計書にもそんな細かいこと書かないでしょ

54:デフォルトの名無しさん
20/07/06 07:38:08.27 cDMo9043.net
書いてない関数を勝手に作るなんて禁止に決まってるだろ
テストのためだけに関数は作らない

55:デフォルトの名無しさん
20/07/06 07:59:18.67 ODctk1XU.net
>>54
すごい、そんなガチガチなの銀行系?

56:デフォルトの名無しさん
20/07/06 08:00:23.42 ODctk1XU.net
関数を作るのに許可がいるなんてすごいことだからとてもすごいと思いました

57:デフォルトの名無しさん
20/07/06 09:07:12.86 aZiq8mUC.net
>>1にはテストとしか書かれていないけど、記事元はユニットテスト(単体テスト)の話だよね?

58:デフォルトの名無しさん
20/07/06 10:09:49.30 Smcv6rvz.net
組み込みでの話らしいよここw

59:デフォルトの名無しさん
20/07/06 10:19:56.49 cDMo9043.net
>>57
ユニットテスト以外でメソッドのテストなんかするのか?

60:デフォルトの名無しさん
20/07/06 12:11:06.79 O9yimTr2.net
>>3
このコード出すやつが混じってるんだろ?
議論無駄やん

61:デフォルトの名無しさん
20/07/06 12:27:52.10 aZiq8mUC.net
>>59
自分であたかも他のテストがあるように言っておいて変な話だがだが、しないね。
単体テストで不具合を見つけた後、デバッガを使って更にどこにバグの原因が潜んでいるのか分析することはあるけど、それはもはやテストではなくデバッグだしね。

62:デフォルトの名無しさん
20/07/06 12:34:18.82 aZiq8mUC.net
てかさ、タイトルがカプセル化なのに、なんで>>3>>5もテストコード実行場所とテストコード実行場所が同じ階層に記述されているのさ。

63:デフォルトの名無しさん
20/07/06 12:35:06.14 aZiq8mUC.net
ミス。テストコード実行場所とテスト対象が同じ階層に書かれているのはなんで?だ。

64:デフォルトの名無しさん
20/07/06 14:43:00.46 NTI0gQuc.net
和田理論は穴が多くてお話にならないな。

65:デフォルトの名無しさん
20/07/06 14:44:50.89 40IRbGG5.net
では穴のない理論をおなしゃす

66:デフォルトの名無しさん
20/07/06 14:51:45.46 NTI0gQuc.net
和田理論に騙された人は抗議したほうが良い。

67:デフォルトの名無しさん
20/07/06 14:54:43.27 EsDpeV3E.net
wadaは忘れろ
privateだからテストしなくていいなどという都合のいい法則は存在しない だがprivateだからとテストをしないキチガイは確実に存在するのだ

68:デフォルトの名無しさん
20/07/06 15:05:56.82 NTI0gQuc.net
和田理論被害者の会ひつよう。
とてもひつよう。

69:デフォルトの名無しさん
20/07/06 15:07:12.95 bo8iccWD.net
一意見を急に”理論”とか”法則”とか言う方が頭どうかしてるよ
t-wadaはTDDをわかりやすく解説することに定評があるだけ
ただいろんな会社からテストのコンサルティングで雇われる程度には有能だから
君たちの意見よりは一般には受け入れられやすい

70:デフォルトの名無しさん
20/07/06 15:10:07.70 NTI0gQuc.net
和田理論被害者の会ニューヨーク支部もひつよう。
とてもひつよう。

71:デフォルトの名無しさん
20/07/06 15:12:35 Smcv6rvz.net
このスレ、脱線が好きだなw

72:デフォルトの名無しさん
20/07/06 15:14:01 NTI0gQuc.net
前スレで王家秘伝のレシピ教えたのに。
誰も活用しないんだな。

73:デフォルトの名無しさん
20/07/06 15:17:52.38 NTI0gQuc.net
俺も活用していないわそういえば。

74:デフォルトの名無しさん
20/07/06 15:18:30.87 9+hHOd2F.net
>>61
> 単体テストで不具合を見つけた後、デバッガを使って更にどこにバグの原因が潜んでいるのか分析することはあるけど、それはもはやテストではなくデバッグだしね。
単体テストで不具合を見つけた後にするもの=デバッグ
デバッグの前にする不具合を見るけるもの=テスト
だろ?
テストの後にするデバッグは、テストではなくデバッグだしねって
あんた何言ってるの?

75:デフォルトの名無しさん
20/07/06 16:05:37.75 n2uckING.net
オブジェクト指向の話をしよう
彡ミ
↓↓↓
彡 ⌒ ミ
(´・ω・`) 頭皮、毛髪に触れるものは全て検査する

76:デフォルトの名無しさん
20/07/06 17:22:23 aZiq8mUC.net
>>74
そんな細かいこと気にすんなよ。揚げ足取りめ。
よく単体テストは不具合を見つけるためにやると言われるが、別視点の考え方もあるって話だ。

ここでは些細な話だったな。

77:デフォルトの名無しさん
20/07/06 17:32:36 zkbL7M3i.net
>>74
> テストの後にするデバッグは、テストではなくデバッグだしねって
> あんた何言ってるの?

テストの後にするデバッグはデバッグでしかないと思いますけど、どこに突っ込みを入れたいのですか?

78:デフォルトの名無しさん
20/07/06 18:58:02.99 9+hHOd2F.net
>>77
↓ここにツッコミを入れたい
> それはもはやテストではなくデバッグだしね。

79:デフォルトの名無しさん
20/07/06 20:17:44.91 pO1U5uVJ.net
>>60
そうそれ
あれ書く奴とは1byteたりとも意見交換したくないわ

80:デフォルトの名無しさん
20/07/06 22:24:42.23 djm9krVS.net
まだプログラミング教室やってんのかw

81:デフォルトの名無しさん
20/07/07 11:04:13.93 hnvy2tUT.net
>>78
(テストとデバッグは違う作業だと思うのだが)

82:デフォルトの名無しさん
20/07/07 11:33:22.19 hnvy2tUT.net
もしかすると、バグの原因を調査する作業はテストに含まれるかどうかって話かな?

83:デフォルトの名無しさん
20/07/07 11:34:20.85 zTLocdwC.net
和田メソッド被害者の会に入れてほしいです。

84:デフォルトの名無しさん
20/07/07 11:40:38.80 YBf2Aagc.net
>>81
当たり前だろ?
テストではなくデバッグだしねっていうのが意味わからんって言ってる
テストはテストだろ

85:デフォルトの名無しさん
20/07/07 12:01:27.16 hnvy2tUT.net
突っ込みどころねーじゃんw
それなのに喧嘩腰で突っ込んで周囲に突っ込まれただけか。

86:デフォルトの名無しさん
20/07/07 12:04:20.99 bdixmHft.net
privateメソッドのチェックもできない奴は出荷すんぞ

87:デフォルトの名無しさん
20/07/07 12:25:55 NlNPNtxk.net
privateのチェックって具体的にどうやるの?
Queueというクラスをテストするケースを例に教えて。

88:デフォルトの名無しさん
20/07/07 12:31:21 jam8vymb.net
queue = Queue()
queue.push(17)
asserEqual( queue.length, 1)
a = queue.pop()
assertEqual( a, 17)
assertEqual( quele.length, 0)

だいたいこんなもんだろ。

89:デフォルトの名無しさん
20/07/07 12:37:00.92 NlNPNtxk.net
>>88
おお、俺もそんなのイメージしてた。
そんなコードでpublic経由でprivateを呼び、ついでにカバレッジテストとか済ませる感じかな。
...だったらいいのだが、なーんか、このスレの人達の言動を見ていると怪しいんだよな。
88は別に問題ないけど。

90:デフォルトの名無しさん
20/07/07 12:56:17.65 NlNPNtxk.net
カバレッジテストをするかどうかは、ケースバイケース。どちらでもいいとして、一番気にしているのは、そもそも>>1の記事主に批判的な人はオブジェクト指向を理解しているのか?という点。
怪しいというのは、そこね。

91:デフォルトの名無しさん
20/07/07 13:10:52.54 YBf2Aagc.net
>>85
デバッグはテストじゃなくてデバッグだしねと言われても当たり前としか言えないし、
デバッグの前にやるテストはテストだしねで終わりだろ?

92:デフォルトの名無しさん
20/07/07 13:14:04.43 zTLocdwC.net
>>91
言いたいことは何となく理解できる。
「私以外はみんな馬鹿」
ってことだろ?
つまりキミの主な言語はJava。

93:デフォルトの名無しさん
20/07/07 13:19:42.71 zTLocdwC.net
どうやら図星だったようですね。
Javaではありがちなんですよ。

94:デフォルトの名無しさん
20/07/07 13:28:08.57 RJk/Rw+W.net
>>91
とまぁ、>>92みたいな低能が蔓延るスレで世間の常識は通用しないってことが証明されちゃったわけだ。
立ち去るがいい。

95:デフォルトの名無しさん
20/07/07 13:34:52 YBf2Aagc.net
>>92
何がいいたいの(笑)
俺を馬鹿にしたいのかな?でも文章がそうなってないな。

96:デフォルトの名無しさん
20/07/07 14:34:40 zTLocdwC.net
>>95
Java!Java!

97:デフォルトの名無しさん
20/07/07 14:48:31.09 zTLocdwC.net
>>95
馬鹿にしてない。
馬鹿に付ける薬はない。

98:デフォルトの名無しさん
20/07/07 14:56:56 zTLocdwC.net
オブジェクト指向はダメなんじゃないか?というのが前スレの趣旨で、非公開のメンバは何のためにあるの?テストどうするの?という話になった。

それに対する回答が「非公開のメンバはブラックボックスとして扱いテストしてはならない」という和田メソッドが示された。

それに対して「入力に使われる一つのメンバしかもたないパーサ」という実例を挙げ、「文字列を入力され構文木を返すような状態機械のテストが非常に困難」という話が出た。
この場合、内部を観測できないのであれば、すべての入力の組み合わせ(受理できない入力もテストするなら、それは無限である)に対して、すべての取りうる構文木のセットを検査しなければならない。
つまりそれは太陽系よりもはるかに広く、銀河の向こうまでテストするということである。

それに対して「オブジェクト指向を知らない」などと抜けたことを言うので、「Java!」という結論が出された。

99:デフォルトの名無しさん
20/07/07 15:04:16 YBf2Aagc.net
> それに対する回答が「非公開のメンバはブラックボックスとして扱いテストしてはならない」という和田メソッドが示された。

正確には

・パブリックメソッド経由でテストする
・別クラスのパブリックメソッドとする
・テスト対象の可視性を(やや)上げる
・プライベートのまま、リフレクションでアクセスしてテストを書く

まとめ
繰り返すと、プライベートなメソッドや関数をテストする必要は無いと考えています。
プライベートなメソッドは、実装の詳細であるからです。

100:デフォルトの名無しさん
20/07/07 15:05:58 O+C/kGAG.net
実装の詳細ならむしろテストが必要だと思うのだけど
なんで詳細だからテストしなくて良いのだろう
t_wada被害者の会に僕も入会させてください

101:デフォルトの名無しさん
20/07/07 15:07:05 zTLocdwC.net
>>99
公開メンバは文字を入力するpush()のみと示されてるだろ。
複数の文字を入力して構文木を得る、ごくありふれた状態機械の話だよ。

公開メンバは一つしかない。

ほらテストしてみろ。

102:デフォルトの名無しさん
20/07/07 15:07:48 YBf2Aagc.net
>>98
> それに対して「入力に使われる一つのメンバしかもたないパーサ」という実例を挙げ、「文字列を入力され構文木を返すような状態機械のテストが非常に困難」という話が出た。
> この場合、内部を観測できないのであれば、すべての入力の組み合わせ(受理できない入力もテストするなら、それは無限である)に対して、すべての取りうる構文木のセットを検査しなければならない。

それはパブリックメソッドでも同じこと
内部を観測して、すべての入力の組み合わせをテストしないといけないから

103:デフォルトの名無しさん
20/07/07 15:08:26 YBf2Aagc.net
>>101
> ほらテストしてみろ。

テストしてもいいが、先にパブリックメソッドの場合の例を書いてくれ
それと同じことをやればいいだけなんだが

104:デフォルトの名無しさん
20/07/07 15:10:39 O+C/kGAG.net
単体テストっていう言い方がまずいのかも
インターフェーステストとインプリメンテーションテストに分けるのが良い気がします

105:デフォルトの名無しさん
20/07/07 15:11:55 zTLocdwC.net
言い張るんだったら、ほんとに和田メソッド被害者の会作っちゃうよ?
会員200万人目指しちゃうよ?
いいの?

106:デフォルトの名無しさん
20/07/07 15:12:43 YBf2Aagc.net
>>105
先にパブリックメソッドの場合に
どうするかを答えてくれないか?

107:デフォルトの名無しさん
20/07/07 15:12:43 zTLocdwC.net
>>105
言いたいことわかってくれるあなたは、PythonとかC#とかC++ですね?

108:デフォルトの名無しさん
20/07/07 15:13:07.34 YBf2Aagc.net
自作自演w
105 名前:デフォルトの名無しさん[] 投稿日:2020/07/07(火) 15:11:55.03 ID:zTLocdwC [8/9]
言い張るんだったら、ほんとに和田メソッド被害者の会作っちゃうよ?
会員200万人目指しちゃうよ?
いいの?

107 名前:デフォルトの名無しさん[] 投稿日:2020/07/07(火) 15:12:43.34 ID:zTLocdwC [9/9]
>>105
言いたいことわかってくれるあなたは、PythonとかC#とかC++ですね?

109:デフォルトの名無しさん
20/07/07 15:13:54.75 O+C/kGAG.net
王家の秘伝メソッド普及委員会を立ち上げよう

110:デフォルトの名無しさん
20/07/07 15:14:08.44 zTLocdwC.net
>>108
>>104 に言いたかっただけだろ。
そのくらいわかれ。

111:デフォルトの名無しさん
20/07/07 15:15:25.23 YBf2Aagc.net
>>110
そんなどうでもいいものばっかりにレスしてないで、
先にパブリックメソッドの場合に
どうするかを答えてくれないか?

112:デフォルトの名無しさん
20/07/07 15:15:52.28 zTLocdwC.net
Javaは色々研究して提唱してえらいなあと思う部分もあるんだけど、すぐに宗教化してしまうからな。
そこがJava!なんだよな。

113:デフォルトの名無しさん
20/07/07 15:17:07.58 YBf2Aagc.net
どうも都合が悪かったようだな
俺のレスに答えられずひたすら関係ない話を始めた

114:デフォルトの名無しさん
20/07/07 15:18:08.09 pnFsfYkB.net
>>108
この自作自演は恥ずかしいなww

115:デフォルトの名無しさん
20/07/07 15:20:13.83 zTLocdwC.net
でも俺が設立するからには、普通じゃダメなんだよ。
俺がやるからには、和田メソッド被害者の会長が和田さん。
ここまでやってこそ本物だと思うんだよね。
まず、和田さんを説き伏せなきゃ。

116:デフォルトの名無しさん
20/07/07 15:21:24.14 YBf2Aagc.net
いいだしっぺが説き伏せるそうです。
実際に行動を起こせるか見てみましょう

117:デフォルトの名無しさん
20/07/07 15:22:05.58 zTLocdwC.net
和田さん頼むわ。
見てるんやろ?

118:デフォルトの名無しさん
20/07/07 15:22:43.01 YBf2Aagc.net
いきなり他人だよりです(笑)
自分から知らせに行く勇気もないようですね

119:デフォルトの名無しさん
20/07/07 15:24:58.29 zTLocdwC.net
>>104 をベースに考察していけば良いのでは。

120:デフォルトの名無しさん
20/07/07 15:26:46 YBf2Aagc.net
ではまずいいだしっぺから
なぜパブリックメソッドにすると
すべての入力の組み合わせをテストしなくてよくなるのか?
C1カバレッジって言葉知ってますかね?

121:デフォルトの名無しさん
20/07/07 15:27:35 YBf2Aagc.net
訂正、すべての入力の組み合わせは2カバレッジだった

122:デフォルトの名無しさん
20/07/07 15:27:50 YBf2Aagc.net
C2カバレッジだった

123:デフォルトの名無しさん
20/07/07 15:39:26.39 K/dtFkkl.net
>>87
一般的にはQueueはprivateのメソッドも単純なロジックしか持たないから
public経由のテストで十分な場合が多いかもしれないけど
それがあらゆる状況に当てはまるわけではない
例えばgrowableなring bufferでqueueを実装するとして
バッファを拡大させるロジックに独自の最適化をいろいろと施してるような場合、
各種分岐に応じたメモリコピーの方法だったり、それに応じたメモリの初期化状態の確認だったり
privateなhead/tailポインタへのアクセスだったり、
public経由だけでは確認できないテストをしたほうがいい場合がある

124:デフォルトの名無しさん
20/07/07 15:42:28.40 YBf2Aagc.net
>>123
訂正
一般的にはQueueはprivateのメソッドも単純なロジックしか持たないから
public経由のテストで十分な場合が多いかもしれないけど
それがあらゆる状況に当てはまるわけではない
もしpublic経由のテストで不十分な場合、それはメソッドの責務が大きいと考えられる
リファクタリングして複数のクラスに分離するのが正しい対応
そうすれば自然publicメソッドとなりテストが可能になる

125:デフォルトの名無しさん
20/07/07 15:53:43 zTLocdwC.net
キミも和田メソッドの被害者なんだよ。
可哀そうに。
和田さん本人だとしても、被害者であることに変わりはないんだよ。

126:デフォルトの名無しさん
20/07/07 15:59:04 pnFsfYkB.net
あれ、説き伏せるんじゃないの?

127:デフォルトの名無しさん
20/07/07 16:00:23 zTLocdwC.net
もう和田さんは改心してこっちの味方だから。

128:デフォルトの名無しさん
20/07/07 16:09:18 bdixmHft.net
ごちゃごちゃうるさい
privateメソッドのテストやれよ
キチガイ

129:デフォルトの名無しさん
20/07/07 16:11:54 cp13iBTj.net
虚言癖まであるのかな

130:デフォルトの名無しさん
20/07/07 16:15:15 zTLocdwC.net
和田メソッド被害者の会、会員募集中。
和田さんも入会して良いんだヨ。

131:デフォルトの名無しさん
20/07/07 17:39:48 O+C/kGAG.net
>>123
君は信頼できる
実装をよくわかってる人だ

132:デフォルトの名無しさん
20/07/07 17:43:14 jam8vymb.net
可視性狂信者ってのはどうしようもないね。テストさえ犠牲にし始める。

133:94
20/07/07 17:55:40.01 k9dX6gDH.net
>>95
今さらだけど、前スレのタイトル(今より酷い)から察せると思うが、あなたの想像を越えるお馬鹿さんがいるから、常識を持つあなたはここから逃げた方がいいよと、お前どっちの味方だよ風に言いたかった。

134:デフォルトの名無しさん
20/07/07 18:13:36 k9dX6gDH.net
って、何でもないです。
(アンカが自分に向いていたと勘違いしてたとか言えねぇ)

135:デフォルトの名無しさん
20/07/07 18:55:11.35 B0OaeN7n.net
>>130
むしろ、こんな気違いに絡まれる和田さんカワイソ

136:デフォルトの名無しさん
20/07/07 19:10:49 BPFgnJg7.net
結局実際に絡む度胸もないから無害やけどなw

137:デフォルトの名無しさん
20/07/07 19:21:49.86 zm6NAQZG.net
>>128
君の言うテストって何?
しかも、君は>>87の質問に答えてないよね?
具体例示してよ。

138:デフォルトの名無しさん
20/07/07 19:26:55.85 bdixmHft.net
>>137
は?いいからprivateメソッドのテストやれよ

139:デフォルトの名無しさん
20/07/07 19:27:35.46 zm6NAQZG.net
オブジェクト指向を理解している人間の言うprivateをテストせよ/テストするべきではない と、 オブジェクト指向を理解していない人間のprivateをテストせよ/テストするべきでない は論争のレベルが全然違う。
大学生同士の論争と小学生同士の喧嘩くらい違う。
お前はどっちだ?>>138

140:デフォルトの名無しさん
20/07/07 19:28:44.77 bdixmHft.net
>>139
ごちゃごちゃうるさい
privateメソッドのテストをやれ

141:デフォルトの名無しさん
20/07/07 19:32:38.84 bdixmHft.net
ここで話を整理するけど
privateメソッドだからテストしないとか言ってるやつはキチガイ
早く死んでね

142:デフォルトの名無しさん
20/07/07 19:33:11.12 zm6NAQZG.net
具体例もなく、privateのテストやれと言われてもできねーよ、バーカ。

143:デフォルトの名無しさん
20/07/07 19:35:50.42 bdixmHft.net
うんうん
わかってない人もいるみたいだからもう一度ここで仕切り直しさせてほしい

privateメソッドだからテストしないとか言ってるやつはキチガイ
早く死んでね

わかったかな?

144:デフォルトの名無しさん
20/07/07 19:36:30.14 OvditBd9.net
ほら、>>143は巣に帰りなさい。
【隔離】オブジェクト指向アンチスレ
スレリンク(tech板)

145:デフォルトの名無しさん
20/07/07 19:37:40.45 rZMsiuSb.net
頭皮に触れるものは全て検査する
彡ミ
↓↓↓
彡 ⌒ ミ
(´・ω・`) 使ってるシャンプー、肌に合ってるかい?

146:デフォルトの名無しさん
20/07/07 19:44:10.79 rZMsiuSb.net
[ケハエール]

彡 ⌒ ミ
(´・ω・`) 確認もせず使うのは馬鹿だ

147:デフォルトの名無しさん
20/07/07 22:01:24.32 YBf2Aagc.net
>>143
> privateメソッドだからテストしないとか言ってるやつはキチガイ
だれそれ?
privateメソッドはpublicメソッド経由でテストすると
言ってる人しかいないけど?

148:デフォルトの名無しさん
20/07/07 22:08:08.37 O+C/kGAG.net
>>3の下痢便コード書いた人ですよね?

149:デフォルトの名無しさん
20/07/07 22:11:43.28 bdixmHft.net
>>147
それテストできてねーからw
publicから t=0のときだけprivateの処理が欲しかったとするじゃん?
そのままじゃpublicは仕様でt=0のときしかそのprivateメソッドを呼ばないんだから
そのpublicからしかテストしないんじゃt≠0のときのテストできねーじゃん
やんねーのかよ?
ある時改修で別のpublicメソッドからt=3のときにprivateメソッドを呼ぶことになったらt=0しかテストやってなかったら
普通は怒り狂うもんだよ
っていうか絶対ブッ殺す

150:デフォルトの名無しさん
20/07/07 22:27:58.06 YBf2Aagc.net
>>149
> そのままじゃpublicは仕様でt=0のときしかそのprivateメソッドを呼ばないんだから
つまり、publicがt=0のときprivateメソッドを呼ぶんですよね?
publicがt=0のテストをすれば、privateのテストしてるじゃないですかw

151:デフォルトの名無しさん
20/07/07 22:30:06.58 YBf2Aagc.net
> ある時改修で別のpublicメソッドからt=3のときにprivateメソッドを呼ぶことになったら
> t=0しかテストやってなかったら
仕様が変わったのならt=3のときのテストを追加しましょう

152:デフォルトの名無しさん
20/07/07 22:34:14.99 YBf2Aagc.net
>>149はホント意味不明だな
最初の仕様・・・t=0のときしかprivateメソッドの処理をしない
t=3のときは?→「privateメソッドの処理をしない」場合の結果が正しい
改修・・・t=3のときにprivateメソッドの処理をすることになった
「privateメソッドの処理をした」場合の結果が以前と異なるという仕様になった
では新しい仕様のテストを書きましょう
これだけなんだがなぁ
前と正しい答えが違うのに、テストを修正しないの?

153:デフォルトの名無しさん
20/07/07 22:49:42.87 bdixmHft.net
>>151
おかしくない?
privateメソッドの仕様は変わってないよ
お前はガラクタをこさえたから説明のできない行動を取らなければならない

154:デフォルトの名無しさん
20/07/07 22:52:36.96 bdixmHft.net
設計書かコメントに
このメソッドはt=0のときしかテストしていません!
って書いてあるの?
お前のソースって
悪いけど見たことねーや
滅茶苦茶バカだしもういいかな?
レスしなくて

155:デフォルトの名無しさん
20/07/07 22:54:46.63 YBf2Aagc.net
>>153
だから変わったpublicメソッドをテストしろよ
変わってないならprivateメソッドに何の問題もないだろ
それとも何か?お前すべての取りうる値でテストしろと言ってんのか?

この関数は数値を二倍してくれる関数である。
今まで4を入れてこの関数を呼び出していた。
今度5を入れるようになったから5を入れた場合はどうなるかテストする必要がある
今度は6を、7を、8を・・・って新しい引数で呼び出すために
そのテストが必要なんか?ああん?

156:デフォルトの名無しさん
20/07/07 22:56:07.20 YBf2Aagc.net
>>154
> このメソッドはt=0のときしかテストしていません!
お前は t=全ての整数 でテストしろっていってるってことでいい?

157:デフォルトの名無しさん
20/07/07 23:00:58.28 bdixmHft.net
は?最小-1、最小、中間、最大、最大+1通すだろフツー

158:デフォルトの名無しさん
20/07/07 23:02:33.64 bdixmHft.net
だが、お前のやり方ではどうやっても通すことはできないんだよ
こんな簡単なテストすら不可能
早く死ねよ
これがお前の限界なんだよ

159:デフォルトの名無しさん
20/07/07 23:06:04.37 bdixmHft.net
っていうかここまで自分の間違いを認めない意味はなんかあるの?
これぜってー仕事でお前の主張が通る現場ねーぞガチで
メソッドにt=0のときしかテストしてませんって書いてあるもの納品するか?
ナメてんじゃねーよ

160:デフォルトの名無しさん
20/07/07 23:36:58.56 YBf2Aagc.net
>>157
> は?最小-1、最小、中間、最大、最大+1通すだろフツー
・t=3のどこが、最小-1、最小、中間、最大、最大+1なんだよw
「今回」新しく仕様が変わって、t=3 などというものが登場したんだろ
なら「今回」テストを追加するだけの話だろ
それとも何か? t=3がいままでprivateを呼ばなかったのに
t=3のテストをお前はするんか?どういった理由で?

161:デフォルトの名無しさん
20/07/07 23:47:24.20 zm6NAQZG.net
>>159
> っていうかここまで自分の間違いを認めない意味はなんかあるの?
お前のことだろ。
> これぜってー仕事でお前の主張が通る現場ねーぞガチで
お前のことだろ。

162:デフォルトの名無しさん
20/07/07 23:56:35.16 D1qF8R0D.net
bdixmHftはQueueという言葉とオブジェクト指向という言葉が理解できずに発狂した説

163:デフォルトの名無しさん
20/07/08 00:21:47.63 SznGehK7.net
詳細に関する知識が無ければ検査できないなら、公開メンバを介して検査するのと、非公開メンバを直接検査するのは同じことですよ。
これが理解できないなら、もはや議論の意味が無いでしょう。
そもそも自身が推奨する和田メソッドさえ理解できていないって事ですから。

164:デフォルトの名無しさん
20/07/08 00:28:23.66 SznGehK7.net
アンクルボブの理論に対する賛否両論から議論を始めるべきなのかもしれない。

165:デフォルトの名無しさん
20/07/08 00:29:51.46 kqVG+rMe.net
>>149
そもそも、public経由のテストで網羅できないレベルのprivateメソッドなんてクラス内部に定義するなゴミ。
別クラスに分けろ。

166:デフォルトの名無しさん
20/07/08 00:35:35.13 SznGehK7.net
和田さんはアンクルボブを理論のベースにしています。
和田理論否定派はアンクルボブ理論を理解したうえで和田理論に異議を述べています。
和田理論信仰者は、そもそもアンクルボブって何?状態です。
だから議論が成り立っていないのです。

167:デフォルトの名無しさん
20/07/08 00:42:30.98 UPP9MPHB.net
(和田メソッドって何だ?)

168:デフォルトの名無しさん
20/07/08 00:52:01.29 SznGehK7.net
詳細に関する知識を持ってはならないというのが和田理論の根幹です。
private、publicという字面にこだわるのは単なる信仰心にすぎません。
神を信じますか?ハイ信じます。
神を見ましたか?ハイ見ました。
こういうことです。

169:デフォルトの名無しさん
20/07/08 00:56:34.00 SznGehK7.net
和田理論を素直に受け入れられるのは、プログラミングとはAPIを呼び出すことであり、決してアルゴリズムを実装することではないからですよ。
つまり、システム利用者がシステム作者に対して小言を言うような状態です。
詳細を検査したら駄目じゃないか!詳細は呼び出せればいいんだよ!

170:デフォルトの名無しさん
20/07/08 01:27:45 /rdq0ZOx.net
>>167
「アンチ和田」がかってに命名したもの(笑)

171:デフォルトの名無しさん
20/07/08 01:28:51 /rdq0ZOx.net
「和田理論」も同じな。「アンチ和田」はなにか理由があって
命名しているんだろう。常識的なことを名前をつけることで
特別な方法だと錯覚させる手かな?

172:デフォルトの名無しさん
20/07/08 04:10:02 6ZEX1zcL.net
>>166
ロバート・C ・マーチンのこと?

173:デフォルトの名無しさん
20/07/08 04:11:04 6ZEX1zcL.net
>>169
なるほどな

174:デフォルトの名無しさん
20/07/08 06:13:27.58 AplvQTCJ.net
>>172
違います。
>>173
わかってない人になるほどと言われても困ります。

175:デフォルトの名無しさん
20/07/08 08:26:03 6ZEX1zcL.net
>>174
違いません、困りません

176:デフォルトの名無しさん
20/07/08 08:29:40 6ZEX1zcL.net
アンクルボブをロバートと読み替えても通じますし
僕が納得したところでお前は何も困りません

177:デフォルトの名無しさん
20/07/08 08:35:30.95 6ZEX1zcL.net
>>159
相手は >>3 の下痢便コード書いた人だよ
まともなプログラム書けない人だから相手にするだけ無駄だよ

178:デフォルトの名無しさん
20/07/08 09:02:50 SznGehK7.net
>>172
ハイそうです。

179:デフォルトの名無しさん
20/07/08 12:16:39.34 hmU+YLWt.net
関数が取りうる値で全てでテストしろと言ってるアホがいるスレはここですか?
今回78という値で関数を呼び出すことになった
78という値を与えた時、ちゃんと動くかテストしているかね?
だってさ(笑)

180:デフォルトの名無しさん
20/07/08 12:42:10 PWwZYnOX.net
privateメソッドのテストを具体的にどうやるのか未だに分からん。

そもそも、public経由のメソッド呼び出しで網羅できない巨大privateメソッドの正しい動作なんて定義できるの?

181:デフォルトの名無しさん
20/07/08 12:54:49 ODFOiaSP.net
巨大なメソッド自体が悪じゃね

あとテストってinoutを確認するんじゃないの?
outいっぱいしてたらもうそれ完全害悪じゃね

182:デフォルトの名無しさん
20/07/08 14:27:45.18 ZL+NZ9CQ.net
ステートメントの入力により無限通りの構文木が出力されるパーサ?
なんだそれ?

183:デフォルトの名無しさん
20/07/08 17:57:24.33 pS2ORJtj.net
>>179
最小、最大、中間値ぐらいしか言ってないのにそうやって曲解しないと負けちゃいそうなの?

184:デフォルトの名無しさん
20/07/08 18:33:36.38 IWyzFdDn.net
そもそも、privateメソッドを定義すること事態、滅多にないよ。
というか、自分のソース見たら無かった。

185:デフォルトの名無しさん
20/07/08 18:42:33.47 IWyzFdDn.net
このスレの過去の発言を見ると誤解を招きそうだから補足するけど、別に内部処理をpublicにしたからprivateは無いという意味じゃないからね?
元からpublicメソッドとprivate変数しかない。

186:デフォルトの名無しさん
20/07/08 20:52:09 Sbr5rKl2.net
>>181
巨大なメソッドをprivateメソッドに分割しても、その分割したメソッドを個別にテストできなけりゃ
分割してないのと同じじゃね?

187:デフォルトの名無しさん
20/07/08 20:55:55 hmU+YLWt.net
>>183
↓って書いてますが? 3と78でなにか違いがあるんですか?

> ある時改修で別のpublicメソッドからt=3のときにprivateメソッドを呼ぶことになったら
> t=0しかテストやってなかったら

188:デフォルトの名無しさん
20/07/08 20:59:13 hmU+YLWt.net
>>186
そういうこと。巨大なメソッドがあったらそれを
一つのメソッドと、そこから使われるユーティリティメソッドに分割する
ユーティリティメソッドはできる限り汎用的なインターフェスにする(たとえ一箇所でしか使われていなくても)
ユーティリティメソッドはそれ単体でテストする
そうすれば巨大なメソッドのコード量が減る

189:デフォルトの名無しさん
20/07/08 21:15:04 s5mehW61.net
>>187
そここだわってるのお前だけじゃん
最小、最大、中間値のテストやった?
って聞かれてるときに3でも78でも駄目なのはバカでもわかるだろ?w

190:デフォルトの名無しさん
20/07/08 21:19:38.42 hmU+YLWt.net
>>189
あのさぁ、ごまかしてないでちゃんと書こうよ?
最小、最大、中間値のテストやってれば
最小、最大、中間値ではない3のテストなんて不要なんだよって
ちゃんといわないと、あのバカには伝わらないよ?

191:デフォルトの名無しさん
20/07/08 23:59:05.09 hEQaHqpN.net
最小、最大、中間値って聞いたことがないけど
どこかの分野で一般的に使われてるもの?
境界値分析なら
境界値と境界値の内側と外側の3値か
境界値と境界値の外側の2値かどっちかが一般的だと思う

192:デフォルトの名無しさん
20/07/09 00:14:35.43 qGUjUa51.net
>>191
3と78がそれに当たると申すか?

193:デフォルトの名無しさん
20/07/09 00:16:52.90 tq6y70T3.net
俺もそう思ってたけど、そもそもスレタイともずれてきてるよねっていう

194:デフォルトの名無しさん
20/07/09 00:21:36.93 Ai/0yITE.net
3と78の伏線が
今、回収されたのか?

195:デフォルトの名無しさん
20/07/10 12:24:37 sSLzYC6I.net
詳細を知ってはならないということは、詳細の知識、つまり境界を知ってはならないということ。

「彼らはオブジェクト指向を全く知らない可哀そうな人ではないか?Javaを学ぶべきだ!」などと言う前に、原典に当たろう。

196:デフォルトの名無しさん
20/07/10 12:25:53 A+QDXq04.net
>>195
オブジェクト指向と関係ない話なら、関係ないって書いとけよ

197:デフォルトの名無しさん
20/07/10 12:54:55.71 1UxRpBTq.net
zTLocdwC以外、Javaなんて誰も言ってないけど?何が言いたいんだ?
スレタイはカプセル化って書いてあるしOOPは理解している前提でしょ?
まぁ、明らかにOOPを理解していない人が発狂していたけど。

198:デフォルトの名無しさん
20/07/10 14:04:44.56 sSLzYC6I.net
いや、おそらくわかっていないだろう。

199:デフォルトの名無しさん
20/07/10 14:09:26.25 sSLzYC6I.net
オブジェクト指向のすばらしさを語っている人が、一番オブジェクト指向を知らない。
ゆえに議論が成り立たないという状態ではないだろか。

200:デフォルトの名無しさん
20/07/10 14:12:09.99 sSLzYC6I.net
>>196
隠ぺいとオブジェクト指向は直行する概念ではある。
とはいえ、事実上同時に用いられるので、関係ないとは言えないのではないか。

201:デフォルトの名無しさん
20/07/10 15:02:20.85 zQa5K81u.net
>>200
そもそも、このスレで誰もオブジェクト指向の素晴らしさなんて語っていない。
さっきから誰に対して言ってるんだ...。

202:デフォルトの名無しさん
20/07/10 15:16:19.83 TbXdOMZ+.net
ポエってるやつがいるな

203:デフォルトの名無しさん
20/07/10 16:07:13 sSLzYC6I.net
和田メソッドを称賛してる人たちに決まってるだろ。

204:デフォルトの名無しさん
20/07/10 16:35:36.39 zQa5K81u.net
和田メソッドって何?

205:デフォルトの名無しさん
20/07/10 17:14:49.72 sSLzYC6I.net
>>1 に書いてあるだろ。

206:デフォルトの名無しさん
20/07/10 17:42:15.92 A+QDXq04.net
>>1に書いてあるのはただの常識で
和田メソッドなんて特別な名前じゃないよ

207:デフォルトの名無しさん
20/07/10 20:12:23.39 FovnwiSG.net
常識を疑え、それって和田メソッドじゃないかって

208:デフォルトの名無しさん
20/07/10 20:49:58.98 zQa5K81u.net
常識じゃん。むしろ、常識を疑うその心を疑え。それって経験不足では?
まぁ、強いて言うのなら、リフレクションを用いてテストは、許してはならない反則行為だと思うがな。
特に、カバレッジテストとかする場合は。

209:デフォルトの名無しさん
20/07/10 21:00:54.86 zQa5K81u.net
ただ、記事を書いた和田さん?も、記事を読むとその危険性を理解しているみたいだから対立する気はないよ。
黒魔術と言ってるし。
なんで黒魔術なんでしょうねぇ(すっとぼけ)

210:デフォルトの名無しさん
20/07/10 21:09:49.17 HmvrAlYz.net
そりゃC++への嫉妬だろ
C++はそう呼ばれるのに、Javaは何故かそうは呼ばれない、それは何故か?
Javaに欠けているものとは一体……?!

211:デフォルトの名無しさん
20/07/10 21:30:17.43 LiH0PaR7.net
黒魔術って言われ方を誉め言葉だと思ってる馬鹿ってほんとにいるんだな。。

212:デフォルトの名無しさん
20/07/10 21:36:39.85 pLXOeUja.net
オブジェクトが隠蔽・カプセル化するものだからといってホワイトボックステストまで否定しちゃうのは変な話。

213:デフォルトの名無しさん
20/07/10 21:51:04.37 zQa5K81u.net
ホワイトボックステストを否定する気はないけど...例えば
>>88のコードを借りるけど
> queue = Queue()
> queue.push(17)
> asserEqual( queue.length, 1)
> a = queue.pop()
> assertEqual( a, 17)
> assertEqual( quele.length, 0)
こんなノリでprivateだったメソッドをpublicにしたり、リフレクションを使って呼び出すとする。
queue.内部実装()
...で、これでカバレッジテストに合格しちゃったらどうするの?
Queueというクラスはテストに合格したと見なすの?
テストってテスト項目に合否判定を出す作業だと思うのだが、内部実装の呼び出しで合否判定を変えるなんてチートは駄目だと思う。
そもそも、privateメソッドを定義するケース自体、珍しいから、経験則に基づかない発言でもあるが...。

214:デフォルトの名無しさん
20/07/10 21:56:59.04 FovnwiSG.net
和田メソッドは非常識

215:デフォルトの名無しさん
20/07/10 22:02:19 FovnwiSG.net
和田さんはQueueを実装したことない素人

216:デフォルトの名無しさん
20/07/10 22:04:28 zQa5K81u.net
あー...うん、俺の言い方が悪かったかも。
privateメソッドをテストするというレアケースだから許してくれ。
常識が無い以上、もっと正確に細かく伝えるべきだったな。

ただ、俺の主張(リフレクションは反則
行為)の弱い点を言うと、OOPやDDDの概念を無視した設計には、こちらの主張は当てはまらない。
そう思うと、和田さんのリフレクションをギリギリ許容(?)するような記事の書き方も否定はできん。

なんだかんだで、彼の記事は自分が記事を書くよりは無難にまとめられているとは思う。
まぁ、記事を書いたことないけど。

217:デフォルトの名無しさん
20/07/10 22:09:19 pPoV7F8C.net
ユーザーが直接public methodを使うわけじゃなければ
public methodだって実装の詳細

integration test経由で
必要なpublic methodはテストできるんだから
個別にすべてのpublic methodをテストする必要なんてない

というのと似たようなもの
それでいい場合もあればそうじゃない場合もあるというだけ

218:デフォルトの名無しさん
20/07/10 22:23:15 FovnwiSG.net
まあね、処理の複雑さによるのだろうね
hello world程度ならテストさえ必要ないだろうし

219:デフォルトの名無しさん
20/07/10 22:31:36 pLXOeUja.net
>>213
どうするの?っていうそこの何が問題なのかわからん。
必要以上の詳細をテストしてしまうことによってテストが壊れやすくなるという
一般的な話以上のものではないように思うが。

220:デフォルトの名無しさん
20/07/10 22:38:32.51 d7aQvYi7.net
そこで、テスト駆動開発ですよ。
最初にテストケースを定義してそれをパスする
コードを書けばpublicだのprivateだの議論は不要
だれかこの開発方法やってる?

221:デフォルトの名無しさん
20/07/10 22:54:55 FovnwiSG.net
>>220
privateだとテストケース書けないじゃん

222:デフォルトの名無しさん
20/07/10 23:26:01.49 zQa5K81u.net
>>219
不合格になるはずのテストに合格してしまうのが問題なんだよ。
>>220
テスト駆動開発は社内でも聞いたことがあるけど、実践はしてない。
まぁ、自分自身、詳細は知らない。後で調べるか。

223:デフォルトの名無しさん
20/07/11 00:18:29 E2OZ8LYK.net
>>213
> ...で、これでカバレッジテストに合格しちゃったらどうするの?

テストはテストコードを見ないで
OKってでたからOKだ
ってやるもんじゃないよ


テストコードはレビューするものだ
通ったからOKじゃなくて、通るのは当たり前で
テストコードを見て正しくテストされてることを確認する

テスト結果のOKが「エビデンス」なのではなくテストコードが「エビデンス」
動作してることを証明するスクリーンショット(笑)と同じもの
「エビデンス」は見て確認しなければいけない

224:デフォルトの名無しさん
20/07/11 00:21:18 E2OZ8LYK.net
>>221
テストケースがあるもの=publicメソッドで
privateは中で必要に応じて作るもの
メソッドにしてもいいしメソッドにしなくてもいい

テストケース書けないなら関数にせずにそのまま埋め込めよ
publicメソッドのテストケースが問題ないなら
中の詳細なテストなんかいらんだろ
メソッドにしてないかもしれないし

225:デフォルトの名無しさん
20/07/11 00:34:45.26 0BF0aQZE.net
何回繰り返すのこの流れww

226:デフォルトの名無しさん
20/07/11 00:40:55.17 JFnadz6+.net
何度でもだ!

227:デフォルトの名無しさん
20/07/11 00:42:45.65 JFnadz6+.net
>>224
テストケースが書けないってだけでインライン展開するんすか?
構造化プログラミングを愚弄する狼藉っすよ
遠山の金さんの桜吹雪を拝むことになりますよ

228:デフォルトの名無しさん
20/07/11 00:43:07.74 JFnadz6+.net
遠山の和田さん

229:デフォルトの名無しさん
20/07/11 00:45:42.66 JFnadz6+.net
privateではなくてパッケージプライベートにした方がええのかもわからんね

230:デフォルトの名無しさん
20/07/11 00:53:34.50 JFnadz6+.net
それで破綻するならパッケージの設計がよろしくないということで

231:デフォルトの名無しさん
20/07/11 01:01:26.38 E2OZ8LYK.net
>>227
テストケースが書けるならばpublicにすればいいだろ?
テストケースがある=仕様が明確になってる証拠

232:デフォルトの名無しさん
20/07/11 01:06:55.98 E2OZ8LYK.net
なんでテストケースが作れるのに、publicにしないのかわからん

233:デフォルトの名無しさん
20/07/11 01:42:00 H19stfAl.net
URLリンク(encrypted-tbn0.gstatic.com)

234:デフォルトの名無しさん
20/07/11 02:18:29 wIsoNFzM.net
privateでかっこいいメソッドなんだろうがよ!

いや、俺実はpublic staticしか作らんけど

235:デフォルトの名無しさん
20/07/11 02:41:27.63 P8l8Ig/I.net
>>222
正直、開発自体をテスト工藤開発で終えるのはキツいと思うけど、
コーディング→動作確認→デバッグ→リファクタリングの
プログラマー個人の短いサイクルでのトライ&エラーには結構使えるんじゃないかと思う。
カバレッジ100%のテストケースは作る工数とメンテが大変だからそこまでする必要はないと思うけど、
そこそこのカバレッジでプログラマーが個人で高速に開発を回せるのは強い。
カバレッジ100%目指すのは単体テストの時だけで十分

236:デフォルトの名無しさん
20/07/11 02:42:42.87 E2OZ8LYK.net
>>235
せやかて

237:デフォルトの名無しさん
20/07/11 06:05:52 KCR4lRFo.net
t-wada氏の推奨する和田メソッド。

238:デフォルトの名無しさん
20/07/11 06:15:18 KCR4lRFo.net
和田メソッドによると「非公開メンバをテストすると品質が下がるので絶対するな!」

239:デフォルトの名無しさん
20/07/11 07:08:50.24 DdDKJrYh.net
>>238
それどこに書いてあるの?

240:デフォルトの名無しさん
20/07/11 07:51:10.03 KCR4lRFo.net
意識が高くなりすぎて幽体離脱した感のある和田メソッドをよろしく!

241:デフォルトの名無しさん
20/07/11 07:55:47.65 Cl4N6Aux.net
>>22
いや、その「不合格になるはず」のところがわからん。
呼べないはずの内部実装が呼べちゃったってこと?

242:デフォルトの名無しさん
20/07/11 09:06:32.32 JaL6gziv.net
>>241
合否判定が変わる例ってこんな感じじゃない?
不当に不合格になる例
queue = Queue()
queue.push(17)
asserEqual( queue.length, 1)
a = queue.pop()
queue.内部実装()
assertEqual( a, 17) ←不合格
assertEqual( quele.length, 0)
※ユーザーが呼べるメソッドを呼んだら、なんか破綻したケース
あるいは網羅テストをやってて、不当に合格する例
for(i = 0 ; i<127;i++){
queue.内部実装(i)
}
内部処理{
switch(条件)
以下略
}
条件分岐を全て網羅したから合格。
はおかしい。
queue.pushやpopの呼び出しで合格できなかった網羅テストを内部実装を直接呼び出して合格って変な話。
という意味では?

243:デフォルトの名無しさん
20/07/11 09:23:48.86 wIsoNFzM.net
>>242
でもカバレッジって落ちないぜ以上の意味を取るのって無理じゃね?

244:デフォルトの名無しさん
20/07/11 09:26:28.69 Cl4N6Aux.net
>>242
いや、ますますわからん。
そのタイミングで内部実装()呼んでもaの値は変わらんと思うが?
pop()の前に呼ぶんだとしたらなんでそんなテストを書くんだという話になるし。
異なる操作をしたならassert条件が変わるのは当たり前。

245:デフォルトの名無しさん
20/07/11 09:35:57 JaL6gziv.net
>>244
前者は私のミス

>>243
ごめん、カバレッジやったことないから間違っていたら謝る

うーん、この解釈を間違えた感

246:デフォルトの名無しさん
20/07/11 09:55:21 fJlL8BSP.net
>>242
まずテストの考え方が違うんだよ。

全ての組み合わせをテストする完全な網羅テストは時間的に不可能
その他のテストも数によっては現実的に不可能となることが多い
通常カバレッジ100%というのは命令網羅テストにすぎない
だが命令網羅テストをやってれば完璧かと言うかそうではない

じゃあどれをやればいいんだよ!?と思うかもしれないが、どれをやるかじゃない
何をやれば自分が作ったものが正しく動くと自信が持てるかなんだよ
現実的に実現可能であるというルールを加えれば、完璧なテストなんてできやしない。

内部実装を直接呼び出して合格したとしても、
それで正しく動くと自信が持てるなら、それで全然かまわないんだよ。
ただしテストする以上、内部実装の仕様を明確にしなきゃテストのレビューはできなくなる。
内部実装の仕様が明確になったならpublicにして問題ない。

おまけだが、pubicメソッドのテストでもprivateメソッドのテストでも
カバレッジを計測するなら、それはホワイトボックステストだからな
なんか間違ってる人がいるようだから

247:デフォルトの名無しさん
20/07/11 09:55:24 0/l6dmQ+.net
結局クラス分けするなりしてpublicにする部分を多くする、
テストと使用する局面で可視性を変える
の二つしかないわけで、プログラム機能でどうこうする話じゃない。
使う奴が理解して使うという話以上にはならん。

248:デフォルトの名無しさん
20/07/11 10:23:35 Cl4N6Aux.net
「privateメソッドがテストできないんですがどうしたらいいですか?」という疑問に対して、
なんとかしてテストする方法を編み出すのではなく「privateメソッドはテストしなくていい!」という
逆転の発想というかバッサリ感が中二受けしたんだと思う。

249:デフォルトの名無しさん
20/07/11 10:26:24 KzXDm3Nb.net
じゃあ編み出してどうぞ

250:デフォルトの名無しさん
20/07/11 10:36:26 fJlL8BSP.net
>>248
逆転の発想じゃなくて普通の発想じゃね?
privateなんだから

251:デフォルトの名無しさん
20/07/11 10:53:54 Cl4N6Aux.net
だって可視性とテストするしないの関係は自明じゃないじゃん。
それが関係あるなら外部にexportする関数以外はテストしなくていいことになるんじゃね?

252:デフォルトの名無しさん
20/07/11 11:13:39 JFnadz6+.net
>>231
教えてしんぜよう
アクセス修飾子は仕様が明確になってることを表すものではないからだ

253:デフォルトの名無しさん
20/07/11 11:16:43 JFnadz6+.net
publicにしたら全然関係ないパッケージからもアクセスされてしまうからね
不必要な依存を発生させることになってしまう、密結合が促進されるね
そういう意識のない人間が >>3 のような下痢便コードを書いてしまうんだね

254:デフォルトの名無しさん
20/07/11 11:18:39 fJlL8BSP.net
>>252
アクセス修飾子は仕様が明確になってることを表すなんて言ってないよ
仕様が明確になってるならpublicでいいと言ってるだけ

255:デフォルトの名無しさん
20/07/11 11:19:08 fJlL8BSP.net
>>253
> publicにしたら全然関係ないパッケージからもアクセスされてしまうからね

全然関係ないパッケージ = テストコード
アクセスできてなにか問題あるの?

256:デフォルトの名無しさん
20/07/11 11:20:35 JFnadz6+.net
>>254
言ってるじゃん、アクセス修飾子とメソッドの仕様が明確になってるかは無関係

257:デフォルトの名無しさん
20/07/11 11:21:19 JFnadz6+.net
>>255
何いってんのお前
テストは同じパッケージにするのが基本だろ
テストしたこと無いの?

258:デフォルトの名無しさん
20/07/11 11:22:19 JFnadz6+.net
テストから呼び出せるのが問題なんじゃなくて
関係ないパッケージから呼び出されて密結合になるのが問題だと言ってる

259:デフォルトの名無しさん
20/07/11 11:22:42 JFnadz6+.net
だからパッケージプライベートなら良いだろうと言ってるわけ

260:デフォルトの名無しさん
20/07/11 11:25:32 fJlL8BSP.net
>>256
言ってないよ?

外部からアクセスしないならprivate。
でも仕様がはっきりしてるならpublicにしていい。

facebookでもプライベートな話は他人に見せる必要がないからprivateだけど
別に他人に見せてもいいならpublicにしてもいいよね
それと一緒

261:デフォルトの名無しさん
20/07/11 11:26:14 JFnadz6+.net
パッケージプライベートだと同じパッケージからならアクセスして良いというメッセージを
開発者に伝えてしまうから望まない依存を生んでしまうリスクはある
どのオブジェクトからも参照されたくない場合もあるからな、やはりprivateをテストできない
言語が遅れてるだけなのだろうね

262:デフォルトの名無しさん
20/07/11 11:26:21 fJlL8BSP.net
>>257
> テストは同じパッケージにするのが基本だろ

Java以外で、同じパッケージとはなんのことで
そうするとどうなるんですか?

263:デフォルトの名無しさん
20/07/11 11:27:14 JFnadz6+.net
>>260
外部からアクセスしないけれども仕様がはっきりしてるからpublicにするのはありえないってことですよ
なぜならば密結合になってしまうから

264:デフォルトの名無しさん
20/07/11 11:27:56 fJlL8BSP.net
>>261
privateをテストできる言語っていうのは
単に全てpublicになっているのと一緒

アンダースコアで、これはアクセスできるけど
privateという意味ですよと言ってるのと何も変わらないよ

265:デフォルトの名無しさん
20/07/11 11:28:00 JFnadz6+.net
>>262
Javaの話ですよ

266:デフォルトの名無しさん
20/07/11 11:28:48 JFnadz6+.net
>>264
アンダースコア?
そうなの? 全部の言語がそんな仕様なの?
それは知らなかったなー

267:デフォルトの名無しさん
20/07/11 11:29:55 fJlL8BSP.net
>>263
仕様がはっきりしてるからpublicにするんじゃなくて
仕様をはっきりさせれば、publicにしてもよいと言ってるだけ
理由がなければprivateのままでもいい。どちらでもいい。
テストしたい=理由。理由があるならpublicにしていい。

> なぜならば密結合になってしまうから
テストコードから仕様がはっきりしないprivateをテストすること=密結合
密結合を避けるためにも、公開されたインターフェースにするのが正しい

268:デフォルトの名無しさん
20/07/11 11:30:13 JFnadz6+.net
RustやGoはprivateもテストできるよって言ってる人いたから
最近の言語ではprivateもテストできるんだーって思ってたけど
命名規則でアクセス修飾子の代わりを果たしてるんだってことだったの? それは知らなかったなー

269:デフォルトの名無しさん
20/07/11 11:30:22 fJlL8BSP.net
>>265
Java以外を知らないんですか

>>266
Java以外を知らいんですかw

270:デフォルトの名無しさん
20/07/11 11:30:59.34 fJlL8BSP.net
>>268
ああ、人から聞いただけなのねw

271:デフォルトの名無しさん
20/07/11 11:31:27.48 JFnadz6+.net
>>267
仕様がはっきりしててもpublicにしてはいけないからprivateなんだよ
テストが依存することを密結合とは言わないよ

272:デフォルトの名無しさん
20/07/11 11:31:51.16 JFnadz6+.net
>>269
知らないよ
>>270
そうだよ

273:デフォルトの名無しさん
20/07/11 11:32:06.66 fJlL8BSP.net
privateにあくせすできる言語でも
テストするならどちらにしろ仕様をはっきりさせないといけない
そうしないとテストコードがあったからといって
これが正しく仕様を満たしているのか?なんてわからない

274:デフォルトの名無しさん
20/07/11 11:35:07 JFnadz6+.net
さすがです >>3 の下痢便コード書くだけありますね
何言ってるのかさっぱりわからない

275:デフォルトの名無しさん
20/07/11 11:36:54 fJlL8BSP.net
>>3のコードを書いたのは別の人。

そもそも>>3のコードをクソコードと言って
このスレにコピペしたのが俺

276:デフォルトの名無しさん
20/07/11 11:38:14 JFnadz6+.net
>>275
そうすると君はMainを勘違いしてた人か、僕と仲直りしますか?

277:デフォルトの名無しさん
20/07/11 11:39:33 JFnadz6+.net
同じ人が同じこと言ってるだけのスレ
でもそんなスレも良いですよね

278:デフォルトの名無しさん
20/07/11 11:47:13.10 JFnadz6+.net
たとえばこの先Javaが進化したとしてテストオブジェクトのみを特別視して
テストオブジェクトからのみprivateにアクセスできるようになったとすると
テストオブジェクトをオブジェクト指向の枠組みで捉えるならば
オブジェクト指向としては破綻してる
Javaは受け入れないだろうね、Microsoftがdelegateを提案したときも
interfaceという仕組みがあるんだからdelegateは邪道だと言って蹴ったからなあ
実益に叶うという理由で根本的なところまで作り変えることができるのは
Microsoftだろうなあ、Javaの前にC#が対応しそうな予感はある

279:デフォルトの名無しさん
20/07/11 11:52:27.04 JFnadz6+.net
いまの言語仕様での最適解は >>5 ですね
これ書いた人は天才だと思いますよ
何気ないことだけれどもコードの隅々にまで神経が行き届いていて
美しく整備されて堅牢なコードです、オブジェクト指向の限界を示したと言って良いですね

280:デフォルトの名無しさん
20/07/11 11:55:21.12 0/l6dmQ+.net
>>248
逆転の発想じゃなくて都合のいいことを信じたい馬鹿の発想だろ

281:デフォルトの名無しさん
20/07/11 12:00:30.64 Cl4N6Aux.net
テストコードは設計の外にあるものだからクラスの可視性とか直接関係ないだろ。
ふつう、設計書のクラス図にテストクラスを書いたりはしない。

282:デフォルトの名無しさん
20/07/11 12:02:06.50 wIsoNFzM.net
書いてもいいかなとは思う

283:デフォルトの名無しさん
20/07/11 12:06:30.88 JFnadz6+.net
>>281
そうなんだよねー

284:デフォルトの名無しさん
20/07/11 12:09:38.93 fJlL8BSP.net
>>281
クラス図にprivateメソッドを書きますか?

285:デフォルトの名無しさん
20/07/11 12:11:12.25 JFnadz6+.net
クラス内を調査してprivateメソッドを列挙して
同クラス内のprivateメソッドをテストするコードを列挙して
カバレッジを計測するツールがあればみんな幸せになれそうですね
カバレッジ計測ツールがprivateメソッドには今の時点で対応してないって
だけでprivateメソッドのテスト自体は >>5 のように書けますから
ツールの開発が遅れてるだけなのかも知れませんね

286:デフォルトの名無しさん
20/07/11 12:12:35 fJlL8BSP.net
>>285
もしかしてお前カバレッジの意味がわかってないんじゃね?

publicメソッドの中からprivateメソッドが呼び出された時
privateメソッドの行は実行された=カバレッジとして計測される

ってことは知ってますよね?

287:デフォルトの名無しさん
20/07/11 12:15:06 fJlL8BSP.net
世の中にある全てのカバレッジ計測ツールは
privateメソッド内の実行した行を測定できるのですが
>>285を見る限り何もわかってない気がしますねw

288:デフォルトの名無しさん
20/07/11 12:15:29 JFnadz6+.net
>>286
僕は単体テストやったこと無い
カバレッジの計測もしたことないからわからない
僕は知りません

289:デフォルトの名無しさん
20/07/11 12:16:06 fJlL8BSP.net
>>288
だから>>285みたいな的はずれなことを言ってるんだねw

290:デフォルトの名無しさん
20/07/11 12:17:45 JFnadz6+.net
>>289
それにはちょっと異論があるんだけれども、今回は僕が折れましょう
僕と仲直りしますか?

291:デフォルトの名無しさん
20/07/11 12:18:51 fJlL8BSP.net
>>290
でもおまえ単体テストしたこと無いし
カバレッジの計測もしたことがないから
何も理解してないじゃん(笑)
問題はそこだよね。

292:デフォルトの名無しさん
20/07/11 12:19:25 Cl4N6Aux.net
>>284
開発の段階によって違うんじゃね?最終的な設計ドキュメントには書いてるかな。

293:デフォルトの名無しさん
20/07/11 12:19:47 JFnadz6+.net
>>291
問題はそこじゃないです、君は僕と仲直りますかということが問題です

294:デフォルトの名無しさん
20/07/11 12:22:20 JFnadz6+.net
僕はいままで手作業による結合テストだけで生き抜いてきた生粋のブラックボックスマンです
なぜそれが可能だったかというと簡単なプログラムしか書いたことがなかったからです
しかし、最近複雑なプログラムを書く機会があり結合テストだけでは不十分であることを実感しました
以上、僕の近況報告です

295:デフォルトの名無しさん
20/07/11 12:23:49.29 JFnadz6+.net
僕は単体テスト書いたことありますよ >>5 で書きました
カバレッジは計測したことないですけどそれは重要ではありません

296:デフォルトの名無しさん
20/07/11 12:27:04.12 fJlL8BSP.net
>>293
しません

297:デフォルトの名無しさん
20/07/11 12:27:47.72 fJlL8BSP.net
>>292
最終的な設計ドキュメントはコードから生成するものだからね
クラス図にprivateメソッドが書かれていて嬉しいのでしょうかどうなのでしょうか?

298:デフォルトの名無しさん
20/07/11 12:28:33.49 fJlL8BSP.net
> 最終的な設計ドキュメントはコードから生成するものだからね
クラス図の話ね。クラス図は(唯一?)コードから生成できる。

299:デフォルトの名無しさん
20/07/11 12:29:05.33 JFnadz6+.net
>>296
(´・ω・`)

300:デフォルトの名無しさん
20/07/11 12:31:00.81 fJlL8BSP.net
正直、詳細なクラス図は、設計図の中で一番不要だと思ってる。
必要なのはソースコードと完全に一致してるクラス図ではなく
クラス概要図・関連図とでも言うべきだろう
主要なメソッドとそれぞれのクラス関係がわかればいい
目的はなにかを考えればその結論にたどり着くはず

301:デフォルトの名無しさん
20/07/11 12:37:31.52 Cl4N6Aux.net
>>297
保守する人にとってはあった方がいいと思ってる。

302:デフォルトの名無しさん
20/07/11 12:45:10.61 JFnadz6+.net
単体テストという言葉の曖昧さがpublic派か、private派かの分裂の原因です
publicメソッドはオブジェクトのインターフェイスなので
publicメソッドをテストすることをインターフェイステストというべきです
オブジェクト指向で、インターフェイスが関わるのはオブジェクトのコラボレーションが行われるときです
一方でprivateメソッドはpublicメソッドが作られるのと同じか、もしくはそれ以前に作られます
publicメソッドが正しく動作することの前提としてprivateメソッドが正しく動作することがあるので
privateメソッドをテストすることをインプリメンテーションテストという言うべきです
privateメソッドを使用するのは同じオブジェクト内のメソッドなので、オブジェクトのコラボレーションとは直接の関係がありません
単体テストと言っても対象のメソッドによって、テストが必要な時期が異なるわけです
privateのテストはクラスが作られる前に行われますし、publicのテストがクラスは作られた後に行われます
あとはコストの話です、結合テストがすべて通るなら単体テストは必要ありませんし本番稼働がすべてうまくいくならテスト自体必要ありません
後の工程で発覚するほど手戻りが大きくなりコストが膨らむので段階を追ってテストしていきましょうというのが基本的な考え方です
privateのテストをすることによってpublicのテストの手戻りが少なくなることはあるんです
privateのテストはやったほうが良いです。

303:デフォルトの名無しさん
20/07/11 12:45:36.89 fJlL8BSP.net
>>301
保守する時はコードから生成できるので完璧なのはいらない
だから本当に必要なのはクラス概要図だろう
図としてみたい場合、メソッドすべてがずらずら書かれていても邪魔なだけ
ましてやprivateなんていらない。
図としてみたい場合、本当に見たいのは関連だろう?

304:デフォルトの名無しさん
20/07/11 12:46:11.05 fJlL8BSP.net
>>302
> 単体テストという言葉の曖昧さが
それ以前に、おまえ単体テストしたこと無いし
カバレッジの計測もしたことがないから
何も理解してないじゃん(笑)
問題はそこだよね。

305:デフォルトの名無しさん
20/07/11 12:46:51.38 JFnadz6+.net
頑張って書いた、これはもう論文と言って良いのでは
僕はプログラミングのテストについて博士号もらっても良いのでは
少なくともこのスレではテストに一番詳しい

306:デフォルトの名無しさん
20/07/11 12:48:09.47 JFnadz6+.net
>>304
僕は >>5 で単体テスト書きましたよ
君はカバレッジ計測ツールを使用して理解した気になってるだけのアホです

307:デフォルトの名無しさん
20/07/11 12:48:53.15 JFnadz6+.net
僕はツールを使ったことはないけど、頭を使うからね

308:デフォルトの名無しさん
20/07/11 12:50:19.54 fJlL8BSP.net
288 返信:デフォルトの名無しさん[] 投稿日:2020/07/11(土) 12:15:29.92 ID:JFnadz6+ [26/35]
>>286
僕は単体テストやったこと無い
カバレッジの計測もしたことないからわからない
僕は知りません

309:デフォルトの名無しさん
20/07/11 12:51:19.09 JFnadz6+.net
>>308
>>5 では書きましたよ

310:デフォルトの名無しさん
20/07/11 12:53:21.76 JFnadz6+.net
君はレトリックな部分に引きづられる傾向があるから
もう少し客観的に遠目でものを見るようにしたが良いかも

311:デフォルトの名無しさん
20/07/11 13:02:59 JFnadz6+.net
僕はJavaしか知らないと言ったけどC#に関するあっと言わせるような知識と考察を垣間見せたでしょ
僕の知性あふれる想像力は君の経験を凌駕する
ツールに習熟して使いこなすのも大事だけど、頭を使って状況を分析して打開する力も大事
僕は後者の方が優れている、君と僕が手を組めば最強になれる
僕と仲直りしてくれますか?

312:デフォルトの名無しさん
20/07/11 14:58:15.05 0BF0aQZE.net
TDD信奉者がprivateメソッドのテストは必要ないと主張するのは当たり前
TDDは一般的にpublicメソッドを最小”ユニット”として書き始めるから
privateメソッドが作られるのはテストが通る状態を維持したままリファクタリングして
一部をprivateメソッドに抽出した場合だけ
だからprivateメソッドのテストを書く必要がない
privateメソッドじゃなくHelperクラスのpublicメソッド等に抽出した場合も同じ
HelperクラスをpublicなAPIとして公開するのでなければ別途テストを追加する必要は基本的にない

313:デフォルトの名無しさん
20/07/11 15:11:26.01 KCR4lRFo.net
和田メソッドよろしく!

314:デフォルトの名無しさん
20/07/11 15:36:11.13 JFnadz6+.net
>>312
なるほどね

315:デフォルトの名無しさん
20/07/11 15:55:06.50 fJlL8BSP.net
和田さんの話にも飽きたので、レガシーコード改善ガイドという本の話でもしようか?
URLリンク(bmf-tech.com)
・クラスのメソッドがprivateだったとき
  ・publicメソッドを通じたテストが可能か検討する
    ・publicメソッドを通じたテストを行うことで実際のコードと同じ方法によるテストが保証できる
  ・上記が可能でない場合
    ・そのprivateメソッドはpublicにすべき
      ・大抵の場合はそのクラスが多くのことをやりすぎている、再設計が必要であることを意味している
・privateメソッドをpublicメソッドにすることについて悩む点
  ・メソッドが単なるユーティリティで、呼び出し側が気にかけるものでない
    →そのメソッドを別クラスに移せないか検討する
    →クラスのインターフェースに余分なpublicメソッドがあることは許容可能
  ・呼び出し側がそのメソッドを直接使った場合、そのクラスの他のメソッドの結果に悪影響を及ぼす可能性がある
    →そのメソッドを別クラスに移し、移動先のクラスでpublicにする
・良い設計とはテストが可能であり、悪い設計はテストが不可能
まあ言ってることはほとんど同じなんだけどなw

316:デフォルトの名無しさん
20/07/11 15:56:52.92 fJlL8BSP.net
URLリンク(maku.blog)
第10章 このメソッドをテストハーネスで動かすことができません
テストしたいメソッドが private である
・private メソッドをテストしたい場合、そのメソッドは public にすべきである。
・public メソッドにすべきかどうかで悩んでしまう場合、大抵は、そのクラスが多くのことを行いすぎであり、
修正すべきことを意味している(1つのクラスが複数の責務を持ってしまっている)。
・よい設計はテスト可能であり、テスト可能でない設計は悪い設計である。

・この方法は、メソッドを単純に public 化するのと本質的には変わらないので微妙な対応方法だが、リファクタリングすべき箇所の目印となる。
・Java などの言語ではリフレクションによって private メソッドのテストを記述することはできるが、
根本的な依存関係の問題を先延ばしにしているだけである。その種のごまかしをすると、
コードがどの程度悪くなっているのかに気付きにくくなってしまう。

317:デフォルトの名無しさん
20/07/11 17:36:03.50 KCR4lRFo.net
北朝鮮行ったことあるか?
日本の町並みには看板があるだろ?
「パナソニック」とか「コカ・コーラ」とかだよな。
北朝鮮でこれに該当するのはスローガンの看板だから。
社名や商品名の看板は一切ない。
「ウリナラをキノコの国にしよう!」←裏の意味は無くそのままの意味らしい。
「苦難の行軍!」
「白頭の革命精神!」
和田メソッドに通じるものがあるよな。

318:デフォルトの名無しさん
20/07/11 18:36:13.70 fJlL8BSP.net
>>317
他のスレで書いたけど「例え」は物事をわかりやすく説明するために使うもの
何かを批判するために「例え」を使うのは悪手。なぜなら
「例え」で批判してるのは「例え」に使ったものだから
お前が批判してるのは北朝鮮であって
和田さんや「レガシーコード改善ガイド」の
ベストプラクティスの批判にはなっていない

319:デフォルトの名無しさん
20/07/11 18:45:30.42 KCR4lRFo.net
和田メソッドは時代遅れの遺物。

320:デフォルトの名無しさん
20/07/11 18:47:40.49 KCR4lRFo.net
t-wada氏がお勧めする和田メソッド。

321:デフォルトの名無しさん
20/07/11 19:20:51 JFnadz6+.net
話をしようかと言い、本の内容をコピペしただけとかゲンナリするよね
たとえ批判されても自分が言ったわけじゃないから問題ないわけですね
スネ夫メソッドと名付けましょう

322:デフォルトの名無しさん
20/07/11 19:23:09 JFnadz6+.net
本に書いてあることを自分なりに実践してみた結果大失敗して
和田メソッドは役に立たなかったとかそういう話が聞きたい

323:デフォルトの名無しさん
20/07/11 19:30:25 fJlL8BSP.net
実践した結果コードがきれいになり
テストがしやすくなったよ

324:デフォルトの名無しさん
20/07/11 19:35:57 JFnadz6+.net
>>323
さようか

325:デフォルトの名無しさん
20/07/11 19:37:32 JFnadz6+.net
車の運転がうまい人は車の危険性を知ってる人
和田メソッドを熟知した人なら和田メソッドの危険性を知ってると思うのだよ
和田メソッドの限界はどこにあるのだろうね
TDDが向かないプログラムもあるとは本に書いてあるけど
それが具体的にどういう状況か、どういうプログラムかは示されないからよくわからない
僕はTDDの限界はpublicを前提とするところにあるのじゃないかと漠然と思ってる
まだぼんやりとして言語化できる段階にない

326:デフォルトの名無しさん
20/07/11 20:23:20.20 JFnadz6+.net
ググってみたけどTDDに否定的な考え方は世界的にあるみたいね

327:デフォルトの名無しさん
20/07/11 20:58:34.53 KCR4lRFo.net
TDDはともかく、和田メソッドはダメでしょう。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch