cmake 建立单元测试C语言开发环境

zi8p0yeb  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(162)

我是单元测试的新手,大多数时候都是用IDE编程的,因此我以前没有创建和/或修改过makefile。
现在,我正在探索单元测试和TDD;我不确定如何设置开发环境,以便在每次构建时自动运行单元测试。
请帮助。一个通用的程序来实现这一点会产生奇迹。
我还没有尝试过任何东西,因为我不太熟悉修改C制作文件。

sirbozc5

sirbozc51#

下面是我在使用criterion的小型TDD项目中使用的一个简单Makefile:

CC=gcc
RELEASE_CFLAGS=-ansi -pedantic -Wall -Werror -Wextra
TESTS_CFLAGS=-pedantic -Wall -Werror -Wextra
TESTS_LDFLAGS=-lcriterion

RELEASE_SRC=$(shell find src/ -type f -name '*.c')
RELEASE_OBJ=$(subst src/,obj/,$(RELEASE_SRC:.c=.o))

TESTS_SRC=$(shell find tests/src/ -type f -name '*.c')
TESTS_OBJ=$(subst src/,obj/,$(TESTS_SRC:.c=.o))
TESTS_BIN=$(subst src/,bin/,$(TESTS_SRC:.c=))

default: run-tests

obj/%.o: src/%.c
    $(CC) $(RELEASE_CFLAGS) -c $^ -o $@

tests/obj/%.o: tests/src/%.c
    $(CC) $(TESTS_CFLAGS) -c $^ -o $@

tests/bin/%: tests/obj/%.o $(RELEASE_OBJ)
    $(CC) $(TESTS_LDFLAGS) $^ -o $@

# prevent deleting object in rules chain
$(TESTS_BIN): $(RELEASE_OBJ) $(TESTS_OBJ)

run-tests: $(TESTS_BIN)
    ./$^ || true

clean:
    rm -f $(RELEASE_OBJ) $(TESTS_OBJ)

clean-all: clean
    rm -f $(TESTS_BIN)

它使用C89编译生产代码(-ansi)并使用未指定的标准测试代码。src/中的文件被移动到obj/tests/src/tests/obj/也是如此。测试二进制文件(AKA测试套件)依赖于每个源文件,并且包含在每个测试二进制文件中,这使得它们更大,但对于小项目来说这不是问题。如果二进制文件大小是个问题,必须为每个二进制文件指定要包含哪些对象。
目录结构是使用以下命令创建的:

mkdir -p src obj tests/{src,obj,bin}

示例测试文件:

#include <criterion/criterion.h>
#include "../../src/fibo.h"

Test(fibonacci, first_term_is_0)
{
    // given
    int term_to_compute = 0;

    // when
    int result = fibonacci(term_to_compute);

    // then
    cr_assert_eq(result, 0);
}

Test(fibonacci, second_term_is_1)
{
    // given
    int term_to_compute = 1;

    // when
    int result = fibonacci(term_to_compute);

    // then
    cr_assert_eq(result, 1);
}

以及相关的生产代码:

#include "fibo.h"

unsigned long fibonacci(unsigned int term_to_compute)
{
    return term_to_compute;
}

正如您所看到的,生产代码是相当愚蠢的,它需要更多的测试,因为它只满足指定的需求(单元测试)。
编辑:查看Make documentation,了解更多关于语法、内置函数等的信息。如果你想了解更多关于TDD的信息,YouTube有很多可以提供(实时编码、解释、TDD kata):查看Robert C Martin(Bob叔叔)、持续交付渠道等。
PS:返回一个long不是最好的选择,你可能希望固定大小的整数在不同的平台上有相同的结果,但问题是关于“如何TDD”。如果你是TDD新手,写given/when/then可能会有帮助。先写测试,并考虑边缘情况(如,指定溢出?)。我在做NASM TDD和用C测试时使用类似的设置。

相关问题