web-dev-qa-db-ja.com

Cユニットテストフレームワークチェックのより基本的なチュートリアルはありますか?

公式チュートリアル をここでフォローしようとしていますが、autotoolsの実用的な知識が必要です。これは私にはありません。私はいくつかの簡単なテストを書くことだけを望んでいました、そして私はこのチュートリアルが圧倒的であると感じています。これは、autoconf、automake、およびいくつかのCheckマクロの多くの魔法に依存していると思いますが、Checkが実際にどのように機能するかを説明していないため、手動でテストを作成できます。

Autotoolsを必要としない簡単なチュートリアルを誰かがお勧めできますか?

22
Mark E. Haase

小さなプロジェクトでCheckinを使用するためにautotoolsを学ぶ必要はありません。 main()がmain.cにあり、implementation.cに2つのintを合計する関数があるとします。 (implementation.hには関数プロトタイプのみが含まれています)

#include "implementation.h"

int sum(int a, int b) {

    return a + b;
}

あなたはそのようにテストを書くことができます:

#include "implementation.h"

#test sum2test
    fail_unless(sum(3, 2) == 5, "sum function borked");
    fail_unless(sum(-3, 2) == -1, "sum function borked");
    fail_unless(sum(3, -2) == 1, "sum function borked");
    fail_unless(sum(-3, -2) == -5, "sum function borked");

ファイルをimplementation-test.checkに保存し(任意の名前/拡張子を選択できますが、私のガイドに従いたい場合はそのままにしてください)、Checkに付属のawkスクリプトを実行します。チェックフレームワークの定型コードを気にする必要はありません! (詳細についてはman checkmk)

checkmk implementation-test.check >implementation-test.c

出力は次のようになります。

/*
 * DO NOT EDIT THIS FILE. Generated by checkmk.
 * Edit the original source file "implementation-test.check" instead.
 */

#include <check.h>

#line 1 "implementation-test.check"
#include "implementation.h"

START_TEST(sum2test)
{
#line 4
    fail_unless(sum(3, 2) == 5, "sum function borked");
    fail_unless(sum(-3, 2) == -1, "sum function borked");
    fail_unless(sum(3, -2) == 1, "sum function borked");
    fail_unless(sum(-3, -2) == -5, "sum function borked");
}
END_TEST

int main(void)
{
    Suite *s1 = suite_create("Core");
    TCase *tc1_1 = tcase_create("Core");
    SRunner *sr = srunner_create(s1);
    int nf;

    suite_add_tcase(s1, tc1_1);
    tcase_add_test(tc1_1, sum2test);

    srunner_run_all(sr, CK_ENV);
    nf = srunner_ntests_failed(sr);
    srunner_free(sr);

    return nf == 0 ? 0 : 1;
}

次に、コンパイル時に-lcheckを含めて、チェックライブラリをリンクし、プログラムを実行します。

gcc -Wall -o sum2ints-test implementation.c implementation-test.c -lcheck
./sum2ints

以下は、始めるための簡単なmakefileです。それをsum2ints.makefileに保存してから、mainと一緒にimplementation.cをビルドするには、次のコマンドを実行します。

make -f sum2ints.makefile

Checkmkから作成されたimplementation-test.cを使用してimplementation.cをビルドして実行するには、次のコマンドを実行します。

make -f sum2ints.makefile test

-

CFLAGS=-Wall
LIBS=-lcheck

all: sum2ints

sum2ints: main.o implementation.o
gcc -o sum2ints main.o implementation.o

main.o: main.c implementation.h
gcc $(CFLAGS) -c main.c

implementation.o: implementation.c implementation.h
gcc $(CFLAGS) -c implementation.c

test: sum2ints-test
./sum2ints-test

sum2ints-test: implementation-test.o implementation.o
gcc -o sum2ints-test implementation.o implementation-test.o $(LIBS)

implementation-test.o: implementation-test.c implementation.h
gcc $(CFLAGS) -c implementation-test.c

上記のすべてを含む.Zipファイルを用意しました。

https://dl.dropbox.com/u/1987095/test-check.Zip

43
freestyler

freestylerの答えは良いですが、それでもcheckmkを使用します。これは必須ではありません。これは最小限の例ですなしcheckmkを使用します。

以下をtest.cという名前のファイルに入れます。

#include <check.h>

START_TEST (sanity_check)
{
    fail_unless(5 == 5, "this should succeed");
    fail_unless(6 == 5, "this should fail");
}
END_TEST

int main(void)
{
    Suite *s1 = suite_create("Core");
    TCase *tc1_1 = tcase_create("Core");
    SRunner *sr = srunner_create(s1);
    int nf;

    suite_add_tcase(s1, tc1_1);
    tcase_add_test(tc1_1, sanity_check);

    srunner_run_all(sr, CK_ENV);
    nf = srunner_ntests_failed(sr);
    srunner_free(sr);

    return nf == 0 ? 0 : 1;
}

でコンパイルします

gcc test.c -Wall -o test -lcheck -pthread -lcheck_pic -pthread -lrt -lm -lsubunit
5

ああ、Cプログラミングエリアで知っておくべきautotoolsを学ぶほうがいいと思います。

Unittestのみを使用したい場合、 MinUnit の方が適しています。

Autoconf、Automake、makeを学ぶ ここ

1
wang wynn

複数のチュートリアルを確認しました。 これ 箱から出してすぐに使えるもの:

file.c

#include <stdio.h>
#include <assert.h>

#define run_test(fn_name) \
    printf("%s\n", #fn_name); \
    fn_name()

// Stupid sample tests
void test_foo()
{
    assert(1 < 2);
}

void test_bar()
{
    assert(NULL == (void*)0);
}

int main(int argc, char *argv[])
{
    run_test(test_foo);
    run_test(test_bar);
    printf("\nOK\n");
    return 0;
}

ビルドして実行

user@Host ~/ $ make file
user@Host ~/ $ ./file

test_foo
test_bar

OK
0
030