テスト駆動開発はOOに限定されていますか?それとも、手続き型言語と組み合わせて使用することは可能/有用ですか?今後数週間、Cでより大きなプロジェクトを開始する必要があり、開発方法を考えています。
TDDはdesignパラダイムであるため、特定のプログラミングパラダイムとは関係ありません。
簡単に言えば、コードを作成する前に、コードのテストを作成します。
this Cを使用したTDD(ボウリングゲームカタ)に関するスライドデッキを参照してください。
テスト駆動開発とは、最初にテストパターンから始めて、テストに合格するまで機能を構築するコードを開発することを意味します。これは、構造化/手続き型、オブジェクト指向、機能など、あらゆるプログラミングパラダイムに等しく当てはまります。入力と出力を受け取ることができるものはすべてテストできます。
James Grenningの本をチェックしてください Embedded Cのテスト駆動型開発 。その中で彼は、2つのTDDフレームワーク( nity および CppUTest )を使用してCをテストする方法の意味のある例を提供しています。
TDDはOO)に制限されているとは思いません。
UnityとCMockのフレームワークをお試しください。
彼らのウィキからの例:
void test_ShowSomeSillyExamples(void)
{
TEST_ASSERT_NOT_EQUAL(0, -1);
TEST_ASSERT_EQUAL_INT(1, 1);
TEST_ASSERT_EQUAL_HEX16(0x1234, 0x1234);
TEST_ASSERT_EQUAL_STRING("These Are The Same", "These Are The Same");
TEST_ASSERT_BITS(0x1111, 0x5555, 0x7175);
TEST_ASSERT_INT_WITHIN(5, 100, 102);
}
参照: http://sourceforge.net/apps/trac/embunity/wiki
一冊の本:
http://www.pragprog.com/titles/jgade/test-driven-development-for-embedded-c
このことについてのYahooグループ:
http://tech.groups.yahoo.com/group/AgileEmbedded/
CでTDDを実行する場合、Cでテストを作成する必要がありますか?私はおそらく、Googleのgtestを使用して、Cで製品コードを記述し、C++でテストを記述します。
他の人が指摘しているように、TDD自体はOOPに結び付けられていません。ただし、実際には、モジュール性に関連付けられています。各単体テストは、プログラムの非常に限られた部分のみをテストする必要があるため、グローバルな状態が多数ある場合、プログラムを単体テストすることはほとんど不可能です。
Cでモジュラープログラムを書くことは間違いなく可能ですが、それは異なる技術を必要とします。 TDDは、モジュラープログラムの作成を強制する場合がありますが、モジュラーCプログラムの作成に慣れていない場合は、開発のGrindが停止する可能性もあります。
TDDは ウィキペディアで定義 次のようになります。
テスト駆動開発(TDD)は、非常に短い開発サイクルの繰り返しに依存するソフトウェア開発手法です。最初に、開発者は、目的の改善または新機能を定義する失敗した自動テストケースを作成し、次にそのテストに合格するコードを生成します。最後に、新しいコードを許容可能な標準にリファクタリングします。
ここには、OOPに固有のものはまったくありません。それどころか、TDDはあらゆる種類のプログラミングに非常に適しています。特に、Cを含む手続き型言語と組み合わせて使用することは間違いなく可能です。
Cにはユニットテストフレームワークがあります。 「cユニットテスト」をグーグルで検索すると、いくつかが明らかになります。私はTDDを使用してCでいくつかのプロジェクトを作成しましたが、TDDはOO言語だけではありません。CでTDDを実行するのが難しい場合でも。
TDDは、コードを書く前に単体テストを使用し(Test First)、それを使用して設計を推進することを意味します。もちろん、Cに適合しますが、直面する2つの問題を想像します(私は試しませんでした)
大きなプロジェクトの場合のコンパイルの遅さ、TDDは開発とコードの実行に赤ちゃんのステップを頻繁に必要とし、C/C++はC#、Javaなどよりもコンパイルがはるかに遅く、もちろん動的言語よりもさらに遅くなります:)。
個別にテストし、サブシステムをモックして、それぞれを個別にテストします(TDDを使用しているため、まだ実装されていないシステムがありますが、それらに依存している、またはテストを次のような外部エフェクターに感染させたくないため) FileSystem、Socketsなど)、そしてもちろん、アプリケーションの規模と設計にも依存しますが、それを行うための戦略はわかりません。関数ポインターを渡すことを想像します(つまり、ポインターをテスト中の関数への偽の関数)を実行する方法がありますが、それを調査する必要があります。
ありがとう