■短い回答
プライベートをテストしたい場合は設計に問題があるので、パブリックに変更してテストしましょう
■これに対する(変な人の)驚いた反論
プライベートを一時的にパブリックにして、テストが終わったら
プライベートに戻すなんてやるわけないだろw
↑誰もそんなコトしろなんて言ってない
■テスト専門家による回答
t-wadaのブログ
https://t-wada.hatenablog.jp/entry/should-we-test-private-methods
短くまとめると、プライベートなメソッドのテストを書く必要は 無い と考えています。
ほとんどのプライベートメソッドはパブリックメソッド経由でテストできるからです。
プライベートメソッドは実装の詳細であり、自動テストのターゲットとなる「外部から見た振る舞い」ではありません。
プライベートなメソッドのテストに関しては、4つの考え方があります。
・パブリックメソッド経由でテストする
・別クラスのパブリックメソッドとする
・テスト対象の可視性を(やや)上げる
・プライベートのまま、リフレクションでアクセスしてテストを書く
パブリックメソッド経由でテストする
多くの場合、そのクラスのパブリックメソッド経由でプライベートメソッドのテストも同時に行えます。テストできているか不安があるならテストカバレッジを確認しましょう。
別クラスのパブリックメソッドとする
プライベートなメソッドのテストを書きたいということは、実はテスト対象の責務が多すぎることを示唆している場合があります。
テストがどうしても書きたい場合は、その責務はテスト対象のプライベートな振る舞いではなく、他の誰かのパブリックな振る舞いなのでしょう。
探検
カプセル化■プライベートメソッドをテストする方法
■ このスレッドは過去ログ倉庫に格納されています
2020/07/05(日) 20:47:46.60ID:M+BkbwUs
151デフォルトの名無しさん
2020/07/07(火) 22:30:06.58ID:YBf2Aagc > ある時改修で別のpublicメソッドからt=3のときにprivateメソッドを呼ぶことになったら
> t=0しかテストやってなかったら
仕様が変わったのならt=3のときのテストを追加しましょう
> t=0しかテストやってなかったら
仕様が変わったのならt=3のときのテストを追加しましょう
152デフォルトの名無しさん
2020/07/07(火) 22:34:14.99ID:YBf2Aagc >>149はホント意味不明だな
最初の仕様・・・t=0のときしかprivateメソッドの処理をしない
t=3のときは?→「privateメソッドの処理をしない」場合の結果が正しい
改修・・・t=3のときにprivateメソッドの処理をすることになった
「privateメソッドの処理をした」場合の結果が以前と異なるという仕様になった
では新しい仕様のテストを書きましょう
これだけなんだがなぁ
前と正しい答えが違うのに、テストを修正しないの?
最初の仕様・・・t=0のときしかprivateメソッドの処理をしない
t=3のときは?→「privateメソッドの処理をしない」場合の結果が正しい
改修・・・t=3のときにprivateメソッドの処理をすることになった
「privateメソッドの処理をした」場合の結果が以前と異なるという仕様になった
では新しい仕様のテストを書きましょう
これだけなんだがなぁ
前と正しい答えが違うのに、テストを修正しないの?
153デフォルトの名無しさん
2020/07/07(火) 22:49:42.87ID:bdixmHft154デフォルトの名無しさん
2020/07/07(火) 22:52:36.96ID:bdixmHft 設計書かコメントに
このメソッドはt=0のときしかテストしていません!
って書いてあるの?
お前のソースって
悪いけど見たことねーや
滅茶苦茶バカだしもういいかな?
レスしなくて
このメソッドはt=0のときしかテストしていません!
って書いてあるの?
お前のソースって
悪いけど見たことねーや
滅茶苦茶バカだしもういいかな?
レスしなくて
155デフォルトの名無しさん
2020/07/07(火) 22:54:46.63ID:YBf2Aagc >>153
だから変わったpublicメソッドをテストしろよ
変わってないならprivateメソッドに何の問題もないだろ
それとも何か?お前すべての取りうる値でテストしろと言ってんのか?
この関数は数値を二倍してくれる関数である。
今まで4を入れてこの関数を呼び出していた。
今度5を入れるようになったから5を入れた場合はどうなるかテストする必要がある
今度は6を、7を、8を・・・って新しい引数で呼び出すために
そのテストが必要なんか?ああん?
だから変わったpublicメソッドをテストしろよ
変わってないならprivateメソッドに何の問題もないだろ
それとも何か?お前すべての取りうる値でテストしろと言ってんのか?
この関数は数値を二倍してくれる関数である。
今まで4を入れてこの関数を呼び出していた。
今度5を入れるようになったから5を入れた場合はどうなるかテストする必要がある
今度は6を、7を、8を・・・って新しい引数で呼び出すために
そのテストが必要なんか?ああん?
156デフォルトの名無しさん
2020/07/07(火) 22:56:07.20ID:YBf2Aagc157デフォルトの名無しさん
2020/07/07(火) 23:00:58.28ID:bdixmHft は?最小-1、最小、中間、最大、最大+1通すだろフツー
158デフォルトの名無しさん
2020/07/07(火) 23:02:33.64ID:bdixmHft だが、お前のやり方ではどうやっても通すことはできないんだよ
こんな簡単なテストすら不可能
早く死ねよ
これがお前の限界なんだよ
こんな簡単なテストすら不可能
早く死ねよ
これがお前の限界なんだよ
159デフォルトの名無しさん
2020/07/07(火) 23:06:04.37ID:bdixmHft っていうかここまで自分の間違いを認めない意味はなんかあるの?
これぜってー仕事でお前の主張が通る現場ねーぞガチで
メソッドにt=0のときしかテストしてませんって書いてあるもの納品するか?
ナメてんじゃねーよ
これぜってー仕事でお前の主張が通る現場ねーぞガチで
メソッドにt=0のときしかテストしてませんって書いてあるもの納品するか?
ナメてんじゃねーよ
160デフォルトの名無しさん
2020/07/07(火) 23:36:58.56ID:YBf2Aagc >>157
> は?最小-1、最小、中間、最大、最大+1通すだろフツー
・t=3のどこが、最小-1、最小、中間、最大、最大+1なんだよw
「今回」新しく仕様が変わって、t=3 などというものが登場したんだろ
なら「今回」テストを追加するだけの話だろ
それとも何か? t=3がいままでprivateを呼ばなかったのに
t=3のテストをお前はするんか?どういった理由で?
> は?最小-1、最小、中間、最大、最大+1通すだろフツー
・t=3のどこが、最小-1、最小、中間、最大、最大+1なんだよw
「今回」新しく仕様が変わって、t=3 などというものが登場したんだろ
なら「今回」テストを追加するだけの話だろ
それとも何か? t=3がいままでprivateを呼ばなかったのに
t=3のテストをお前はするんか?どういった理由で?
161デフォルトの名無しさん
2020/07/07(火) 23:47:24.20ID:zm6NAQZG162デフォルトの名無しさん
2020/07/07(火) 23:56:35.16ID:D1qF8R0D bdixmHftはQueueという言葉とオブジェクト指向という言葉が理解できずに発狂した説
163デフォルトの名無しさん
2020/07/08(水) 00:21:47.63ID:SznGehK7 詳細に関する知識が無ければ検査できないなら、公開メンバを介して検査するのと、非公開メンバを直接検査するのは同じことですよ。
これが理解できないなら、もはや議論の意味が無いでしょう。
そもそも自身が推奨する和田メソッドさえ理解できていないって事ですから。
これが理解できないなら、もはや議論の意味が無いでしょう。
そもそも自身が推奨する和田メソッドさえ理解できていないって事ですから。
164デフォルトの名無しさん
2020/07/08(水) 00:28:23.66ID:SznGehK7 アンクルボブの理論に対する賛否両論から議論を始めるべきなのかもしれない。
165デフォルトの名無しさん
2020/07/08(水) 00:29:51.46ID:kqVG+rMe166デフォルトの名無しさん
2020/07/08(水) 00:35:35.13ID:SznGehK7 和田さんはアンクルボブを理論のベースにしています。
和田理論否定派はアンクルボブ理論を理解したうえで和田理論に異議を述べています。
和田理論信仰者は、そもそもアンクルボブって何?状態です。
だから議論が成り立っていないのです。
和田理論否定派はアンクルボブ理論を理解したうえで和田理論に異議を述べています。
和田理論信仰者は、そもそもアンクルボブって何?状態です。
だから議論が成り立っていないのです。
167デフォルトの名無しさん
2020/07/08(水) 00:42:30.98ID:UPP9MPHB (和田メソッドって何だ?)
168デフォルトの名無しさん
2020/07/08(水) 00:52:01.29ID:SznGehK7 詳細に関する知識を持ってはならないというのが和田理論の根幹です。
private、publicという字面にこだわるのは単なる信仰心にすぎません。
神を信じますか?ハイ信じます。
神を見ましたか?ハイ見ました。
こういうことです。
private、publicという字面にこだわるのは単なる信仰心にすぎません。
神を信じますか?ハイ信じます。
神を見ましたか?ハイ見ました。
こういうことです。
169デフォルトの名無しさん
2020/07/08(水) 00:56:34.00ID:SznGehK7 和田理論を素直に受け入れられるのは、プログラミングとはAPIを呼び出すことであり、決してアルゴリズムを実装することではないからですよ。
つまり、システム利用者がシステム作者に対して小言を言うような状態です。
詳細を検査したら駄目じゃないか!詳細は呼び出せればいいんだよ!
つまり、システム利用者がシステム作者に対して小言を言うような状態です。
詳細を検査したら駄目じゃないか!詳細は呼び出せればいいんだよ!
170デフォルトの名無しさん
2020/07/08(水) 01:27:45.49ID:/rdq0ZOx >>167
「アンチ和田」がかってに命名したもの(笑)
「アンチ和田」がかってに命名したもの(笑)
171デフォルトの名無しさん
2020/07/08(水) 01:28:51.37ID:/rdq0ZOx 「和田理論」も同じな。「アンチ和田」はなにか理由があって
命名しているんだろう。常識的なことを名前をつけることで
特別な方法だと錯覚させる手かな?
命名しているんだろう。常識的なことを名前をつけることで
特別な方法だと錯覚させる手かな?
172デフォルトの名無しさん
2020/07/08(水) 04:10:02.60ID:6ZEX1zcL >>166
ロバート・C ・マーチンのこと?
ロバート・C ・マーチンのこと?
173デフォルトの名無しさん
2020/07/08(水) 04:11:04.99ID:6ZEX1zcL >>169
なるほどな
なるほどな
174デフォルトの名無しさん
2020/07/08(水) 06:13:27.58ID:AplvQTCJ175デフォルトの名無しさん
2020/07/08(水) 08:26:03.95ID:6ZEX1zcL >>174
違いません、困りません
違いません、困りません
176デフォルトの名無しさん
2020/07/08(水) 08:29:40.77ID:6ZEX1zcL アンクルボブをロバートと読み替えても通じますし
僕が納得したところでお前は何も困りません
僕が納得したところでお前は何も困りません
177デフォルトの名無しさん
2020/07/08(水) 08:35:30.95ID:6ZEX1zcL178デフォルトの名無しさん
2020/07/08(水) 09:02:50.79ID:SznGehK7 >>172
ハイそうです。
ハイそうです。
179デフォルトの名無しさん
2020/07/08(水) 12:16:39.34ID:hmU+YLWt 関数が取りうる値で全てでテストしろと言ってるアホがいるスレはここですか?
今回78という値で関数を呼び出すことになった
78という値を与えた時、ちゃんと動くかテストしているかね?
だってさ(笑)
今回78という値で関数を呼び出すことになった
78という値を与えた時、ちゃんと動くかテストしているかね?
だってさ(笑)
180デフォルトの名無しさん
2020/07/08(水) 12:42:10.97ID:PWwZYnOX privateメソッドのテストを具体的にどうやるのか未だに分からん。
そもそも、public経由のメソッド呼び出しで網羅できない巨大privateメソッドの正しい動作なんて定義できるの?
そもそも、public経由のメソッド呼び出しで網羅できない巨大privateメソッドの正しい動作なんて定義できるの?
181デフォルトの名無しさん
2020/07/08(水) 12:54:49.19ID:ODFOiaSP 巨大なメソッド自体が悪じゃね
あとテストってinoutを確認するんじゃないの?
outいっぱいしてたらもうそれ完全害悪じゃね
あとテストってinoutを確認するんじゃないの?
outいっぱいしてたらもうそれ完全害悪じゃね
182デフォルトの名無しさん
2020/07/08(水) 14:27:45.18ID:ZL+NZ9CQ ステートメントの入力により無限通りの構文木が出力されるパーサ?
なんだそれ?
なんだそれ?
183デフォルトの名無しさん
2020/07/08(水) 17:57:24.33ID:pS2ORJtj >>179
最小、最大、中間値ぐらいしか言ってないのにそうやって曲解しないと負けちゃいそうなの?
最小、最大、中間値ぐらいしか言ってないのにそうやって曲解しないと負けちゃいそうなの?
184デフォルトの名無しさん
2020/07/08(水) 18:33:36.38ID:IWyzFdDn そもそも、privateメソッドを定義すること事態、滅多にないよ。
というか、自分のソース見たら無かった。
というか、自分のソース見たら無かった。
185デフォルトの名無しさん
2020/07/08(水) 18:42:33.47ID:IWyzFdDn このスレの過去の発言を見ると誤解を招きそうだから補足するけど、別に内部処理をpublicにしたからprivateは無いという意味じゃないからね?
元からpublicメソッドとprivate変数しかない。
元からpublicメソッドとprivate変数しかない。
186デフォルトの名無しさん
2020/07/08(水) 20:52:09.28ID:Sbr5rKl2187デフォルトの名無しさん
2020/07/08(水) 20:55:55.79ID:hmU+YLWt >>183
↓って書いてますが? 3と78でなにか違いがあるんですか?
> ある時改修で別のpublicメソッドからt=3のときにprivateメソッドを呼ぶことになったら
> t=0しかテストやってなかったら
↓って書いてますが? 3と78でなにか違いがあるんですか?
> ある時改修で別のpublicメソッドからt=3のときにprivateメソッドを呼ぶことになったら
> t=0しかテストやってなかったら
188デフォルトの名無しさん
2020/07/08(水) 20:59:13.73ID:hmU+YLWt >>186
そういうこと。巨大なメソッドがあったらそれを
一つのメソッドと、そこから使われるユーティリティメソッドに分割する
ユーティリティメソッドはできる限り汎用的なインターフェスにする(たとえ一箇所でしか使われていなくても)
ユーティリティメソッドはそれ単体でテストする
そうすれば巨大なメソッドのコード量が減る
そういうこと。巨大なメソッドがあったらそれを
一つのメソッドと、そこから使われるユーティリティメソッドに分割する
ユーティリティメソッドはできる限り汎用的なインターフェスにする(たとえ一箇所でしか使われていなくても)
ユーティリティメソッドはそれ単体でテストする
そうすれば巨大なメソッドのコード量が減る
189デフォルトの名無しさん
2020/07/08(水) 21:15:04.90ID:s5mehW61190デフォルトの名無しさん
2020/07/08(水) 21:19:38.42ID:hmU+YLWt >>189
あのさぁ、ごまかしてないでちゃんと書こうよ?
最小、最大、中間値のテストやってれば
最小、最大、中間値ではない3のテストなんて不要なんだよって
ちゃんといわないと、あのバカには伝わらないよ?
あのさぁ、ごまかしてないでちゃんと書こうよ?
最小、最大、中間値のテストやってれば
最小、最大、中間値ではない3のテストなんて不要なんだよって
ちゃんといわないと、あのバカには伝わらないよ?
191デフォルトの名無しさん
2020/07/08(水) 23:59:05.09ID:hEQaHqpN 最小、最大、中間値って聞いたことがないけど
どこかの分野で一般的に使われてるもの?
境界値分析なら
境界値と境界値の内側と外側の3値か
境界値と境界値の外側の2値かどっちかが一般的だと思う
どこかの分野で一般的に使われてるもの?
境界値分析なら
境界値と境界値の内側と外側の3値か
境界値と境界値の外側の2値かどっちかが一般的だと思う
192デフォルトの名無しさん
2020/07/09(木) 00:14:35.43ID:qGUjUa51 >>191
3と78がそれに当たると申すか?
3と78がそれに当たると申すか?
193デフォルトの名無しさん
2020/07/09(木) 00:16:52.90ID:tq6y70T3 俺もそう思ってたけど、そもそもスレタイともずれてきてるよねっていう
194デフォルトの名無しさん
2020/07/09(木) 00:21:36.93ID:Ai/0yITE 3と78の伏線が
今、回収されたのか?
今、回収されたのか?
195デフォルトの名無しさん
2020/07/10(金) 12:24:37.85ID:sSLzYC6I 詳細を知ってはならないということは、詳細の知識、つまり境界を知ってはならないということ。
「彼らはオブジェクト指向を全く知らない可哀そうな人ではないか?Javaを学ぶべきだ!」などと言う前に、原典に当たろう。
「彼らはオブジェクト指向を全く知らない可哀そうな人ではないか?Javaを学ぶべきだ!」などと言う前に、原典に当たろう。
196デフォルトの名無しさん
2020/07/10(金) 12:25:53.05ID:A+QDXq04 >>195
オブジェクト指向と関係ない話なら、関係ないって書いとけよ
オブジェクト指向と関係ない話なら、関係ないって書いとけよ
197デフォルトの名無しさん
2020/07/10(金) 12:54:55.71ID:1UxRpBTq zTLocdwC以外、Javaなんて誰も言ってないけど?何が言いたいんだ?
スレタイはカプセル化って書いてあるしOOPは理解している前提でしょ?
まぁ、明らかにOOPを理解していない人が発狂していたけど。
スレタイはカプセル化って書いてあるしOOPは理解している前提でしょ?
まぁ、明らかにOOPを理解していない人が発狂していたけど。
198デフォルトの名無しさん
2020/07/10(金) 14:04:44.56ID:sSLzYC6I いや、おそらくわかっていないだろう。
199デフォルトの名無しさん
2020/07/10(金) 14:09:26.25ID:sSLzYC6I オブジェクト指向のすばらしさを語っている人が、一番オブジェクト指向を知らない。
ゆえに議論が成り立たないという状態ではないだろか。
ゆえに議論が成り立たないという状態ではないだろか。
200デフォルトの名無しさん
2020/07/10(金) 14:12:09.99ID:sSLzYC6I201デフォルトの名無しさん
2020/07/10(金) 15:02:20.85ID:zQa5K81u202デフォルトの名無しさん
2020/07/10(金) 15:16:19.83ID:TbXdOMZ+ ポエってるやつがいるな
203デフォルトの名無しさん
2020/07/10(金) 16:07:13.59ID:sSLzYC6I 和田メソッドを称賛してる人たちに決まってるだろ。
204デフォルトの名無しさん
2020/07/10(金) 16:35:36.39ID:zQa5K81u 和田メソッドって何?
205デフォルトの名無しさん
2020/07/10(金) 17:14:49.72ID:sSLzYC6I >>1 に書いてあるだろ。
206デフォルトの名無しさん
2020/07/10(金) 17:42:15.92ID:A+QDXq04 >>1に書いてあるのはただの常識で
和田メソッドなんて特別な名前じゃないよ
和田メソッドなんて特別な名前じゃないよ
207デフォルトの名無しさん
2020/07/10(金) 20:12:23.39ID:FovnwiSG 常識を疑え、それって和田メソッドじゃないかって
208デフォルトの名無しさん
2020/07/10(金) 20:49:58.98ID:zQa5K81u 常識じゃん。むしろ、常識を疑うその心を疑え。それって経験不足では?
まぁ、強いて言うのなら、リフレクションを用いてテストは、許してはならない反則行為だと思うがな。
特に、カバレッジテストとかする場合は。
まぁ、強いて言うのなら、リフレクションを用いてテストは、許してはならない反則行為だと思うがな。
特に、カバレッジテストとかする場合は。
209デフォルトの名無しさん
2020/07/10(金) 21:00:54.86ID:zQa5K81u ただ、記事を書いた和田さん?も、記事を読むとその危険性を理解しているみたいだから対立する気はないよ。
黒魔術と言ってるし。
なんで黒魔術なんでしょうねぇ(すっとぼけ)
黒魔術と言ってるし。
なんで黒魔術なんでしょうねぇ(すっとぼけ)
210デフォルトの名無しさん
2020/07/10(金) 21:09:49.17ID:HmvrAlYz そりゃC++への嫉妬だろ
C++はそう呼ばれるのに、Javaは何故かそうは呼ばれない、それは何故か?
Javaに欠けているものとは一体……?!
C++はそう呼ばれるのに、Javaは何故かそうは呼ばれない、それは何故か?
Javaに欠けているものとは一体……?!
211デフォルトの名無しさん
2020/07/10(金) 21:30:17.43ID:LiH0PaR7 黒魔術って言われ方を誉め言葉だと思ってる馬鹿ってほんとにいるんだな。。
212デフォルトの名無しさん
2020/07/10(金) 21:36:39.85ID:pLXOeUja オブジェクトが隠蔽・カプセル化するものだからといってホワイトボックステストまで否定しちゃうのは変な話。
213デフォルトの名無しさん
2020/07/10(金) 21:51:04.37ID:zQa5K81u ホワイトボックステストを否定する気はないけど...例えば
>>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メソッドを定義するケース自体、珍しいから、経験則に基づかない発言でもあるが...。
>>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デフォルトの名無しさん
2020/07/10(金) 21:56:59.04ID:FovnwiSG 和田メソッドは非常識
215デフォルトの名無しさん
2020/07/10(金) 22:02:19.60ID:FovnwiSG 和田さんはQueueを実装したことない素人
216デフォルトの名無しさん
2020/07/10(金) 22:04:28.86ID:zQa5K81u あー...うん、俺の言い方が悪かったかも。
privateメソッドをテストするというレアケースだから許してくれ。
常識が無い以上、もっと正確に細かく伝えるべきだったな。
ただ、俺の主張(リフレクションは反則
行為)の弱い点を言うと、OOPやDDDの概念を無視した設計には、こちらの主張は当てはまらない。
そう思うと、和田さんのリフレクションをギリギリ許容(?)するような記事の書き方も否定はできん。
なんだかんだで、彼の記事は自分が記事を書くよりは無難にまとめられているとは思う。
まぁ、記事を書いたことないけど。
privateメソッドをテストするというレアケースだから許してくれ。
常識が無い以上、もっと正確に細かく伝えるべきだったな。
ただ、俺の主張(リフレクションは反則
行為)の弱い点を言うと、OOPやDDDの概念を無視した設計には、こちらの主張は当てはまらない。
そう思うと、和田さんのリフレクションをギリギリ許容(?)するような記事の書き方も否定はできん。
なんだかんだで、彼の記事は自分が記事を書くよりは無難にまとめられているとは思う。
まぁ、記事を書いたことないけど。
217デフォルトの名無しさん
2020/07/10(金) 22:09:19.05ID:pPoV7F8C ユーザーが直接public methodを使うわけじゃなければ
public methodだって実装の詳細
integration test経由で
必要なpublic methodはテストできるんだから
個別にすべてのpublic methodをテストする必要なんてない
というのと似たようなもの
それでいい場合もあればそうじゃない場合もあるというだけ
public methodだって実装の詳細
integration test経由で
必要なpublic methodはテストできるんだから
個別にすべてのpublic methodをテストする必要なんてない
というのと似たようなもの
それでいい場合もあればそうじゃない場合もあるというだけ
218デフォルトの名無しさん
2020/07/10(金) 22:23:15.71ID:FovnwiSG まあね、処理の複雑さによるのだろうね
hello world程度ならテストさえ必要ないだろうし
hello world程度ならテストさえ必要ないだろうし
219デフォルトの名無しさん
2020/07/10(金) 22:31:36.66ID:pLXOeUja220デフォルトの名無しさん
2020/07/10(金) 22:38:32.51ID:d7aQvYi7 そこで、テスト駆動開発ですよ。
最初にテストケースを定義してそれをパスする
コードを書けばpublicだのprivateだの議論は不要
だれかこの開発方法やってる?
最初にテストケースを定義してそれをパスする
コードを書けばpublicだのprivateだの議論は不要
だれかこの開発方法やってる?
221デフォルトの名無しさん
2020/07/10(金) 22:54:55.64ID:FovnwiSG >>220
privateだとテストケース書けないじゃん
privateだとテストケース書けないじゃん
222デフォルトの名無しさん
2020/07/10(金) 23:26:01.49ID:zQa5K81u223デフォルトの名無しさん
2020/07/11(土) 00:18:29.78ID:E2OZ8LYK >>213
> ...で、これでカバレッジテストに合格しちゃったらどうするの?
テストはテストコードを見ないで
OKってでたからOKだ
ってやるもんじゃないよ
テストコードはレビューするものだ
通ったからOKじゃなくて、通るのは当たり前で
テストコードを見て正しくテストされてることを確認する
テスト結果のOKが「エビデンス」なのではなくテストコードが「エビデンス」
動作してることを証明するスクリーンショット(笑)と同じもの
「エビデンス」は見て確認しなければいけない
> ...で、これでカバレッジテストに合格しちゃったらどうするの?
テストはテストコードを見ないで
OKってでたからOKだ
ってやるもんじゃないよ
テストコードはレビューするものだ
通ったからOKじゃなくて、通るのは当たり前で
テストコードを見て正しくテストされてることを確認する
テスト結果のOKが「エビデンス」なのではなくテストコードが「エビデンス」
動作してることを証明するスクリーンショット(笑)と同じもの
「エビデンス」は見て確認しなければいけない
224デフォルトの名無しさん
2020/07/11(土) 00:21:18.34ID:E2OZ8LYK >>221
テストケースがあるもの=publicメソッドで
privateは中で必要に応じて作るもの
メソッドにしてもいいしメソッドにしなくてもいい
テストケース書けないなら関数にせずにそのまま埋め込めよ
publicメソッドのテストケースが問題ないなら
中の詳細なテストなんかいらんだろ
メソッドにしてないかもしれないし
テストケースがあるもの=publicメソッドで
privateは中で必要に応じて作るもの
メソッドにしてもいいしメソッドにしなくてもいい
テストケース書けないなら関数にせずにそのまま埋め込めよ
publicメソッドのテストケースが問題ないなら
中の詳細なテストなんかいらんだろ
メソッドにしてないかもしれないし
225デフォルトの名無しさん
2020/07/11(土) 00:34:45.26ID:0BF0aQZE 何回繰り返すのこの流れww
226デフォルトの名無しさん
2020/07/11(土) 00:40:55.17ID:JFnadz6+ 何度でもだ!
227デフォルトの名無しさん
2020/07/11(土) 00:42:45.65ID:JFnadz6+228デフォルトの名無しさん
2020/07/11(土) 00:43:07.74ID:JFnadz6+ 遠山の和田さん
229デフォルトの名無しさん
2020/07/11(土) 00:45:42.66ID:JFnadz6+ privateではなくてパッケージプライベートにした方がええのかもわからんね
230デフォルトの名無しさん
2020/07/11(土) 00:53:34.50ID:JFnadz6+ それで破綻するならパッケージの設計がよろしくないということで
231デフォルトの名無しさん
2020/07/11(土) 01:01:26.38ID:E2OZ8LYK232デフォルトの名無しさん
2020/07/11(土) 01:06:55.98ID:E2OZ8LYK なんでテストケースが作れるのに、publicにしないのかわからん
233デフォルトの名無しさん
2020/07/11(土) 01:42:00.39ID:H19stfAl234デフォルトの名無しさん
2020/07/11(土) 02:18:29.03ID:wIsoNFzM privateでかっこいいメソッドなんだろうがよ!
いや、俺実はpublic staticしか作らんけど
いや、俺実はpublic staticしか作らんけど
235デフォルトの名無しさん
2020/07/11(土) 02:41:27.63ID:P8l8Ig/I >>222
正直、開発自体をテスト工藤開発で終えるのはキツいと思うけど、
コーディング→動作確認→デバッグ→リファクタリングの
プログラマー個人の短いサイクルでのトライ&エラーには結構使えるんじゃないかと思う。
カバレッジ100%のテストケースは作る工数とメンテが大変だからそこまでする必要はないと思うけど、
そこそこのカバレッジでプログラマーが個人で高速に開発を回せるのは強い。
カバレッジ100%目指すのは単体テストの時だけで十分
正直、開発自体をテスト工藤開発で終えるのはキツいと思うけど、
コーディング→動作確認→デバッグ→リファクタリングの
プログラマー個人の短いサイクルでのトライ&エラーには結構使えるんじゃないかと思う。
カバレッジ100%のテストケースは作る工数とメンテが大変だからそこまでする必要はないと思うけど、
そこそこのカバレッジでプログラマーが個人で高速に開発を回せるのは強い。
カバレッジ100%目指すのは単体テストの時だけで十分
236デフォルトの名無しさん
2020/07/11(土) 02:42:42.87ID:E2OZ8LYK >>235
せやかて
せやかて
237デフォルトの名無しさん
2020/07/11(土) 06:05:52.59ID:KCR4lRFo t-wada氏の推奨する和田メソッド。
238デフォルトの名無しさん
2020/07/11(土) 06:15:18.08ID:KCR4lRFo 和田メソッドによると「非公開メンバをテストすると品質が下がるので絶対するな!」
239デフォルトの名無しさん
2020/07/11(土) 07:08:50.24ID:DdDKJrYh >>238
それどこに書いてあるの?
それどこに書いてあるの?
240デフォルトの名無しさん
2020/07/11(土) 07:51:10.03ID:KCR4lRFo 意識が高くなりすぎて幽体離脱した感のある和田メソッドをよろしく!
241デフォルトの名無しさん
2020/07/11(土) 07:55:47.65ID:Cl4N6Aux242デフォルトの名無しさん
2020/07/11(土) 09:06:32.32ID:JaL6gziv >>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の呼び出しで合格できなかった網羅テストを内部実装を直接呼び出して合格って変な話。
という意味では?
合否判定が変わる例ってこんな感じじゃない?
不当に不合格になる例
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デフォルトの名無しさん
2020/07/11(土) 09:23:48.86ID:wIsoNFzM >>242
でもカバレッジって落ちないぜ以上の意味を取るのって無理じゃね?
でもカバレッジって落ちないぜ以上の意味を取るのって無理じゃね?
244デフォルトの名無しさん
2020/07/11(土) 09:26:28.69ID:Cl4N6Aux >>242
いや、ますますわからん。
そのタイミングで内部実装()呼んでもaの値は変わらんと思うが?
pop()の前に呼ぶんだとしたらなんでそんなテストを書くんだという話になるし。
異なる操作をしたならassert条件が変わるのは当たり前。
いや、ますますわからん。
そのタイミングで内部実装()呼んでもaの値は変わらんと思うが?
pop()の前に呼ぶんだとしたらなんでそんなテストを書くんだという話になるし。
異なる操作をしたならassert条件が変わるのは当たり前。
245デフォルトの名無しさん
2020/07/11(土) 09:35:57.08ID:JaL6gziv246デフォルトの名無しさん
2020/07/11(土) 09:55:21.63ID:fJlL8BSP >>242
まずテストの考え方が違うんだよ。
全ての組み合わせをテストする完全な網羅テストは時間的に不可能
その他のテストも数によっては現実的に不可能となることが多い
通常カバレッジ100%というのは命令網羅テストにすぎない
だが命令網羅テストをやってれば完璧かと言うかそうではない
じゃあどれをやればいいんだよ!?と思うかもしれないが、どれをやるかじゃない
何をやれば自分が作ったものが正しく動くと自信が持てるかなんだよ
現実的に実現可能であるというルールを加えれば、完璧なテストなんてできやしない。
内部実装を直接呼び出して合格したとしても、
それで正しく動くと自信が持てるなら、それで全然かまわないんだよ。
ただしテストする以上、内部実装の仕様を明確にしなきゃテストのレビューはできなくなる。
内部実装の仕様が明確になったならpublicにして問題ない。
おまけだが、pubicメソッドのテストでもprivateメソッドのテストでも
カバレッジを計測するなら、それはホワイトボックステストだからな
なんか間違ってる人がいるようだから
まずテストの考え方が違うんだよ。
全ての組み合わせをテストする完全な網羅テストは時間的に不可能
その他のテストも数によっては現実的に不可能となることが多い
通常カバレッジ100%というのは命令網羅テストにすぎない
だが命令網羅テストをやってれば完璧かと言うかそうではない
じゃあどれをやればいいんだよ!?と思うかもしれないが、どれをやるかじゃない
何をやれば自分が作ったものが正しく動くと自信が持てるかなんだよ
現実的に実現可能であるというルールを加えれば、完璧なテストなんてできやしない。
内部実装を直接呼び出して合格したとしても、
それで正しく動くと自信が持てるなら、それで全然かまわないんだよ。
ただしテストする以上、内部実装の仕様を明確にしなきゃテストのレビューはできなくなる。
内部実装の仕様が明確になったならpublicにして問題ない。
おまけだが、pubicメソッドのテストでもprivateメソッドのテストでも
カバレッジを計測するなら、それはホワイトボックステストだからな
なんか間違ってる人がいるようだから
247デフォルトの名無しさん
2020/07/11(土) 09:55:24.65ID:0/l6dmQ+ 結局クラス分けするなりしてpublicにする部分を多くする、
テストと使用する局面で可視性を変える
の二つしかないわけで、プログラム機能でどうこうする話じゃない。
使う奴が理解して使うという話以上にはならん。
テストと使用する局面で可視性を変える
の二つしかないわけで、プログラム機能でどうこうする話じゃない。
使う奴が理解して使うという話以上にはならん。
248デフォルトの名無しさん
2020/07/11(土) 10:23:35.92ID:Cl4N6Aux 「privateメソッドがテストできないんですがどうしたらいいですか?」という疑問に対して、
なんとかしてテストする方法を編み出すのではなく「privateメソッドはテストしなくていい!」という
逆転の発想というかバッサリ感が中二受けしたんだと思う。
なんとかしてテストする方法を編み出すのではなく「privateメソッドはテストしなくていい!」という
逆転の発想というかバッサリ感が中二受けしたんだと思う。
249デフォルトの名無しさん
2020/07/11(土) 10:26:24.09ID:KzXDm3Nb じゃあ編み出してどうぞ
250デフォルトの名無しさん
2020/07/11(土) 10:36:26.55ID:fJlL8BSP■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★2 [ぐれ★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 【卓球】早田ひな、「総額100万スられた」「ずっと憧れていたスペインとイタリア…」ヨーロッパ旅行で悲劇 スリ被害を告白 [muffin★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 日経平均の下落率3%超す、財政懸念で長期金利上昇 ★2 [お断り★]
- 【実況】博衣こよりのえちえち歌枠🧪★2
- 【画像】外務省局長「この度はうちの🦎がすみません…」中国「……」 [165981677]
- 産経新聞「高市早苗の答弁さぁ……思慮が足りてなくね?官僚と詰めずに思いつきで話しているでしょ」 [175344491]
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 【雑談】暇人集会所part18
- 外務省局長、よくわからないまま帰国へ [834922174]
