[解決済み] 良いユニットテストとは?[クローズド]
質問
皆さんの多くは多くの自動テストを書いており、ユニットテストの際にいくつかの共通の落とし穴に遭遇していることでしょう。
私の質問は、将来的に問題を避けるために、テストを書くための行動規則に従っていますか?より具体的に言うと 具体的には 良いユニットテストの特性は何ですか? あるいは、どのようにテストを書けばいいのでしょうか?
言語にとらわれない提案が望まれます。
どのように解決するのですか?
まず、ソースを差し込むところから始めましょう -。 JUnitを使ったJavaの実用的なユニットテスト (C#-Nunitを使ったバージョンもありますが、私はこれを持っています...ほとんどの部分において不可知論です。おすすめです)。
良いテストは 旅行 (この頭文字は十分な粘着性がありません。私は本の中のチートシートをプリントアウトして、これが正しいことを確認するために引っ張り出してきました...)
- 自動 : テストの起動やPASS/FAILのチェックは自動であるべきです。
- 徹底的な : カバレッジ: バグはコードの特定の領域に集中する傾向がありますが、すべての主要なパスとシナリオをテストすることを確認します。テストされていない領域を知るために必要であれば、ツールを使用する。
- 繰り返し可能 : テストは毎回...毎回、同じ結果を出すべきです。テストは制御不能なパラメータに依存すべきではありません。
-
独立した
: 非常に重要です。
- テストは 1つのことだけをテストする でなければなりません。複数のアサーションがあっても、それらがすべてひとつの機能/振る舞いをテストしている限りは問題ありません。テストが失敗するとき、問題の場所をピンポイントで特定する必要があります。
- テスト は互いに依存してはいけません。 - 孤立している。テスト実行の順序を仮定しない。セットアップ/ティアダウンを適切に使用し、各テストの前に「白紙の状態」を確保する。
-
プロフェッショナル : 長い目で見れば、実運用コードと同じくらい(それ以上でないとしても)多くのテストコードがあるはずです。したがって、テストコードのための優れた設計の同じ基準に従います。よくファクタリングされたメソッド、意図を明らかにする名前を持つクラス、重複のない、良い名前を持つテスト、などです。
-
良いテストも実行する 速い 実行に0.5秒以上かかるようなテストは、取り組む必要があります。テストスイートの実行に時間がかかればかかるほど、実行される頻度が少なくなります。開発者が実行の間にこっそり変更しようとすればするほど、何かが壊れれば、どの変更が原因であるかを見つけ出すのに時間がかかるでしょう。
2010-08 に更新しました。
- 読み取り可能 : これはプロフェッショナルの一部と考えることができますが、十分に強調することはできません。テストは、あなたのチームの一員ではない誰かを見つけ、その人に数分以内にテスト中の動作を理解するように頼むことです。テストはプロダクションコードと同じようにメンテナンスされる必要がある - だから、より多くの努力が必要だとしても、読みやすくすること。テストは対称的(パターンに従う)かつ簡潔(一度に一つの動作をテストする)であるべきです。一貫した命名規則 (例: TestDox スタイル) を使用しましょう。テストに付帯する詳細な情報を盛り込まないようにしましょう。
これらを除けば、他のほとんどは利益の少ない作業を削減するためのガイドラインです。例えば、「自分が所有していないコード(サードパーティのDLLなど)はテストしないこと」です。ゲッターやセッターのテストに手を出すな。コスト・ベネフィット比や欠陥確率に目を配る。
関連
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] 末尾再帰とは何ですか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] TDDのためのJavaScriptユニットテストツール
-
[解決済み] ユニットテストとインテグレーションテストの違いは何ですか?[重複あり]
-
[解決済み] データベース駆動型アプリケーションのユニットテストに最適な戦略とは?
-
[解決済み] プライベートメソッドをテストすべきか、パブリックメソッドのみをテストすべきか?[クローズド]
-
[解決済み] ユニットテストはゲッターとセッターのために書くべきですか?
-
[解決済み] Go の testing パッケージを使用してテストのセットアップを行うにはどうすればよいですか?
-
[解決済み] Visual Studioには単体テストのコードカバレッジがあるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MOCKITOとは何か、Junitとはどう違うか
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] NUnit vs. MbUnit vs. MSTest vs. xUnit.net [終了しました。]
-
[解決済み】ユニットテスト初心者、優れたテストを書くには?[クローズド]
-
[解決済み] モッキングフレームワークにおけるモッキングとスパイの比較
-
[解決済み】ユニットテストについて語るときの「DAMP not DRY」の意味とは?
-
[解決済み] "エラー。Karma-Jasmineのユニットテストケースを書いているときに「No provider for router」というエラーが発生しました。
-
[解決済み] ユニットテストとは、どのようなもので、どのように行うのですか?[重複あり]
-
[解決済み] Go言語でのテストに適したパッケージの命名法
-
[解決済み] NUnitのテスト実行順序