0

我需要启动并运行 Cmocka 单元测试框架。我的设置是:

src/math/addition/add.c (+add.h)

int add(int a, int b) {return a + b;}

src/数学/减法/sub.c (+sub.h)

int sub(int a, int b) {return a - b;}

生成文件

VPATH := src src/math src/math/addition
CFLAGS += -Isrc -Isrc/math -Isrc/math/addition
all: libMath clean

libMath: add.o sub.o
    ar rcs bin/libMath add.o sub.o

clean:
    rm -rf *.o

%.o: %.c %.h

单元测试

测试/数学/加法/add_test.c

#include "../src/math/addition/add.h"

void test_add() {
     assert(add(4, 5), 9);
}

测试/数学/减法/sub_test.c

#include "../src/math/subtraction/sub.h"

void test_sub() {
    assert(sub(9, 5), 4);
}

test/math/addition/add_test.c(来自cmocka.org

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

/* A test case that does nothing and succeeds. */
static void null_test_success(void **state) {
    (void) state; /* unused */
}

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

我是 C 单元测试的新手,基本上无法设置单元测试,包括链接 Cmocka 库等。

我的想法是拥有多个单元测试文件,而不是将所有单元测试放在一个文件中。

根据 Clearer 的回答进行编辑

扩大

从 1 个测试文件到 2 个和 3 个,它将至少有 10+ 个文件。寻找一些优化和表达方式以很好地扩展并易于管理。这是我到目前为止所做的。

VPATH := src/math/add  src/math/sub  src/math/mul # split src/test path
VPATH += test/math/add test/math/sub test/math/mul

all: libMath clean

libMath: add.o sub.o mul.o
    ar rcs bin/libMath add.o sub.o mul.o # suggestion? $^

test: add_test sub_test mul_test clean
    ./add_test
    ./sub_test
    ./mul_test

add_test: add_test.o add.o
    $(CC) -o $@ $^

sub_test: sub_test.o sub.o
    $(CC) -o $@ $^

mul_test: mul_test.o mul.o
    $(CC) -o $@ $^

clean:
    $(RM) *.o

%.o: %.c %.h

这是到目前为止的观察结果。

  1. 该模式似乎就像为每对测试和 src 文件添加一个新目标。
  2. 在先决条件和命令中将 .o 对象添加到 libMath
  3. test:在先决条件和命令中的目标下添加测试可执行文件

在扩大规模的同时,这种方式更好还是有更好的方法?

PS我已经删除了 CFLAGS 线,没有它它工作正常,帮助我清理并减少一些混乱。可以吗?如果 .h 文件的路径不正确,我的 IDE (clion) 会显示红色的摆动线,因此我在测试文件中使用完整路径来包含 src 文件。

PPS它在项目的根目录上创建测试可执行文件,如何在 bin 文件夹中创建所有二进制文件,然后在项目结束时全部删除。

4

1 回答 1

2

我会添加一个test目标。该目标将取决于您的所有测试程序,然后应该执行这些程序;您可能想要添加单独的目标来执行程序,并只保留一个主测试目标以确保所有这些目标都被执行。每个测试程序都依赖于测试所需的目标文件;如果你在做加法测试,让加法测试依赖于addition.o和add_test.o。像往常一样链接它们,然后执行它们。

例子:

test: addition_test
   ./addition_test

addition_test: add_test.o add.o
    $(CC) -o $@ $^

缩放测试

您可以通过添加两条规则并删除与测试相关的大多数其他规则来扩展测试:

test: add_test_run sub_test_run

%_run: %
    ./$<

 %_test: %.o %_test.o
    $(CC) -o $@ $^

应该做你想做的一切。这允许并行运行测试;您可以通过在每次运行结束时创建一个文件来避免运行不需要运行的测试,例如:一个告诉您测试运行结果的日志文件。

这应该可以解决问题:

test: add_test.log sub_test.log

%.log: %
    ./$^ > $@

 %_test: %.o %_test.o
    $(CC) -o $@ $^

你应该在你的干净目标中使用$(RM)而不是。独立于平台,仅适用于 UNIXy 平台。rm -rf$(RM)rm -rf

于 2018-01-24T07:15:25.110 回答