クソコードとは何か

■ このスレッドは過去ログ倉庫に格納されています
2021/01/30(土) 17:33:05.78ID:BjNTZWUI
このスレはクソコードとは何かを考えるスレです。

・親クラスが子クラスに依存する処理を持つコード
例...社員クラスを継承した正社員クラスと派遣社員クラスがあり、社員クラスが正社員クラスの知識を持つ状況

・staticにするべきではないモデルにまでstaticにする人
例...社員クラスのメソッドを全てstaticにしたり、社員クラスにシングルトンパターンに相応するものを適用する人

等、クソコードを見た時に「あっ、これクソコードだ」って認識する根拠を挙げていきましょう。
2021/02/18(木) 14:03:58.21ID:d72Uy3wC
>>406
>なんで再利用できないクラスがクソなのかわかる?

その考え方がペラいって言ってんのにわかんないやつだな
これ全部同一人物じゃなきゃありえんな
2021/02/18(木) 14:20:32.85ID:nrHJXjYu
>>407
その考えとは?わからないから教えてくれや
2021/02/18(木) 14:52:32.67ID:nrHJXjYu
>>407
まさか再利用できないクラスが普通だとか思ってる?流石にそれはレベル低すぎてその発想はなかったけど、そういうこと?

たのむから伝わるように文章を書いてくれ
お前の文章こそ情報量がない
あるのは相手にマウントを取ろうとする意気込みだけ
2021/02/18(木) 15:50:41.18ID:bN9e6Enp
>>408
一般常識を持たず
自分の半径5cmの出来事の一側面だけを見て
コンテキストを無視して一般化しようとする考え方
2021/02/18(木) 15:59:27.62ID:nrHJXjYu
>>410
一般常識?ID変えながら、こんな時間に2chやる俺らが?w
発言元からコンテキスト境界を読み取れずに他人を批判するお前こそ薄ペラ野郎だわ
2021/02/18(木) 17:08:42.38ID:kV6+8waU
まず再利用性とは何かをまるで理解していない
アプリ全体の一箇所でしかインスタンス化されないからといって再利用性が無いとは言わない
再利用には様々な形があるにもかかわらずインスタンス化される箇所の数という著しく狭い一つの側面だけしか見えていない

そもそもインスタンス化される箇所の数と、そのクラスがクソかどうかとは何の関係も無い
ないない尽くし
2021/02/18(木) 17:23:27.31ID:kV6+8waU
クラスの再利用性の度合いが低ければそのクラスがクソかと言えば全くそんなことは無い
クソがどうかは再利用性の度合いとは関係ない

クラスベースのOO言語を使ってるならどんなアプリでそのアプリ特有の処理はそのアプリの用途に特化したクラスで実現する
当然、一般的に言うところのクラスとしての再利用性は無い

それだけでクソだと言い出したらGoogleが作るものでもMSが作るものでも世の中のアプリはほぼ全てクソの塊
414デフォルトの名無しさん
垢版 |
2021/02/18(木) 17:49:20.06ID:HwjlNY0O
ジョブがやたら多いシステムきつい
2021/02/18(木) 17:53:10.20ID:EQNcYV6O
>>413
> クラスベースのOO言語を使ってるならどんなアプリでそのアプリ特有の処理はそのアプリの用途に特化したクラスで実現する
> 当然、一般的に言うところのクラスとしての再利用性は無い

そんなの当たり前じゃん
殺人事件が起きて殺人は駄目だと訴える遺族の前で死刑囚は殺してはいけないと言うのか?とか言い出すようなもの

それくらい察してやれ
2021/02/18(木) 17:59:21.72ID:EQNcYV6O
って、アプリ特有ってまさか業務特有の処理とかじゃないよな?
フレームワーク特有だったらわかるけど
2021/02/18(木) 18:07:15.94ID:TPOb/Xi+
組込してるけど、USBクラス、SDカードクラスのインスタンス化が封じられていて、しかもUSBクラスの中にMCUのポートに依存する処理が書かれてたらクソだと思う

