使用C单元测试框架不使用Autotools进行检查?

eblbsuwk  于 2022-12-22  发布在  其他
关注(0)|答案(2)|浏览(123)

我试着跟随official Check tutorial,但是它需要Autotools的工作知识,而我没有。我希望只是写几个快速测试,我发现这个教程让人不知所措。它依赖于Autoconf、Automake和一些Check宏中的很多魔法。它没有解释Check实际上是如何工作的,这样我就可以手工构建测试。
如何使用“不使用Autotools的检查”?

lokaqttq

lokaqttq1#

在小项目中使用Check当然不需要学习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脚本,你甚至不需要为check框架的样板代码费心!(更多细节请参考mancheckmk)

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中,然后运行以下命令来构建implementation. c沿着main:

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

bvjxkvbb

bvjxkvbb2#

@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

相关问题