従来のプレーンなCプロジェクトへの単体テストの追加


12

タイトルはそれをすべて言います。私の会社は、完全にプレーンCで記述されたマイクロコントローラーデバイス用のレガシーファームウェアプロジェクトを再利用しています。

明らかに間違っており、変更が必要な部分があります。C#/ TDDのバックグラウンドから来たので、機能を変更しないことを保証するためのテストなしでランダムにリファクタリングするというアイデアは好きではありません。また、バグを見つけるのが難しいことは、わずかな変更(多くの場合、回帰テストを使用した場合に修正されると思います)によって導入されたことがわかりました。これらの間違いを避けるために、多くの注意を払う必要があります。コードの周りの多くのグローバルを追跡するのは難しいです。

要約する:

  • リファクタリングする前に、既存の密結合コードに単体テストをどのように追加しますか?
  • どのツールをお勧めしますか?(それほど重要ではありませんが、知っておくといいです)

私はこのコードの作成には直接関与していません(私の責任はさまざまな方法でデバイスと対話するアプリです)が、使用できる可能性がある場合、良いプログラミングの原則が残されていると悪いでしょう。

回答:


7

Michael Feathersによる「レガシーコードを効果的に使用する」のコピーを入手してください。そのような状況に対処するためのものです。C ++やJavaなどのオブジェクト指向言語に重点を置いていますが、それでもなお大きな助けになると思います。

その一部(または初期のドラフト記事)は、ここから無料入手することもできます


+1、ありがとう。しかし、OOコードをより多くのOOコードでリファクタリングするのはかなり得意だと思います。私が知らないのは、手続き型コードをテストする方法と、結合度の低い手続き型コードで手続き型コードをリファクタリングする方法です。
-Groo

@Groo、この本はリファクタリングそのものではありません。これは、単体テストなしのスパゲッティコードの束を、単体テストで十分にカバーされた(ややスパゲッティよりも少ない)コードの束に変換する方法についてです。このようなコードはテストが難しいため、テスト可能にするには、まずリファクタリングする必要があります。ただし、先ほど述べたように、単体テストを使用しないリファクタリングはリスクが高いため、キャッチ22の状況です。この本は、ユニットテストでそれをカバーすることができるようにコードに最小で最も安全な変更を加える方法をガイドします。したがって、本格的にリファクタリングを開始します。
ペテルトレック

その本は良い提案であり、CをOO言語とともにカバーしています。
ThomasW

7

テクニックについては、おそらくPéterTörökの答えのMichael Feathersのはかなり包括的なものになるでしょう。この本に行きたくない場合は、次の3段階のプロセスをお勧めします。

  1. テスト不可能なコードを調べ、そのコードの機能の小さな部分をテスト可能な関数に複製します。新しい関数が、複製しようとしている関数と明らかに同等の動作を持っていることが重要です-私は実際にレガシーコードの周りにユニットテストを書くことを主張していないので、非常に注意し、リファクタリングの信頼を維持するため。
  2. これらの新しい関数を中心に単体テストを作成します。
  3. 元のコードを変更して、新しい関数を呼び出します。

このプロセスを数回繰り返すと、レガシーコードベースの品質が大幅に向上していることがわかります。

ツールに関する限り、C ++はCを呼び出すことができるため、C ++の単体テストフレームワークを使用してCコードをテストできます。たとえば、CPPUnitを使用して、プロジェクトの多数のCコードを単体テストします。


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