■短い回答
プライベートをテストしたい場合は設計に問題があるので、パブリックに変更してテストしましょう
■これに対する(変な人の)驚いた反論
プライベートを一時的にパブリックにして、テストが終わったら
プライベートに戻すなんてやるわけないだろw
↑誰もそんなコトしろなんて言ってない
■テスト専門家による回答
t-wadaのブログ
https://t-wada.hatenablog.jp/entry/should-we-test-private-methods
短くまとめると、プライベートなメソッドのテストを書く必要は 無い と考えています。
ほとんどのプライベートメソッドはパブリックメソッド経由でテストできるからです。
プライベートメソッドは実装の詳細であり、自動テストのターゲットとなる「外部から見た振る舞い」ではありません。
プライベートなメソッドのテストに関しては、4つの考え方があります。
・パブリックメソッド経由でテストする
・別クラスのパブリックメソッドとする
・テスト対象の可視性を(やや)上げる
・プライベートのまま、リフレクションでアクセスしてテストを書く
パブリックメソッド経由でテストする
多くの場合、そのクラスのパブリックメソッド経由でプライベートメソッドのテストも同時に行えます。テストできているか不安があるならテストカバレッジを確認しましょう。
別クラスのパブリックメソッドとする
プライベートなメソッドのテストを書きたいということは、実はテスト対象の責務が多すぎることを示唆している場合があります。
テストがどうしても書きたい場合は、その責務はテスト対象のプライベートな振る舞いではなく、他の誰かのパブリックな振る舞いなのでしょう。
探検
カプセル化■プライベートメソッドをテストする方法
■ このスレッドは過去ログ倉庫に格納されています
2020/07/05(日) 20:47:46.60ID:M+BkbwUs
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:fJlL8BSP251デフォルトの名無しさん
2020/07/11(土) 10:53:54.57ID:Cl4N6Aux だって可視性とテストするしないの関係は自明じゃないじゃん。
それが関係あるなら外部にexportする関数以外はテストしなくていいことになるんじゃね?
それが関係あるなら外部にexportする関数以外はテストしなくていいことになるんじゃね?
252デフォルトの名無しさん
2020/07/11(土) 11:13:39.51ID:JFnadz6+253デフォルトの名無しさん
2020/07/11(土) 11:16:43.36ID:JFnadz6+ publicにしたら全然関係ないパッケージからもアクセスされてしまうからね
不必要な依存を発生させることになってしまう、密結合が促進されるね
そういう意識のない人間が >>3 のような下痢便コードを書いてしまうんだね
不必要な依存を発生させることになってしまう、密結合が促進されるね
そういう意識のない人間が >>3 のような下痢便コードを書いてしまうんだね
254デフォルトの名無しさん
2020/07/11(土) 11:18:39.33ID:fJlL8BSP255デフォルトの名無しさん
2020/07/11(土) 11:19:08.47ID:fJlL8BSP256デフォルトの名無しさん
2020/07/11(土) 11:20:35.92ID:JFnadz6+ >>254
言ってるじゃん、アクセス修飾子とメソッドの仕様が明確になってるかは無関係
言ってるじゃん、アクセス修飾子とメソッドの仕様が明確になってるかは無関係
257デフォルトの名無しさん
2020/07/11(土) 11:21:19.03ID:JFnadz6+258デフォルトの名無しさん
2020/07/11(土) 11:22:19.30ID:JFnadz6+ テストから呼び出せるのが問題なんじゃなくて
関係ないパッケージから呼び出されて密結合になるのが問題だと言ってる
関係ないパッケージから呼び出されて密結合になるのが問題だと言ってる
259デフォルトの名無しさん
2020/07/11(土) 11:22:42.09ID:JFnadz6+ だからパッケージプライベートなら良いだろうと言ってるわけ
260デフォルトの名無しさん
2020/07/11(土) 11:25:32.87ID:fJlL8BSP >>256
言ってないよ?
外部からアクセスしないならprivate。
でも仕様がはっきりしてるならpublicにしていい。
facebookでもプライベートな話は他人に見せる必要がないからprivateだけど
別に他人に見せてもいいならpublicにしてもいいよね
それと一緒
言ってないよ?
外部からアクセスしないならprivate。
でも仕様がはっきりしてるならpublicにしていい。
facebookでもプライベートな話は他人に見せる必要がないからprivateだけど
別に他人に見せてもいいならpublicにしてもいいよね
それと一緒
261デフォルトの名無しさん
2020/07/11(土) 11:26:14.03ID:JFnadz6+ パッケージプライベートだと同じパッケージからならアクセスして良いというメッセージを
開発者に伝えてしまうから望まない依存を生んでしまうリスクはある
どのオブジェクトからも参照されたくない場合もあるからな、やはりprivateをテストできない
言語が遅れてるだけなのだろうね
開発者に伝えてしまうから望まない依存を生んでしまうリスクはある
どのオブジェクトからも参照されたくない場合もあるからな、やはりprivateをテストできない
言語が遅れてるだけなのだろうね
262デフォルトの名無しさん
2020/07/11(土) 11:26:21.59ID:fJlL8BSP263デフォルトの名無しさん
2020/07/11(土) 11:27:14.70ID:JFnadz6+264デフォルトの名無しさん
2020/07/11(土) 11:27:56.48ID:fJlL8BSP >>261
privateをテストできる言語っていうのは
単に全てpublicになっているのと一緒
アンダースコアで、これはアクセスできるけど
privateという意味ですよと言ってるのと何も変わらないよ
privateをテストできる言語っていうのは
単に全てpublicになっているのと一緒
アンダースコアで、これはアクセスできるけど
privateという意味ですよと言ってるのと何も変わらないよ
265デフォルトの名無しさん
2020/07/11(土) 11:28:00.37ID:JFnadz6+ >>262
Javaの話ですよ
Javaの話ですよ
266デフォルトの名無しさん
2020/07/11(土) 11:28:48.86ID:JFnadz6+267デフォルトの名無しさん
2020/07/11(土) 11:29:55.28ID:fJlL8BSP >>263
仕様がはっきりしてるからpublicにするんじゃなくて
仕様をはっきりさせれば、publicにしてもよいと言ってるだけ
理由がなければprivateのままでもいい。どちらでもいい。
テストしたい=理由。理由があるならpublicにしていい。
> なぜならば密結合になってしまうから
テストコードから仕様がはっきりしないprivateをテストすること=密結合
密結合を避けるためにも、公開されたインターフェースにするのが正しい
仕様がはっきりしてるからpublicにするんじゃなくて
仕様をはっきりさせれば、publicにしてもよいと言ってるだけ
理由がなければprivateのままでもいい。どちらでもいい。
テストしたい=理由。理由があるならpublicにしていい。
> なぜならば密結合になってしまうから
テストコードから仕様がはっきりしないprivateをテストすること=密結合
密結合を避けるためにも、公開されたインターフェースにするのが正しい
268デフォルトの名無しさん
2020/07/11(土) 11:30:13.81ID:JFnadz6+ RustやGoはprivateもテストできるよって言ってる人いたから
最近の言語ではprivateもテストできるんだーって思ってたけど
命名規則でアクセス修飾子の代わりを果たしてるんだってことだったの? それは知らなかったなー
最近の言語ではprivateもテストできるんだーって思ってたけど
命名規則でアクセス修飾子の代わりを果たしてるんだってことだったの? それは知らなかったなー
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市政権にパイプ役不在…日中高まる緊張 公明党の連立離脱影響、自民内にも懸念「自分でまいた種は自分で刈り取ってもらわないと」★2 [ぐれ★]
- 中国国営メディア「沖縄は日本ではない」… ★6 [BFU★]
- 【速報】 日経平均の下落率3%超す、財政懸念で長期金利上昇 [お断り★]
- 【速報】 高市政権、「日本版DOGE」を立ち上げ 米国で歳出削減をした「政府効率化省(DOGE)」になぞらえたもの [お断り★]
- 台湾声明 「台湾は独立した主権国家、中国は台湾を統治したことがなく、中国は口出しする権利ない」 中国が高市首相に抗議で ★7 [お断り★]
- 【こんなの初めて…】民泊には既にキャンセルも 中国の渡航自粛で ★2 [ぐれ★]
- 台湾政党が高市首相「存立危機事態」発言に感謝の書簡「我々の心を強く奮い立たせるものでした」 [834922174]
- 【悲報】中国を煽り運転に例えたネトウヨさん、完全に論破されてしまう [268718286]
- 中国「高市が謝罪撤回しないとこれ全部なくなるけどどうする?」 [931948549]
- 高市「金正恩総書記と会談したい」 国交ある国ですらまともに外交出来ないのに北朝鮮相手に何が出来るのこいつ [878970802]
- 玉川徹「日中の対立が深まるとそれで利益を得る、ビジネスにしている人たちがいる」 有識者「おまえやんw」 [279254606]
- 【正論】有識者「高市早苗に合理的配慮をしなかった野党が悪い」 [175344491]