なんで、回路構成変わるたびにいちいちUSBのロジックを実装しなきゃなんねーんだよクソがって言いたい
2021/02/18(木) 18:40:52.03ID:uVIafMoc
>>417
なんで修正しないの?
staticなメソッドとメンバーのみを使うとしても必要なところを入れ替えるように作れるでしょ
419デフォルトの名無しさん
垢版 |
2021/02/18(木) 18:56:01.13ID:z09WEaLy
トイレ行っていい?
2021/02/18(木) 19:02:24.32ID:TPOb/Xi+
>>418
文面だと伝わりづらいと思うからコード書くけど
USBポートが2ポートある場合

USB usb1 = new USB(port1)
USB usb2 = new USB(port2)

で済むのに、インスタンス化を封じられたら

USB1 usb1 = USB1.getSingleton()
USB2 usb2 = USB2.getSingleton()

みたいにUSB1クラス、USB2クラスを自分で定義しないといけなくなるからやめた方がいいよって話
なぜかというと、USB1と2に同じコードを書かないといけないし、もし、USBの処理に仕様変更が生じると、今後はUSB1と2を変更しないと駄目だから
面倒でしょ?2個程度なら...という油断は命取り

>>419
ご自由に
2021/02/18(木) 19:30:22.47ID:unHOG45Z
>>395
それで?
仕様書通りであると説明できたん?
2021/02/18(木) 20:13:35.08ID:qR1rH4Mn
>>421
何度も言ってるが
仕様書通りのテストコード(or テスト手順書)になってるかはレビューで確認する
その点ではテストコードも手動テストの手順書も差はない

差があるのは
テストコードの通りにコンピュータが実行したか(実行したと保証される)
テスト手順書のとおりに人間が実行したか(実行したと保証されない)
この点で、手動テストは劣っている

>>421
なにか言い返す言葉があるならどうぞ
2021/02/18(木) 20:54:43.88ID:Tudb2iMs
>>420
インスタンス化しとるやーん

USBに共通する処理をコンポジションで切り出してれば1箇所の修正で済むよね

