单元测试运行配置

Unit test run configuration

我需要起床运行 Cmocka 单元测试框架。我的设置是:

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

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

src/math/subtraction/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

单元测试

test/math/addition/add_test.c

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

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

test/math/subtraction/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:目标下添加测试可执行文件

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

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

P.P.S 它在项目的根目录创建测试可执行文件,如何在 bin 文件夹中创建所有二进制文件,然后在项目结束。

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

示例:

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 $@ $^

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

这应该可以解决问题:

test: add_test.log sub_test.log

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

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

您应该在清理目标中使用 $(RM) 而不是 rm -rf$(RM) 与平台无关,而 rm -rf 仅适用于 UNIXy 平台。