■短い回答
プライベートをテストしたい場合は設計に問題があるので、パブリックに変更してテストしましょう
■これに対する(変な人の)驚いた反論
プライベートを一時的にパブリックにして、テストが終わったら
プライベートに戻すなんてやるわけないだろw
↑誰もそんなコトしろなんて言ってない
■テスト専門家による回答
t-wadaのブログ
https://t-wada.hatenablog.jp/entry/should-we-test-private-methods
短くまとめると、プライベートなメソッドのテストを書く必要は 無い と考えています。
ほとんどのプライベートメソッドはパブリックメソッド経由でテストできるからです。
プライベートメソッドは実装の詳細であり、自動テストのターゲットとなる「外部から見た振る舞い」ではありません。
プライベートなメソッドのテストに関しては、4つの考え方があります。
・パブリックメソッド経由でテストする
・別クラスのパブリックメソッドとする
・テスト対象の可視性を(やや)上げる
・プライベートのまま、リフレクションでアクセスしてテストを書く
パブリックメソッド経由でテストする
多くの場合、そのクラスのパブリックメソッド経由でプライベートメソッドのテストも同時に行えます。テストできているか不安があるならテストカバレッジを確認しましょう。
別クラスのパブリックメソッドとする
プライベートなメソッドのテストを書きたいということは、実はテスト対象の責務が多すぎることを示唆している場合があります。
テストがどうしても書きたい場合は、その責務はテスト対象のプライベートな振る舞いではなく、他の誰かのパブリックな振る舞いなのでしょう。
カプセル化■プライベートメソッドをテストする方法
■ このスレッドは過去ログ倉庫に格納されています
2020/07/05(日) 20:47:46.60ID:M+BkbwUs
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もテストできるんだーって思ってたけど
命名規則でアクセス修飾子の代わりを果たしてるんだってことだったの? それは知らなかったなー
269デフォルトの名無しさん
2020/07/11(土) 11:30:22.00ID:fJlL8BSP270デフォルトの名無しさん
2020/07/11(土) 11:30:59.34ID:fJlL8BSP >>268
ああ、人から聞いただけなのねw
ああ、人から聞いただけなのねw
271デフォルトの名無しさん
2020/07/11(土) 11:31:27.48ID:JFnadz6+273デフォルトの名無しさん
2020/07/11(土) 11:32:06.66ID:fJlL8BSP privateにあくせすできる言語でも
テストするならどちらにしろ仕様をはっきりさせないといけない
そうしないとテストコードがあったからといって
これが正しく仕様を満たしているのか?なんてわからない
テストするならどちらにしろ仕様をはっきりさせないといけない
そうしないとテストコードがあったからといって
これが正しく仕様を満たしているのか?なんてわからない
274デフォルトの名無しさん
2020/07/11(土) 11:35:07.08ID:JFnadz6+ さすがです >>3 の下痢便コード書くだけありますね
何言ってるのかさっぱりわからない
何言ってるのかさっぱりわからない
275デフォルトの名無しさん
2020/07/11(土) 11:36:54.90ID:fJlL8BSP276デフォルトの名無しさん
2020/07/11(土) 11:38:14.80ID:JFnadz6+ >>275
そうすると君はMainを勘違いしてた人か、僕と仲直りしますか?
そうすると君はMainを勘違いしてた人か、僕と仲直りしますか?
277デフォルトの名無しさん
2020/07/11(土) 11:39:33.67ID:JFnadz6+ 同じ人が同じこと言ってるだけのスレ
でもそんなスレも良いですよね
でもそんなスレも良いですよね
278デフォルトの名無しさん
2020/07/11(土) 11:47:13.10ID:JFnadz6+ たとえばこの先Javaが進化したとしてテストオブジェクトのみを特別視して
テストオブジェクトからのみprivateにアクセスできるようになったとすると
テストオブジェクトをオブジェクト指向の枠組みで捉えるならば
オブジェクト指向としては破綻してる
Javaは受け入れないだろうね、Microsoftがdelegateを提案したときも
interfaceという仕組みがあるんだからdelegateは邪道だと言って蹴ったからなあ
実益に叶うという理由で根本的なところまで作り変えることができるのは
Microsoftだろうなあ、Javaの前にC#が対応しそうな予感はある
テストオブジェクトからのみprivateにアクセスできるようになったとすると
テストオブジェクトをオブジェクト指向の枠組みで捉えるならば
オブジェクト指向としては破綻してる
Javaは受け入れないだろうね、Microsoftがdelegateを提案したときも
interfaceという仕組みがあるんだからdelegateは邪道だと言って蹴ったからなあ
実益に叶うという理由で根本的なところまで作り変えることができるのは
Microsoftだろうなあ、Javaの前にC#が対応しそうな予感はある
279デフォルトの名無しさん
2020/07/11(土) 11:52:27.04ID:JFnadz6+ いまの言語仕様での最適解は >>5 ですね
これ書いた人は天才だと思いますよ
何気ないことだけれどもコードの隅々にまで神経が行き届いていて
美しく整備されて堅牢なコードです、オブジェクト指向の限界を示したと言って良いですね
これ書いた人は天才だと思いますよ
何気ないことだけれどもコードの隅々にまで神経が行き届いていて
美しく整備されて堅牢なコードです、オブジェクト指向の限界を示したと言って良いですね
280デフォルトの名無しさん
2020/07/11(土) 11:55:21.12ID:0/l6dmQ+ >>248
逆転の発想じゃなくて都合のいいことを信じたい馬鹿の発想だろ
逆転の発想じゃなくて都合のいいことを信じたい馬鹿の発想だろ
281デフォルトの名無しさん
2020/07/11(土) 12:00:30.64ID:Cl4N6Aux テストコードは設計の外にあるものだからクラスの可視性とか直接関係ないだろ。
ふつう、設計書のクラス図にテストクラスを書いたりはしない。
ふつう、設計書のクラス図にテストクラスを書いたりはしない。
282デフォルトの名無しさん
2020/07/11(土) 12:02:06.50ID:wIsoNFzM 書いてもいいかなとは思う
283デフォルトの名無しさん
2020/07/11(土) 12:06:30.88ID:JFnadz6+ >>281
そうなんだよねー
そうなんだよねー
284デフォルトの名無しさん
2020/07/11(土) 12:09:38.93ID:fJlL8BSP >>281
クラス図にprivateメソッドを書きますか?
クラス図にprivateメソッドを書きますか?
285デフォルトの名無しさん
2020/07/11(土) 12:11:12.25ID:JFnadz6+ クラス内を調査してprivateメソッドを列挙して
同クラス内のprivateメソッドをテストするコードを列挙して
カバレッジを計測するツールがあればみんな幸せになれそうですね
カバレッジ計測ツールがprivateメソッドには今の時点で対応してないって
だけでprivateメソッドのテスト自体は >>5 のように書けますから
ツールの開発が遅れてるだけなのかも知れませんね
同クラス内のprivateメソッドをテストするコードを列挙して
カバレッジを計測するツールがあればみんな幸せになれそうですね
カバレッジ計測ツールがprivateメソッドには今の時点で対応してないって
だけでprivateメソッドのテスト自体は >>5 のように書けますから
ツールの開発が遅れてるだけなのかも知れませんね
286デフォルトの名無しさん
2020/07/11(土) 12:12:35.29ID:fJlL8BSP >>285
もしかしてお前カバレッジの意味がわかってないんじゃね?
publicメソッドの中からprivateメソッドが呼び出された時
privateメソッドの行は実行された=カバレッジとして計測される
ってことは知ってますよね?
もしかしてお前カバレッジの意味がわかってないんじゃね?
publicメソッドの中からprivateメソッドが呼び出された時
privateメソッドの行は実行された=カバレッジとして計測される
ってことは知ってますよね?
287デフォルトの名無しさん
2020/07/11(土) 12:15:06.18ID:fJlL8BSP288デフォルトの名無しさん
2020/07/11(土) 12:15:29.92ID:JFnadz6+289デフォルトの名無しさん
2020/07/11(土) 12:16:06.22ID:fJlL8BSP290デフォルトの名無しさん
2020/07/11(土) 12:17:45.08ID:JFnadz6+291デフォルトの名無しさん
2020/07/11(土) 12:18:51.24ID:fJlL8BSP292デフォルトの名無しさん
2020/07/11(土) 12:19:25.54ID:Cl4N6Aux >>284
開発の段階によって違うんじゃね?最終的な設計ドキュメントには書いてるかな。
開発の段階によって違うんじゃね?最終的な設計ドキュメントには書いてるかな。
293デフォルトの名無しさん
2020/07/11(土) 12:19:47.24ID:JFnadz6+ >>291
問題はそこじゃないです、君は僕と仲直りますかということが問題です
問題はそこじゃないです、君は僕と仲直りますかということが問題です
294デフォルトの名無しさん
2020/07/11(土) 12:22:20.99ID:JFnadz6+ 僕はいままで手作業による結合テストだけで生き抜いてきた生粋のブラックボックスマンです
なぜそれが可能だったかというと簡単なプログラムしか書いたことがなかったからです
しかし、最近複雑なプログラムを書く機会があり結合テストだけでは不十分であることを実感しました
以上、僕の近況報告です
なぜそれが可能だったかというと簡単なプログラムしか書いたことがなかったからです
しかし、最近複雑なプログラムを書く機会があり結合テストだけでは不十分であることを実感しました
以上、僕の近況報告です
295デフォルトの名無しさん
2020/07/11(土) 12:23:49.29ID:JFnadz6+ 僕は単体テスト書いたことありますよ >>5 で書きました
カバレッジは計測したことないですけどそれは重要ではありません
カバレッジは計測したことないですけどそれは重要ではありません
296デフォルトの名無しさん
2020/07/11(土) 12:27:04.12ID:fJlL8BSP >>293
しません
しません
297デフォルトの名無しさん
2020/07/11(土) 12:27:47.72ID:fJlL8BSP298デフォルトの名無しさん
2020/07/11(土) 12:28:33.49ID:fJlL8BSP > 最終的な設計ドキュメントはコードから生成するものだからね
クラス図の話ね。クラス図は(唯一?)コードから生成できる。
クラス図の話ね。クラス図は(唯一?)コードから生成できる。
299デフォルトの名無しさん
2020/07/11(土) 12:29:05.33ID:JFnadz6+ >>296
(´・ω・`)
(´・ω・`)
300デフォルトの名無しさん
2020/07/11(土) 12:31:00.81ID:fJlL8BSP 正直、詳細なクラス図は、設計図の中で一番不要だと思ってる。
必要なのはソースコードと完全に一致してるクラス図ではなく
クラス概要図・関連図とでも言うべきだろう
主要なメソッドとそれぞれのクラス関係がわかればいい
目的はなにかを考えればその結論にたどり着くはず
必要なのはソースコードと完全に一致してるクラス図ではなく
クラス概要図・関連図とでも言うべきだろう
主要なメソッドとそれぞれのクラス関係がわかればいい
目的はなにかを考えればその結論にたどり着くはず
301デフォルトの名無しさん
2020/07/11(土) 12:37:31.52ID:Cl4N6Aux >>297
保守する人にとってはあった方がいいと思ってる。
保守する人にとってはあった方がいいと思ってる。
302デフォルトの名無しさん
2020/07/11(土) 12:45:10.61ID:JFnadz6+ 単体テストという言葉の曖昧さがpublic派か、private派かの分裂の原因です
publicメソッドはオブジェクトのインターフェイスなので
publicメソッドをテストすることをインターフェイステストというべきです
オブジェクト指向で、インターフェイスが関わるのはオブジェクトのコラボレーションが行われるときです
一方でprivateメソッドはpublicメソッドが作られるのと同じか、もしくはそれ以前に作られます
publicメソッドが正しく動作することの前提としてprivateメソッドが正しく動作することがあるので
privateメソッドをテストすることをインプリメンテーションテストという言うべきです
privateメソッドを使用するのは同じオブジェクト内のメソッドなので、オブジェクトのコラボレーションとは直接の関係がありません
単体テストと言っても対象のメソッドによって、テストが必要な時期が異なるわけです
privateのテストはクラスが作られる前に行われますし、publicのテストがクラスは作られた後に行われます
あとはコストの話です、結合テストがすべて通るなら単体テストは必要ありませんし本番稼働がすべてうまくいくならテスト自体必要ありません
後の工程で発覚するほど手戻りが大きくなりコストが膨らむので段階を追ってテストしていきましょうというのが基本的な考え方です
privateのテストをすることによってpublicのテストの手戻りが少なくなることはあるんです
privateのテストはやったほうが良いです。
publicメソッドはオブジェクトのインターフェイスなので
publicメソッドをテストすることをインターフェイステストというべきです
オブジェクト指向で、インターフェイスが関わるのはオブジェクトのコラボレーションが行われるときです
一方でprivateメソッドはpublicメソッドが作られるのと同じか、もしくはそれ以前に作られます
publicメソッドが正しく動作することの前提としてprivateメソッドが正しく動作することがあるので
privateメソッドをテストすることをインプリメンテーションテストという言うべきです
privateメソッドを使用するのは同じオブジェクト内のメソッドなので、オブジェクトのコラボレーションとは直接の関係がありません
単体テストと言っても対象のメソッドによって、テストが必要な時期が異なるわけです
privateのテストはクラスが作られる前に行われますし、publicのテストがクラスは作られた後に行われます
あとはコストの話です、結合テストがすべて通るなら単体テストは必要ありませんし本番稼働がすべてうまくいくならテスト自体必要ありません
後の工程で発覚するほど手戻りが大きくなりコストが膨らむので段階を追ってテストしていきましょうというのが基本的な考え方です
privateのテストをすることによってpublicのテストの手戻りが少なくなることはあるんです
privateのテストはやったほうが良いです。
303デフォルトの名無しさん
2020/07/11(土) 12:45:36.89ID:fJlL8BSP >>301
保守する時はコードから生成できるので完璧なのはいらない
だから本当に必要なのはクラス概要図だろう
図としてみたい場合、メソッドすべてがずらずら書かれていても邪魔なだけ
ましてやprivateなんていらない。
図としてみたい場合、本当に見たいのは関連だろう?
保守する時はコードから生成できるので完璧なのはいらない
だから本当に必要なのはクラス概要図だろう
図としてみたい場合、メソッドすべてがずらずら書かれていても邪魔なだけ
ましてやprivateなんていらない。
図としてみたい場合、本当に見たいのは関連だろう?
304デフォルトの名無しさん
2020/07/11(土) 12:46:11.05ID:fJlL8BSP305デフォルトの名無しさん
2020/07/11(土) 12:46:51.38ID:JFnadz6+ 頑張って書いた、これはもう論文と言って良いのでは
僕はプログラミングのテストについて博士号もらっても良いのでは
少なくともこのスレではテストに一番詳しい
僕はプログラミングのテストについて博士号もらっても良いのでは
少なくともこのスレではテストに一番詳しい
306デフォルトの名無しさん
2020/07/11(土) 12:48:09.47ID:JFnadz6+307デフォルトの名無しさん
2020/07/11(土) 12:48:53.15ID:JFnadz6+ 僕はツールを使ったことはないけど、頭を使うからね
308デフォルトの名無しさん
2020/07/11(土) 12:50:19.54ID:fJlL8BSP 288 返信:デフォルトの名無しさん[] 投稿日:2020/07/11(土) 12:15:29.92 ID:JFnadz6+ [26/35]
>>286
僕は単体テストやったこと無い
カバレッジの計測もしたことないからわからない
僕は知りません
>>286
僕は単体テストやったこと無い
カバレッジの計測もしたことないからわからない
僕は知りません
310デフォルトの名無しさん
2020/07/11(土) 12:53:21.76ID:JFnadz6+ 君はレトリックな部分に引きづられる傾向があるから
もう少し客観的に遠目でものを見るようにしたが良いかも
もう少し客観的に遠目でものを見るようにしたが良いかも
311デフォルトの名無しさん
2020/07/11(土) 13:02:59.95ID:JFnadz6+ 僕はJavaしか知らないと言ったけどC#に関するあっと言わせるような知識と考察を垣間見せたでしょ
僕の知性あふれる想像力は君の経験を凌駕する
ツールに習熟して使いこなすのも大事だけど、頭を使って状況を分析して打開する力も大事
僕は後者の方が優れている、君と僕が手を組めば最強になれる
僕と仲直りしてくれますか?
僕の知性あふれる想像力は君の経験を凌駕する
ツールに習熟して使いこなすのも大事だけど、頭を使って状況を分析して打開する力も大事
僕は後者の方が優れている、君と僕が手を組めば最強になれる
僕と仲直りしてくれますか?
312デフォルトの名無しさん
2020/07/11(土) 14:58:15.05ID:0BF0aQZE TDD信奉者がprivateメソッドのテストは必要ないと主張するのは当たり前
TDDは一般的にpublicメソッドを最小”ユニット”として書き始めるから
privateメソッドが作られるのはテストが通る状態を維持したままリファクタリングして
一部をprivateメソッドに抽出した場合だけ
だからprivateメソッドのテストを書く必要がない
privateメソッドじゃなくHelperクラスのpublicメソッド等に抽出した場合も同じ
HelperクラスをpublicなAPIとして公開するのでなければ別途テストを追加する必要は基本的にない
TDDは一般的にpublicメソッドを最小”ユニット”として書き始めるから
privateメソッドが作られるのはテストが通る状態を維持したままリファクタリングして
一部をprivateメソッドに抽出した場合だけ
だからprivateメソッドのテストを書く必要がない
privateメソッドじゃなくHelperクラスのpublicメソッド等に抽出した場合も同じ
HelperクラスをpublicなAPIとして公開するのでなければ別途テストを追加する必要は基本的にない
313デフォルトの名無しさん
2020/07/11(土) 15:11:26.01ID:KCR4lRFo 和田メソッドよろしく!
314デフォルトの名無しさん
2020/07/11(土) 15:36:11.13ID:JFnadz6+ >>312
なるほどね
なるほどね
315デフォルトの名無しさん
2020/07/11(土) 15:55:06.50ID:fJlL8BSP 和田さんの話にも飽きたので、レガシーコード改善ガイドという本の話でもしようか?
https://bmf-tech.com/posts/%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E6%94%B9%E5%96%84%E3%82%AC%E3%82%A4%E3%83%89
・クラスのメソッドがprivateだったとき
・publicメソッドを通じたテストが可能か検討する
・publicメソッドを通じたテストを行うことで実際のコードと同じ方法によるテストが保証できる
・上記が可能でない場合
・そのprivateメソッドはpublicにすべき
・大抵の場合はそのクラスが多くのことをやりすぎている、再設計が必要であることを意味している
・privateメソッドをpublicメソッドにすることについて悩む点
・メソッドが単なるユーティリティで、呼び出し側が気にかけるものでない
→そのメソッドを別クラスに移せないか検討する
→クラスのインターフェースに余分なpublicメソッドがあることは許容可能
・呼び出し側がそのメソッドを直接使った場合、そのクラスの他のメソッドの結果に悪影響を及ぼす可能性がある
→そのメソッドを別クラスに移し、移動先のクラスでpublicにする
・良い設計とはテストが可能であり、悪い設計はテストが不可能
まあ言ってることはほとんど同じなんだけどなw
https://bmf-tech.com/posts/%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E6%94%B9%E5%96%84%E3%82%AC%E3%82%A4%E3%83%89
・クラスのメソッドがprivateだったとき
・publicメソッドを通じたテストが可能か検討する
・publicメソッドを通じたテストを行うことで実際のコードと同じ方法によるテストが保証できる
・上記が可能でない場合
・そのprivateメソッドはpublicにすべき
・大抵の場合はそのクラスが多くのことをやりすぎている、再設計が必要であることを意味している
・privateメソッドをpublicメソッドにすることについて悩む点
・メソッドが単なるユーティリティで、呼び出し側が気にかけるものでない
→そのメソッドを別クラスに移せないか検討する
→クラスのインターフェースに余分なpublicメソッドがあることは許容可能
・呼び出し側がそのメソッドを直接使った場合、そのクラスの他のメソッドの結果に悪影響を及ぼす可能性がある
→そのメソッドを別クラスに移し、移動先のクラスでpublicにする
・良い設計とはテストが可能であり、悪い設計はテストが不可能
まあ言ってることはほとんど同じなんだけどなw
316デフォルトの名無しさん
2020/07/11(土) 15:56:52.92ID:fJlL8BSP https://maku.blog/p/p6awy3z/#%E7%AC%AC10%E7%AB%A0-%E3%81%93%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%83%8F%E3%83%BC%E3%83%8D%E3%82%B9%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93
第10章 このメソッドをテストハーネスで動かすことができません
テストしたいメソッドが private である
・private メソッドをテストしたい場合、そのメソッドは public にすべきである。
・public メソッドにすべきかどうかで悩んでしまう場合、大抵は、そのクラスが多くのことを行いすぎであり、
修正すべきことを意味している(1つのクラスが複数の責務を持ってしまっている)。
・よい設計はテスト可能であり、テスト可能でない設計は悪い設計である。
・この方法は、メソッドを単純に public 化するのと本質的には変わらないので微妙な対応方法だが、リファクタリングすべき箇所の目印となる。
・Java などの言語ではリフレクションによって private メソッドのテストを記述することはできるが、
根本的な依存関係の問題を先延ばしにしているだけである。その種のごまかしをすると、
コードがどの程度悪くなっているのかに気付きにくくなってしまう。
第10章 このメソッドをテストハーネスで動かすことができません
テストしたいメソッドが private である
・private メソッドをテストしたい場合、そのメソッドは public にすべきである。
・public メソッドにすべきかどうかで悩んでしまう場合、大抵は、そのクラスが多くのことを行いすぎであり、
修正すべきことを意味している(1つのクラスが複数の責務を持ってしまっている)。
・よい設計はテスト可能であり、テスト可能でない設計は悪い設計である。
・この方法は、メソッドを単純に public 化するのと本質的には変わらないので微妙な対応方法だが、リファクタリングすべき箇所の目印となる。
・Java などの言語ではリフレクションによって private メソッドのテストを記述することはできるが、
根本的な依存関係の問題を先延ばしにしているだけである。その種のごまかしをすると、
コードがどの程度悪くなっているのかに気付きにくくなってしまう。
317デフォルトの名無しさん
2020/07/11(土) 17:36:03.50ID:KCR4lRFo 北朝鮮行ったことあるか?
日本の町並みには看板があるだろ?
「パナソニック」とか「コカ・コーラ」とかだよな。
北朝鮮でこれに該当するのはスローガンの看板だから。
社名や商品名の看板は一切ない。
「ウリナラをキノコの国にしよう!」←裏の意味は無くそのままの意味らしい。
「苦難の行軍!」
「白頭の革命精神!」
和田メソッドに通じるものがあるよな。
日本の町並みには看板があるだろ?
「パナソニック」とか「コカ・コーラ」とかだよな。
北朝鮮でこれに該当するのはスローガンの看板だから。
社名や商品名の看板は一切ない。
「ウリナラをキノコの国にしよう!」←裏の意味は無くそのままの意味らしい。
「苦難の行軍!」
「白頭の革命精神!」
和田メソッドに通じるものがあるよな。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- 【卓球】早田ひな、「総額100万スられた」「ずっと憧れていたスペインとイタリア…」ヨーロッパ旅行で悲劇 スリ被害を告白 [muffin★]
- 万引きJC「すいません許してください!何でもしますから!」←どうする?
- Perfume・あ~ちゃんの結婚相手の一般男性、吉田カバンの社長と判明 [977261419]
- 自民党議員「高市は先人が築き上げた日中関係を壊した。外務省が謝罪に言ってるが自分で責任を取れ」 [834922174]
- 5時だから窓から5回ちんこ出した
- 「黙らせてやろうと思った」自宅マンション10階から高校テニスコート内の女子生徒目掛けて貯金箱を投擲した女の子、殺人未遂で逮捕 [399583221]
- 岡田克也「軽々しく存立危機事態とか言うべきじゃない」高市早苗「台湾で武力攻撃が発生したらどう考えても日本の存立危機事態」 [931948549]