シングルトンにするメリットがある前提ならそのコードの形だけでクソコードだとは思わないな
2021/02/18(木) 21:58:25.07ID:unHOG45Z
>>422
え?コードレビューの他にテストコードのレビューやるの?
何がよかったんだっけ?
425320
垢版 |
2021/02/18(木) 22:15:10.24ID:1R5qg2DM
反応してくれるやつがおっただけでも嬉しいわ(ヽ´ω`)
2021/02/18(木) 22:24:23.85ID:1R5qg2DM
>>412
ワイはそれをあると言っている
インスタンス化された個数こそがそのクラスの価値だと言っている
抽象クラスやインタフェースについてはこの主張では扱わない
アホらしいと思うのなら聞き流してくれていい
2021/02/18(木) 22:27:00.40ID:1R5qg2DM
>>404
単体テストがどうのこうのってもう心底どうでもいいよなw
俺もそれの結論について興味が持てない
2021/02/18(木) 22:30:19.90ID:1R5qg2DM
>>420
インスタンス化を封じて苦しくなってくるのあるよなw
最初のうちはそれでよさそうに思えるんだけどね
2021/02/18(木) 22:55:26.26ID:GanGg3no
>>426
インスタンス化された個数と
インスタンス化される箇所の個数は全然違うと思うんだが?

コード上では1箇所でしかインスタンス化されないがリクエスト毎にインスタンス生成されるクラスとか
2021/02/18(木) 23:10:12.48ID:1R5qg2DM
ごめんね下のほうの意味が本来言いたかったこと
実行時のことは考えず単にコード上での評価
2021/02/18(木) 23:35:55.78ID:lCP5Fc9O
>>430
そうすると何か特殊な前提を置いてるかインスタンス化する箇所という言葉の定義が全く違うかだな

インスタンス化がnewしたりファクトリメソッドを呼ぶ事だとしたら
Webでもモバイルでもデスクトップでもコード上の1箇所でしかインスタンス化されないクラスが結構な割合で存在するほうが普通

わかりやすいところで言えばコントローラクラスやアプリケーションクラス
432デフォルトの名無しさん
垢版 |
2021/02/19(金) 02:02:43.04ID:C4/TpWTT
>>420
USB io = USB.create(port1)で物理的なUSBが重複する可能性があり、排他制御が必要ならそうすると思うよ。
USB io = new USB(port1)で個別にインスタンス作って、マルチスレッド・マルチプロセスで動くなら必要ないけど
自然的なコンストラクタでメンバー変数は初期化されることに意味があるだけで、それ以外の構築初期化を
しようとしたらファクトリーメソッドが必要になる。もちろんnewの後にメンバーメソッドを毎回自分で
呼び出して初期化しても良いわけだけど、ま、言いたいことは確かに安易な設計でシングルインスタンスは
避けるべきだけど、近代的なクラス型の言語によるメンバーの隠蔽とファクトリーメソッドは無関係
2021/02/19(金) 02:35:10.05ID:lLyiEvh3
>>424
> え?コードレビューの他にテストコードのレビューやるの?

当たり前だろ
お前コードレビューをするのは当然として、
お前、テスト手順書のレビューしないのか?
だからお前がやったテストはいつも抜けがあるんだろうがw
すいません、テストが漏れてましたじゃねーよ、いっつもいっつも
2021/02/19(金) 02:43:27.34ID:3DiTZZbV
>>433
じゃあテストコードのテストもいるよね?
2021/02/19(金) 02:59:07.17ID:lLyiEvh3
>>434
お前の真似をすると
テスト手順書のテストもいるよね?

当然、答えは「はい」になるよねw
2021/02/19(金) 06:52:05.98ID:zJ55MHzK
>>434
いらない、レビューで足りる
理由は>>255に書いてある
2021/02/19(金) 07:43:49.70ID:tQjoVXv/
>>435
え?設計書のテストが?
テストコードってもんにしたから特有の手順が増えちゃってるんだろ
2021/02/19(金) 07:48:43.11ID:tQjoVXv/
設計書
→コード→テスト
→テスト手順書→レビュー
で済むはずが
設計書
→コード→テスト
→テストコード
→レビュー
→テスト
になってるんだろ
テストコードがソースコードである以上テストしないわけにはいかんだろ
439420
垢版 |
2021/02/19(金) 07:59:08.25ID:PldOIixM
>>423
伝わりにくくてすまん
紛らわしい言い方だったか

>>428
分かってくれてありがとう
440デフォルトの名無しさん
垢版 |
2021/02/19(金) 08:24:00.57ID:IIFo83yT
クソ言語とは
PHP、Swift、Python
JavaScriptも昔はかなりクソだったが完全に復活した
Obj-CはSwiftに取って代わられることは無かった、コード効率が良すぎる
2021/02/19(金) 08:51:26.62ID:f7HYpZpv
>>438
レビューのあとの「テスト」ってビルドボタンを押す度に走るテストのこと?
それとと、gitとかにcommitする度に走るテストのこと?

作業をカテゴリ分けすると増えているように見えるだけで、作業量は減っているように見えるが

途中からこのスレ来たから、流れがわかっていない
2021/02/19(金) 08:52:42.54ID:hd6MOPhf
>>441
おk
半年Romれ
2021/02/19(金) 08:54:08.49ID:f7HYpZpv
>>438

あと、よく見ると手順が間違ってる
> 設計書
→コード
→テストコード
→レビュー(?)
→テスト(自動化)
if 自動化のテストにすべて合格したら
→結合テスト以降のテスト
だよ
2021/02/19(金) 09:01:26.16ID:f7HYpZpv
>>442
あっ(察し)
失礼しました(退場)
2021/02/19(金) 10:36:32.08ID:zJ55MHzK
>>438
> 設計書
> →コード→テスト
> →テスト手順書→レビュー
もうこの時点で意味不明w
普通は
1) 設計書 ⇒ コード(⇒ レビュー)
2) 設計書 ⇒ テスト手順書 ⇒ レビュー
3) 手動テスト(工数大)
だろ
で、自動テストなら
1) 設計書 ⇒ コード
2) 設計書 ⇒ テストコード ⇒ レビュー
3) 自動テスト(工数ほぼ "0")
要するにテストコードは計算機に対するテスト手順書だから手間は変わらんよ
むしろプログラマーだと仕様書よりコード書く方が楽と思う奴もいっぱいいるしw
あとどっちもテストと書いてるけど手動テストと自動テストでは工数が全く違うから同じ「テスト」という言葉でごまかすなよ
なおテストコードはデバッグが必要と主張するなら>>255にちゃんと反論しろ
446デフォルトの名無しさん
垢版 |
2021/02/19(金) 10:53:49.57ID:IIFo83yT
テストコードは暇なら書くレベルの価値しかない。
テスト仕様書に漏れがない事が最も重要。
実データで実動作で検証するのが納品条件。
2021/02/19(金) 11:02:12.72ID:8jP4Tkvg
実機繋がってないと無意味なテストにしかならんの多いのよな
2021/02/19(金) 11:29:00.52ID:RipgTCDE
>>438
> テストコードがソースコードである以上テストしないわけにはいかんだろ
だからいらない
馬鹿なのかな?
テストコードのテストなんてお前したことないだろ?
世の中の誰もしたことないわw
そんなものありはしないんだから


> 設計書
> →コード→テスト
> →テスト手順書→レビュー
> で済むはずが

だめでしょ?レビューが正しいかをテストしなきゃwww
2021/02/19(金) 11:45:25.31ID:3OrjGIvj
>>448
まて、そのレビューは本当に大丈夫なのか?
レビューが適切かどうかも検証しよう(名案)
2021/02/19(金) 11:47:16.24ID:3OrjGIvj
間違えた
レビューが正しいかのテストが適切かどうかもテストしよう
だった
2021/02/19(金) 11:50:29.27ID:RipgTCDE
レビューした結果もちゃんと記録しないといけないからな
レビューの結果をドキュメントとして残すなら
そのドキュメントのレビューも必要になる
当然の帰結だ
2021/02/19(金) 11:52:44.73ID:wrciXaB+
単体テストの範囲でこんな凝った仕組みいらんよ
一番やりたい結合は今度セッティングのが時間かかるんで
2021/02/19(金) 12:21:07.58ID:RipgTCDE
「結合テストはすごく時間がかかる」

え?なんで?

「単体テストでやるべきことも
全部結合テストで手動でテストやってるからさ!」

↑馬鹿じゃね?
2021/02/19(金) 12:30:35.44ID:F46jrkhY
敢えて皆と同じくらいテストコードの書き方を知ってる自分が弁護するけど

class クソクラス
 頻繁に仕様が変わるメソッド
  クソコード
 不具合が生じると仕様が変わるメソッド
  クソコード
 思考停止でプライベート変数のgetter
  思考停止の変数リターン
 思考停止でプライベート変数のsetter
  思考停止の変数代入

みたいなクラスを単体テストするところを考えてみよう

他の皆の無駄じゃない主張は疑いもなく事実だろうけど、テストコードは無駄という主張はある意味では事実なのだと思う

これは...扱うコードの質の違いが生んだ悲劇
そう、事故だったんだ

テストコード厨呼ばわりについては...うん(諦め)
2021/02/19(金) 12:34:28.76ID:RipgTCDE
>>454
テストコードが無駄なケースでは
手動テストも無駄になる

頻繁に仕様が変わるメソッドがあったとして
手動テストをしたら時間の節約になるとでも?
ああ、テストしないってことね(笑)

プロの仕事じゃねーよ
2021/02/19(金) 12:43:07.19ID:F46jrkhY
>>455
> ああ、テストしないってことね(笑)
たぶん、彼の言う手動テストは俺らの言う「テストしない」のレベルだと思う
ややこしいのは主張している本人は「テストしたつもり」になっている点
2021/02/19(金) 12:54:53.31ID:F46jrkhY
>>455
TDD前提で語ってた
クソコードのテストコードを書こうとしたら、直ぐに設計は是正されないとだぞ
2021/02/19(金) 13:02:30.29ID:F46jrkhY
まず、クラス設計する際にテストコードみたいなコードを書いたりしない?
クラス利用者から見たクラスの使い勝手を確かめる意味で

で、何度も試行錯誤して、素晴らしいクラスモデルができたらテストコードを書いて、その後、実装をして...
この作業プロセスができていないから単体テストは無駄だという主張が生まれたと思っていた
459デフォルトの名無しさん
垢版 |
2021/02/19(金) 13:19:31.43ID:IIFo83yT
>>458
abstractクラス<T>から頭の中で書いてるよ、それで十分
テストコードが必要なケースは、mockableAPIから全ケース流す時くらい、実データだとめんどくさいから
2021/02/19(金) 14:03:37.42ID:RipgTCDE
>>456
そうなんだよな。テストしたつもりになってるんだろうなって思うよ

「手動テストでテストできる!
リリース前に、人を大量に集めて人海戦術でテストするんだ!」

なんて言われたら、バグ出たらどうするの?って聞きたくなる

「バグを直して(そこだけ)テストするだけじゃないか!」っていうだろうな
たぶん、そこだけしかテストして無くて全体の再テストをしないだろう
最後にもう一回テストすればいい? いやいやバグはなくならないんだから
最後なんてありえないだろ

時間がないときは小さいバグは運用でカバーとかいってリリースするんだろ?
そしてあとから修正するんだろ?再テストするだろ?
何回小さいバグを修正する?そのたびに人を大量に集めて人海戦術でテストする?
どんだけ時間とコストがかかるんだよ?

たぶんその答えは
「小さいバグの修正なんだから、たぶん他に影響してないはずだ。動いていればヨシっ」
なんだろ?

プロの仕事じゃねーよ

自動テストしてるプロジェクトでは、一日数回のリリースと全テストを行うことだってある
このスピードに手動テストでは追いつけない
461デフォルトの名無しさん
垢版 |
2021/02/19(金) 14:39:19.79ID:IIFo83yT
自動テストじゃほとんど何もできない。
日本語/フォント間違えてるとか色違うとかカクカク動くとか。
2021/02/19(金) 14:45:40.28ID:fG69+Z1U
しばらくぶりに見たプロジェクトの自動テストが通らないことぐらい
開発現場じゃ常識なんだよ!(パプリカ:DCmini)
2021/02/19(金) 14:48:09.77ID:RipgTCDE
>>461
> 日本語/フォント間違えてるとか色違う

それはクリティカルなバグじゃないですねw
正しくデータが処理されることをテストしたことありますか?
どうやってやりましたか?
2021/02/19(金) 14:49:14.42ID:RipgTCDE
>>462
> しばらくぶりに見たプロジェクトの自動テストが通らないことぐらい
それを手動テストして動いたら面白いなw

まあよくあるよね。本当はバグってるのに
表面上は動いてるように見えちゃう
だから手動テストは駄目なんだよ
465デフォルトの名無しさん
垢版 |
2021/02/19(金) 14:55:40.06ID:IIFo83yT
>>463
直接変数に値入れればいいじゃん
コード変わったらまたやる
毎回テスト回すとか無駄
2021/02/19(金) 15:01:38.27ID:RipgTCDE
直接変数に値入れるとは?
まさかデバッガ経由でやってんの?
デバッガを使うと挙動が変わるからテストにならない
2021/02/19(金) 15:01:59.28ID:RipgTCDE
テストは本番用ビルドでやるのが鉄則
468デフォルトの名無しさん
垢版 |
2021/02/19(金) 15:03:42.70ID:IIFo83yT
>>466
mockかデバッガーで十分です
469デフォルトの名無しさん
垢版 |
2021/02/19(金) 15:06:22.55ID:IIFo83yT
客を自動テストして欲しいわ、言うことコロコロ変わるからw
470デフォルトの名無しさん
垢版 |
2021/02/19(金) 15:20:06.23ID:LoU7pdW5
判定させたら99.99%がクソレスだった件
2021/02/19(金) 16:24:05.46ID:RipgTCDE
>>468
mockやデバッガーでどうやって
何千ものテスト項目を実行するの?w
2021/02/19(金) 17:47:03.42ID:IFuFAMn0
要件を確定させずレスバってプログラマどころじゃないな
しかも平日の昼間から真っ赤ってまともじゃないの自己紹介しているようなもの
2021/02/19(金) 17:47:13.51ID:ACLJAhWF
自分はアプリ開発と組み込み開発の経験があるけど、Web開発って単体テストやらんの?

Webは、Python+Django、node、古いPHPの入門書を読んだ程度にしか触れないからリアル開発事情に興味がある(開発経験が無い)
2021/02/19(金) 18:57:54.50ID:Clj7wgUu
web開発ってユーザーが入力欄に何を入れてくるかの組み合わせが
膨大になるから、テストも困難になるな。
2021/02/19(金) 18:58:00.55ID:RipgTCDE
単体テストをやらないのはSIerだよ

ああ、いや、エクセルに単体テスト報告書を書くとか
そういう意味でなら単体テストをやってるよw
テストコードを書かない手動テストのことをSIerは単体テストって言ってる
2021/02/19(金) 19:01:29.71ID:RipgTCDE
ああ、わかりやすいのが見つかった。これがSIerのいう単体テスト(手動テスト)

【Web系最高って言うけと゛本当なの?】siの5次請けから離脱したエンシ゛ニアか゛話してみた

https://www.slideshare.net/yuukinakajima794/websi-67526868#8
8. てすとほうほう winshot、エクセル、人間 スクショ一枚取り忘れただけでも
テストがやり直しになるプレッシャーと進捗表.xls との戦い テスト結果.xlsが
不要なのでめんどくささがない 開発者が目で見ておk

https://www.slideshare.net/yuukinakajima794/websi-67526868#12

12. ソース修正とかテスト バグが出た!→単体テスト障害報告書.xlsを書く→
必要に応じて単 体テストケース.xlsを直す→上司にお話して単体テスト障害報告
書を確認して貰う→テストをする バグが出た!→直す→必要に応じてテストパターン を
増やす→テストする あまりに、あまりにめんどくさい、進捗表.xlsには障害数も書くのでバグゼロは困るらしい
477デフォルトの名無しさん
垢版 |
2021/02/19(金) 19:04:03.28ID:uscWUjsm
田中勇←口だけテストコード大好き変態老人
技術力はゼロwww
2021/02/19(金) 19:19:27.73ID:2/3+b4qC
>>476
まあそういうテストが必要なフェイズは確かにあるが、その前に自動テスト入れるべきではある。
2021/02/19(金) 19:33:50.76ID:RipgTCDE
>>478
どちらにしろ手動テストするなら
全部、手動テストでやっても同じ
テスト時間も変わらない

と思ってるらしいよw
2021/02/19(金) 20:27:04.98ID:ACLJAhWF
>>476
URLの闇が深すぎて怖い
2021/02/19(金) 20:45:17.65ID:B4GlCKY0
>>473
Ruby on Rails では、minitest/RSpec という2種類のテストフレームワークがある。
単体/システムテストの2つある

Rails 6 からは、環境を丸ごとコピーして、並列テストもできる

TDD では、テストが仕様書。
Excel で管理したりしない
2021/02/19(金) 21:59:46.75ID:zJ55MHzK
>>454
それ扱うコードの質の違いが問題じゃないだろ
テストコードの変更が必要になるのは「頻繁に仕様が変わる」のが原因で当然手動テストでもテスト手順書の変更が必要になるだろ
根本がわかってなさ過ぎ
2021/02/19(金) 22:05:12.15ID:ACLJAhWF
>>481
おお、なんかスピード感あって楽しそうだな
TDDいいよね!本業の組み込み自社開発でも導入した
何で長年気が付かなかったのか不思議なレベル

この手のノウハウは組み込みより圧倒的にWebの方が進んでるから、俺にとっては上位レイヤーの開発ノウハウが新鮮に感じる
2021/02/19(金) 22:07:51.51ID:uYMrqqBZ
やっぱり単体テストでそこまで用意する意味ねぇって
時間がかかってるのデバイス周り出し及びじゃねぇよコレ
2021/02/19(金) 22:08:44.56ID:/Wn3Sj0O
結合入ってから頑張ろうよ
486481
垢版 |
2021/02/19(金) 22:31:54.64ID:B4GlCKY0
伊藤淳一などが翻訳してる「Everyday Rails - RSpecによるRailsテスト入門」は有名な本

テストに関しては、ソニックガーデンの伊藤淳一の動画・Qiita などを読めばよい
2021/02/20(土) 00:24:53.76ID:pHrkUBl9
>>484
デバイスはモックを使いましょう
ソフトウェアのテストをするのに
本物のデバイスは必要ありません
2021/02/20(土) 01:40:17.33ID:LGEbkfhl
>>487
いや、それだとレスポンスも早過ぎるしリトライも起きないから何のテストにもなってない
あと何よりデバイス出ないから返ってきて欲しい値を手動で設定するとか苦痛過ぎる
ソフトでset○○って入れた値が次のget○○に反映されるみたいなとこまで作れないやろ
2021/02/20(土) 01:44:19.60ID:pHrkUBl9
何のためにモック使ってるんだ?
素人かなぁ

レスポンスの時間を自由に変えられるのがモックの利点だし
リトライする状態を自由に再現できるのもモックの利点だし
デバイスから帰ってきてほしい値を自由に設定できるのもモックの利点

うーん、わかってない人が、意味不明な答えをしてる状態だw

まずそもそもモックはお前が行った問題点を解決するための
ものだということを知りましょう
2021/02/20(土) 01:45:23.84ID:pHrkUBl9
まあ正確にはスタブだけどね
みんなごっちゃにして使ってるから俺もごっちゃにして使ってるw
2021/02/20(土) 01:48:18.86ID:mqOV0mvT
組み込みでは単体テストよりも実機テストが鬼門
どのプロジェクトでも最初は自動化を夢見ても、実現できたプロジェクトは少ない

自動化ぶん回してたら発熱して煙出てたり電源不足で再起動しちゃったり他の開発機器のノイズ拾ってコケまくったり・・・
492デフォルトの名無しさん
垢版 |
2021/02/20(土) 01:54:30.04ID:MdDLRkGY
MartinFowlerのMocksAre n't Stubsなど、テストでのモックとスタブに関するさまざまな記事を
読みましたが、それでも違いはわかりません。モックvsスタブ=行動テストvs状態テストと言われ
ますし、ライフサイクルが違うと言われますが、それでも違いはわかりません。
先輩がいつもモックモックモック言うので、すこし嫌になりました。
2021/02/20(土) 02:12:02.30ID:pHrkUBl9
>>491
組み込みのハードの部分が多いのかソフトの部分が多いのか
ハードの部分が多いなら、そりゃソフトウェアのテストじゃなくてハードウェアのテストだ

だが組み込みでもソフトウェアは多いだろ?
そっちはハードウェアなしでテストできる

めんどくさいからソフトウェア部分も
ハードウェア使ってテストするんだよ
時間がかかってしょうがない

っていうのならソフトウェア部分も
ハードウェア使ってじゃないとテストできないのなら
そりゃそうだろうよとしかw
2021/02/20(土) 02:24:18.76ID:ZkUFennS
>>489
いやーやめた方がいい

値1つとってもそう単純じゃない
例えばある値を3.223から増加量0.005で7まで変化させたいと
その時6.997で装置は処理を止めましたと
これはソフトからしたらクソでも多分バグじゃねぇんだわ
じゃあ、増加量0.001にしたら7になるのかと?
今度は6.995で止まったと
まだ足せんじゃん足せよゴミカスと言いたいが
デバイスのハード的なもんを無理矢理デジタルに直してるようなのはこんなのが限界のときあるんだわ
精度も条件によって変わったりね
多分ハードの値って一つ一つこういう変な癖があって何でもかんでもうまくはいかないと思うよ

ってなるとやっぱり重要なのって結合なんだよね
デバイスと絡んだ値があるとこはすんなりいかないことが多い
2021/02/20(土) 02:32:10.26ID:mqOV0mvT
>>493
落ち着け、後半日本語めちゃくちゃだぞ・・・
2021/02/20(土) 02:33:03.30ID:56yjs2OO
>>494
それ実機でテストする段階にならないとわからないことなの?

COCOAみたいなのもあるし実機テストは必須だとは思うが
それ以前にインターフェース仕様に準じたテストしといたほうがよくない?
2021/02/20(土) 02:35:06.23ID:/l8xxO7y
>>496
そこに金くれる会社ねーな
よくあることだし
でもやってみないと具合がわからん
2021/02/20(土) 02:37:16.94ID:3iHtf1vt
>>492
マーチンさんはその記事を出すのが遅かったよねw
モックという言葉が広く普及してしまった後だった
rspec界隈?ではテストダブルという言葉を使って言葉を整理しようとしたが
一部でのみ使われて広く普及していない

俺的には、ダミーの値を返すオブジェクトがスタブ
スタブの反対はスパイで、スパイは呼び出された回数や引数を記録しておいて
あとで検証できるもの
スタブとスパイをあわせてモックとしたほうが良かった気がするな

世間的には、スタブ vs モック(スパイはモックの高機能版)と考えればいいよ
スパイは後から検証できるように便利なオブジェクトになってるが
モックはそんな機能がない、もしくは低機能。
だから「テスト対象のコード」から「モック」を呼び出した時に渡されたデータの検証ぐらいしかできない
またスパイもモックも結局はダミーの値を返さないとテスト対象は動かないので多くの場合スタブの機能も兼ねてる

スタブ・・・テスト対象がスタブを呼び出し、スタブはダミーの値を返すだけ
モック・・・テスト対象がモックを呼び出し、その内容をテストする+スタブ(必須ではないが多くの場合必要)
スパイ・・・テスト対象がスパイを呼び出し、その内容を記録しておいて後からテストする+スタブ(必須ではないが多くの場合必要)

テストダブル・・・上記の総称
2021/02/20(土) 02:41:28.39ID:WavZWbYg
>>494
> いやーやめた方がいい
やめた方がいい理由は?

> 値1つとってもそう単純じゃない
> 例えばある値を3.223から増加量0.005で7まで変化させたいと
> その時6.997で装置は処理を止めましたと
> これはソフトからしたらクソでも多分バグじゃねぇんだわ

バグじゃないなら、その値でテストするだけのこと
お前は、6.997でテストしたか? 6.995でテストしたか?
してないよな。だって装置が都合よくそんな値で止まってくれないんだから

ハードウェアを使って手動でテストすると 6.995 や 6.997 で止めるのが難しいから
テストの時間がかかる。そういう場合にモックを使うと 6.995 や 6.997 の値を作り出すことができる

単体テストであればデバイスの値を自由に作ることができる
2021/02/20(土) 02:44:52.28ID:WavZWbYg
>>497
> でもやってみないと具合がわからん

やってみれば具合がわかるだろ
そしたらそれをテストコードにするだけだろ

おまえはやってみて、その場でコード修正して終わりか?
リグレッションテストはしないのか?当然するよな

別の機種のための修正が、別の機種で不具合を起こす場合
Aでうまく行かない→修正
Bでうまく行かなくなった→修正
Aでまたテストして→修正
Bでも大丈夫かな?→修正

って機種を何度も変更して、同じテストを何度も「手動」で繰り返すんだろ?

テストコードにしてれば、この繰り返しを
自動でできるって言ってるんだよ
501デフォルトの名無しさん
垢版 |
2021/02/20(土) 06:09:56.09ID:Mzr1Xumx
>>477
それ誰?
2021/02/20(土) 09:25:13.41ID:EvFy/+SD
>>499
ええ、いくつ値あると思ってんねん
その一つ一つにデバック用動作つけんの?無理っしょ?
2021/02/20(土) 09:49:08.60ID:xSEyIqRP
>>502
はっきり言えよ。たくさん値があって大変だから
手動テストではテストしませんって

テストしてないんだろ?いくつ値あると思ってんねん(笑)
2021/02/20(土) 09:55:55.93ID:O4DpQFuV
クソコードとは何か
2021/02/20(土) 10:00:30.75ID:xSEyIqRP
テストが手動でテストをするのに膨大な時間がかかるコード
2021/02/20(土) 10:03:35.37ID:EvFy/+SD
>>503
え?モックとか言うやつの話っしょ?
■ このスレッドは過去ログ倉庫に格納されています