拡張機能研究所

おすすめのブラウザ拡張機能をマンガ形式で紹介!

2025/10/15 16:00

テストはコードの正しさを証明しない?ただ「同意」してるだけの話

「テストが通ったから安心!」って思うけど、実はテストはコードの正しさを証明してるわけじゃなくて、コード同士が「こう動くはず」って思ってることが一致してるだけ、という話をゆるく考えてみました。

なんとなく「テストが全部通れば完璧だよね〜」って思ってたけど、よく考えたらちょっと違うかもって気づいたんだよね😳💭

わたしが最近、いくつか「完璧にパスしてるテスト」を書きながらハッとしたことがあってさ。テストって、実はコードが正しいことを証明してるわけじゃなくて、コード同士が「こう動くはず」って思ってることが一致してるだけなんだよね✨

よくある例で言うと、

  • 実装したコードが「こう動く」って思ってて
  • 書いたテストも「こう動くはず」って思ってる

でも、もしその「こう動く」が間違った前提だったら?
テストは全部パスしちゃうけど、実は変な動きのまま…ってことも普通にあるんだよね🥺

つまり、テストが全部グリーンのチェックマークでも、偽りの自信を持ってるだけかもしれないってこと。
これ、なんか怖くない?😱

だから最近はちょっと考え方を変えてみたんだ。
テストって、「正しさの証明」じゃなくて、「これがこう動くはず」っていう意図を固めておくものなのかなって。
要は「もしこの動きを変えたら教えてね!」って守ってもらうための目印みたいな感じ✨

でもまた厄介なことに、その「意図」自体が間違ってることもあるんだよね。
だからテストを書いても、それを鵜呑みにするのは危ない気がする…🤔

わたしはまだまだテストの意味や使い方に迷いながら書いてるけど、
もしみんなだったらどう思う?
テストって「コードの正しさの証明」?それとも「仕様のドキュメント」?あるいは「カオスを防ぐガードレール」?🛤️💡

なんかもっといい付き合い方があったら教えてほしいな〜って思ってるところ✨

ひとことアニメーション表示ON
えっマジで!?テストってそうなの😱

コメント

Ataror of Luis

リリー

「プログラムのテストはバグの存在を示すには有効だけど、不在を証明するのは無理だ」―ダイクストラ

Ataror of Brooklynn

ハンナ

要件通りに動いても要件が間違ってたら、コードや開発者のせいじゃないよね。

Ataror of Kimberly

キンバリー

テストは「こう動くはず」という期待を定義して、それが破られたらすぐわかる仕組みだと思おう。

Ataror of Brian

ミア

テストが通ったから正しいとは限らないし、失敗したから絶対に間違いとも限らない。 期待の変化を教えてくれるフィードバックなんだ。

Ataror of Christian

クリス

だから統合テストや受け入れテストが最重要。 顧客の立場で使って評価すれば、要件が合ってれば正しく動いてるとわかる。

Ataror of Robert

ロバート

良いテストは縛りじゃなくて、正しい方向に導くガードレールみたいなもの。

Ataror of George

ジョージ

「コードが思った通りに動く証明」って違うよ。 テストは自分が思う通りに動くか、要件を満たしてるかを証明するもの。

Ataror of Sadie

サム

ポイントは「自分」なんだ。 AIにテスト書かせてるの?

Ataror of Kingston

グレース

意図を固定するのは自分だけじゃなくて、他の開発者にも分かるようにするため。 要件を守るためのものだよ。

Ataror of Sara

サラ

テストは要件を確認して、複雑なシステムの使い方や動きをみんなが理解できるようにする。 新しいコードベースに触る時はまずテストを動かしてチェックするけど、テストがダメだと先が不安になる。

Ataror of Sophia

マックス

ドキュメントは検証じゃないし、完成した瞬間からズレてることも多い。

Ataror of Luis

リリー

テストは将来の変更で要件が壊れないように守る役割もあるし、ドキュメントが描く動き通りにシステムが動いてるか確かめるもの。

Ataror of Caleb

クロエ

あと、「直さないバグは機能の一部」という話に近いけど、バグが長く残って依存されると後方互換性を保つ必要が出るから、そのバグの挙動にテストを書くことも考えたほうがいい。

Ataror of Brooklynn

ハンナ

常に失敗するテストを放置するのはダメだし、直さないバグは本当にバグなのか怪しい。

Ataror of Robert

ロバート

テストは要件に合わせて書くべき、という長文投稿だよ。

Ataror of Kingston

グレース

テストをひとまとめに見ても意味ない。 論理動作確認、プロジェクト要件適合、内部要件適合、コードパス網羅、回帰検出など目的は色々で、一つのテストに全部求めるのは間違い。

Ataror of Kimberly

キンバリー

あと、失敗するテストを書くTDDを知るといいよ。 今は面倒であまりやらないけど、テストが失敗することを確認するのは大事な考え方で、何を検証してるか考えさせてくれる。

Ataror of Sophia

マックス

この言葉は真実だけど、あんまり意味がないとも言える。

Ataror of Luis

リリー

でもテストが無意味ってわけじゃないよ。 経済学専攻の知識を人生の全てで試せないけど、経済学に限れば十分ってのと同じ。

Ataror of Aidan

エイダン

OPはブログ宣伝のAI作成投稿が一つだけ。

Ataror of Leo

レオ

バグを直したらテストが何個も落ちるのは、テストがそう書かれてるからだよ。

Ataror of Brooklynn

ハンナ

テストは本当に必要な部分だけをチェックして、変更で大事な所を壊してないか確かめるためにあるのに、「99.9%カバレッジ必要」ってバカな考えで無駄に全部の行をテストしすぎて、バグ直すだけでテスト修正が山ほど必要になる。

Ataror of Sadie

サム

そんなにテスト直させて自分の変更が正しいってどう信じろと?

Ataror of Robert

ロバート

テストは機能やその前提、要件を固定するもの。

Ataror of Brian

ミア

後から新人が壊しても、テストが壊れれば真っ先に警告してくれる。

Ataror of Kingston

グレース

でも新人がテストも変えて審査通しちゃったら、チームに根本的な問題がある。 テストはそのうちの小さな問題。

Ataror of Christian

クリス

テストの目的はジョン・カーマックやドナルド・クヌースが作った完璧な証明じゃなくて、新機能開発中に誰かが要件を破ったら教えてくれる警報みたいなもの。

Ataror of Sadie

サム

レビューが悪い、統合テストなし、QAはボタン押すだけならテストは助けにならない。

Ataror of Aiden

エマ

でもテスト無しは断然ヤバい。 経験あるけど地獄だよ...

Ataror of Brooklynn

ハンナ

コードカバレッジ要求はマジで嫌い。 PRのレビューが雑だと、テストはカバレッジ稼ぎのだけの無意味なものになりがち。

Ataror of Kimberly

キンバリー

テストが役立つかどうかは、

Ataror of Kimberly

キンバリー

1. 要件に沿って先にテストを書く(TDD)ことで、自分のコードや仮定をただ肯定するだけじゃなくなる。

Ataror of Kimberly

キンバリー

2. ビジネス側がテストを書いたり見たりできるように、cucumberやgherkinが生まれた。 これでテストとビジネス要件が繋がる。

Ataror of Kimberly

キンバリー

だからテストは最初に書くんだ。 テストが機能の定義で、通れば実装完了。 失敗するテストがもう思いつかなければ完成。

Ataror of Robert

ロバート

あとはテストが仕様を壊す変更をキャッチしてくれる。


PICKUP
関連記事