サーチ…


前書き

多くの開発者は、単体テストを使用して、ソフトウェアが期待通りに動作することを確認します。単体テストは、より大きなソフトウェアの小さな単位をチェックし、出力が期待通りに一致することを保証します。テストフレームワークは、セットアップ/ティアダウンサービスを提供し、テストを調整することで単体テストを容易にします。

Cで利用できる単体テストフレームワークはたくさんあります。たとえば、Unityは純粋なCフレームワークです。 Cコードをテストするには、C ++のテストフレームワークを使用することがよくあります。多くのC ++テストフレームワークもあります。

備考

テストハーネス:

TDD - テスト駆動開発:

Cでの二重メカニズムのテスト:

  1. リンク時の置換
  2. 関数ポインタ置換
  3. プリプロセッサ置換
  4. 結合されたリンク時および関数ポインタ置換

C言語で使用されるC ++テストフレームワークに関する注意: ここで説明するように、CプログラムをテストするためにC ++フレームワークを使用することは、非常に一般的な方法です

CppUTest

Cpputestは、CとC ++のユニットテスト用のxUnitスタイルのフレームワークです。 C ++で書かれており、移植性とシンプルさを目的としています。メモリリークの検出、モックの構築、Googleテストとそのテストの実行をサポートしています。 Visual StudioとEclipse CDTのヘルパースクリプトとサンプルプロジェクトが付属しています。

#include <CppUTest/CommandLineTestRunner.h>
#include <CppUTest/TestHarness.h>


TEST_GROUP(Foo_Group) {}

TEST(Foo_Group, Foo_TestOne) {}

/* Test runner may be provided options, such
   as to enable colored output, to run only a
   specific test or a group of tests, etc. This
   will return the number of failed tests. */

int main(int argc, char ** argv)
{
    RUN_ALL_TESTS(argc, argv);
}

テストグループには、 setup() teardown()メソッドとteardown()メソッドがあります。 setupメソッドは各テストの前に呼び出され、 teardown()メソッドは後に呼び出されます。どちらもオプションで、どちらか一方を単独で省略することができます。他のメソッドや変数もグループ内で宣言され、そのグループのすべてのテストで使用できます。

TEST_GROUP(Foo_Group)
{
    size_t data_bytes = 128;
    void * data;

    void setup()
    {
        data = malloc(data_bytes);
    }

    void teardown()
    {
        free(data);
    }

    void clear()
    {
        memset(data, 0, data_bytes);
    }
}

ユニティテストフレームワーク

UnityはユニットテストのためのxUnitスタイルのテストフレームワークです。これはC言語で完全に書かれており、移植性があり、素早く、シンプルで、表現力豊かで拡張性があります。組み込みシステムの単体テストに特に役立つように設計されています。

関数の戻り値をチェックする単純なテストケースは、次のようになります

void test_FunctionUnderTest_should_ReturnFive(void)
{
    TEST_ASSERT_EQUAL_INT( 5, FunctionUnderTest() );
}

完全なテストファイルは次のようになります。

#include "unity.h"
#include "UnitUnderTest.h" /* The unit to be tested. */

void setUp (void) {} /* Is run before every test, put unit init calls here. */
void tearDown (void) {} /* Is run after every test, put unit clean-up calls here. */

void test_TheFirst(void)
{
    TEST_IGNORE_MESSAGE("Hello world!"); /* Ignore this test but print a message. */
}

int main (void)
{
    UNITY_BEGIN();
    RUN_TEST(test_TheFirst); /* Run the test. */
    return UNITY_END();
}  

Unityにはいくつかのサンプルプロジェクト、makefile、およびより長いテストファイルの作成を手助けするいくつかのRubyレーキスクリプトが付属しています。

CMocka

CMockaは、モックオブジェクトをサポートするCのための洗練されたユニットテストフレームワークです。標準のCライブラリのみを必要とし、さまざまなコンピューティングプラットフォーム(組み込みを含む)やさまざまなコンパイラで動作します。それはモック、 APIドキュメント 、およびさまざまなでのテストに関するチュートリアルを持っています

#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>

void null_test_success (void ** state) {}

void null_test_fail (void ** state)
{
    assert_true (0);
}

/* These functions will be used to initialize
   and clean resources up after each test run */
int setup (void ** state)
{
    return 0;
}

int teardown (void ** state)
{
    return 0;
}


int main (void)
{
    const struct CMUnitTest tests [] =
    {
        cmocka_unit_test (null_test_success),
        cmocka_unit_test (null_test_fail),
    };

    /* If setup and teardown functions are not
       needed, then NULL may be passed instead */

    int count_fail_tests =
        cmocka_run_group_tests (tests, setup, teardown);

    return count_fail_tests;
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow