中間で単体テストを書く


14

単体テストは100%ですか、それともまったく関係ありませんか?

私は古いプロジェクトを閲覧し、機能の追加を開始しました。今回は単体テストです。ただし、単体テストのない過去のコンポーネントを再利用する場合、これは最終的には価値がありませんか?

以前のすべてのクラスの単体テストを作成する必要があり、気にする必要はありませんか、または追加する新しいものの単体テストのみを作成しても大丈夫ですか?

回答:


14

単体テストは、なしよりも優れています。だから、それは全か無かの取引ではありません。

あなたの場合、テスト駆動開発は標準ではなかったので、テストがどのように役立つのか不思議に思うでしょう。

あなたが書く将来のコードが(現在の)機能を壊さないことを保証したい-そして、それはあなたのサブケースが役に立つ場所です。よく書かれたテストに合格した場合、ほとんど何も破損していない可能性があります。一緒に来る次の開発者は、テストとドキュメントに感謝します。

まずは、階層化されたアーキテクチャを十分に分割し、データアクセス層を選択し、テストを上(UI層に向けて)行う場合です。プロジェクトにドメインモデルがある場合、TDDのほとんどの候補は、ほとんどのロジックを持っている可能性が高いためです。サービス(またはビジネスロジック)層がドメイン/データアクセス層を呼び出すだけの場合、TDD方式でサービス層を実行しても意味がありません。これらはふわふわしたテストであり、あまり価値がありません。

エマのようなコードカバレッジツールに追加-全体的なテストカバレッジの改善を着実に監視できます。


3

私は非常に大規模なコードベースに取り組んできましたが、最初は単体テストがありませんでした。数年後、いくつかのプラクティスに従うことで、ほとんどのコードベースがテストでカバーされました。

すべての新しいコードには単体テストが必要です。

変更されたすべてのコードには、単体テストを追加する必要があります。

テストを壊さずに安全に古いコードに追加した方法は、主に次の基本的なアプローチを使用することです。

機能を変更する必要があるコードの小さなセクションを選択します。

  1. コードを囲むシステムレベルの統合テストを作成してみてください。このレベルでのテストは組み合わせが複雑であるため、これらのテストは「スモーク」テストを形成するだけで、大きな間違いを拾います。
  2. 変更するコードをテストできるようにするために必要なインターフェイスを紹介します。信頼性の高い非常に小さな変更のシーケンスで構成されるリファクタリング手法を使用してください。可能な場合はツールサポートを使用してください。これを行うには、たとえば、変更するメソッドを独自のオブジェクトに移動/抽出します。変更を定期的にチェックインして、元に戻すことができます。リビジョン管理履歴を確認して、変更を行った方法を定期的にピアレビューします。

    テストの追加を妨げている依存関係を解消するために必要な変更を最小限に抑えるようにしてください。

  3. 変更するコードの機能を可能な限りカバーするテストを作成します。定期的にチェックインし、すべての変更をピアレビューします。
  4. 新しい機能/機能の変更のテストを作成します。
  5. 機能を実装します(これは通常のTDDサイクルです)
  6. テストでカバーした領域をリファクタリングしてください(red-green-refactor)。

これをもっとやればやるほど簡単になることがわかりました。コードベースに戻るたびに、少しずつ改善されます。

QAテスターに​​届くバグの数が大幅に減少しました。機能のリグレッションはほとんど前代未聞なので、私たちにとって努力する価値があったと思います。


2

(コメント機能がないため)テストを行わないよりも良いと思います。すべてのスニペットをテストする必要はありませんが、プログラマが最終的に使用するものだけをテストする必要があります。内部で使用するユーティリティ関数をテストすることは適切ですが、クリーンなAPIを介してすべてにアクセスする場合は必要ありません。


2

古いものが何年も正常に機能している場合は、古いものを変更しない限り、ユニットテストを今すぐ作成する必要はありません。とにかく、新しい部品の単体テストを書くことはまったく無意味ではありません。新しい部分はバグを含む可能性が最も高い部分であり、変更またはリファクタリングされる可能性が最も高い部分でもあります。


1「新しいパーツが最も可能性の高いバグを格納するためのものです」
MIA

それはプロジェクトの複雑さに依存します。「正常に動作する」とは、通常「最近壊れていない」または「誰かが言及した方法で壊れていない」ことを意味します...既存のコードの単体テストを常に書かなければならないことを示唆するものではありませんが、正しく動作していること、または意図したとおりに動作していること。
デイブDuPlantis

1

現在のコードのカバーを開始できます。時間があれば、古いコードのコア機能のカバーを開始できます。また、そのためにPMに余分な時間を求めることができます=)


0

単体テストは100%ですか、それともまったく関係ありませんか?

絶対違う!追加する新しいコードのテストを開始します。古いコンポーネントの一部にテストがない場合でも、それを行うことで大きなメリットが得られます。それらのコンポーネントの1つを処理するか、そのコンポーネントのバグを見つける必要がある場合は、テストを作成します。時間が経つにつれて、テスト対象の古いコードが増えていきます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.