C コードの単体テスト

C の単体テスト フレームワークの 1 つに Check があります。 C での単体テスト フレームワークのリストは、ここで見つけることができ、以下に再現されています。ランタイムに含まれる標準ライブラリ関数の数に応じて、それらのいずれかを使用できる場合と使用できない場合があります。

その他のフレームワーク:

CMocka

CMocka は、モック オブジェクトをサポートする C 用のテスト フレームワークです。使い方もセットアップも簡単です。

CMocka のホームページをご覧ください。

基準

Criterion はクロスプラットフォームの C ユニット テスト フレームワークで、自動テスト登録、パラメーター化されたテスト、理論をサポートし、TAP や JUnit XML などの複数の形式に出力できます。各テストは独自のプロセスで実行されるため、必要に応じてシグナルとクラッシュを報告またはテストできます。

詳細については、Criterion のホームページをご覧ください。

HWUT

HWUT は、C を強力にサポートする一般的な単体テスト ツールです。Makefile の作成、最小限の「反復テーブル」でコーディングされた大規模なテスト ケースの生成、ステート マシンのウォークアウェイ、C スタブの生成などに役立ちます。一般的なアプローチは非常にユニークです。評決は「良い標準出力/悪い標準出力」に基づいています。ただし、比較関数は柔軟です。したがって、チェックには任意のタイプのスクリプトを使用できます。標準出力を生成できる任意の言語に適用できます。

HWUT のホームページを参照してください。

Cグリーン

C および C++ 用の最新の移植可能な言語間ユニット テストおよびモック フレームワーク。オプションの BDD 表記、モック ライブラリ、単一プロセスで実行する機能 (デバッグを容易にするため) を提供します。テスト関数を自動で発見するテストランナーが利用可能です。ただし、プログラムで独自のものを作成できます。

これらすべての機能 (およびその他) は、CGreen マニュアルで説明されています。

ウィキペディアでは、ユニット テスト フレームワークのリストの下に、C ユニット テスト フレームワークの詳細なリストがあります:C


個人的には、Google Test フレームワークが気に入っています。

C コードのテストで本当に難しいのは、外部モジュールへの依存関係を壊して、コードをユニットごとに分離できるようにすることです。これは、レガシー コードに関するテストを取得しようとしている場合に特に問題になる可能性があります。この場合、リンカーを使用してテストでスタブ関数を使用することがよくあります。

これは、人々が「継ぎ目」について話すときに言及しているものです。 ". C では、プリプロセッサまたはリンカーを使用して依存関係をモックするしかありません。

私の C プロジェクトの典型的なテスト スイートは、次のようになります。

#include "myimplementationfile.c"
#include <gtest/gtest.h>

// Mock out external dependency on mylogger.o
void Logger_log(...){}

TEST(FactorialTest, Zero) {
    EXPECT_EQ(1, Factorial(0));
}

実際にはヘッダー ファイルではなく C ファイルをインクルードしていることに注意してください .これにより、すべての静的データ メンバーにアクセスできるという利点があります。ここでは、ロガー (logger.o にある可能性があり、空の実装を提供する可能性があります) のモックを作成します。これは、テスト ファイルが残りのコード ベースから独立してコンパイルおよびリンクされ、分離して実行されることを意味します。

コードのクロスコンパイルに関しては、これが機能するには、ターゲットに適切な機能が必要です。 PowerPC アーキテクチャ上の Linux にクロス コンパイルされた googletest でこれを行いました。結果を収集するための完全なシェルと OS があるため、これは理にかなっています。あまりリッチでない環境 (完全な OS のないものとして分類されます) では、ホスト上でビルドして実行するだけです。ビルドの一部としてテストを自動的に実行できるように、とにかくこれを行う必要があります。

オブジェクト指向コードは一般に手続き型よりも結合が少ないため、C++ コードのテストは一般的にはるかに簡単です (もちろん、これはコーディング スタイルに大きく依存します)。また、C++ では、依存性注入やメソッドのオーバーライドなどのトリックを使用して、カプセル化されているコードに継ぎ目を入れることができます。

Michael Feathers は、レガシー コードのテストに関する優れた本を出版しています。ある章では、私が強くお勧めするオブジェクト指向でないコードを扱うテクニックについて説明しています。

編集 :手続き型コードの単体テストに関するブログ記事を書きました。ソースは GitHub で入手できます。

編集 :Pragmatic Programmers から、C コードの単体テストに特に対処する新しい本が出版されました。これを強くお勧めします。


Minunit は信じられないほどシンプルな単体テスト フレームワークです。私は avr の C マイクロコントローラー コードの単体テストに使用しています。