👌

【C 言語】ソースファイルの分割とユニットテスト

2024/07/02に公開

add という名前の関数を別のソースファイルで定義して読み込む練習をする。

main.c
#include <stdio.h>
#include "add.h"

int main() {
   printf("%d\n", add(1, 2));

   return 0;
}
add.h
#ifndef _ADD_H_
#define _ADD_H_

int add(int a, int b);

#endif // _ADD_H_
add.c
#include "add.h"

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

コンパイルと実行は次のとおり

zig run main.c add.c -lc
clang main.c add.c -o main
./main

続いて add のユニットテストを追加する。ヘッダーファイルだけの Acutest を使う。次のコマンドでダウンロードする

wget https://raw.githubusercontent.com/mity/acutest/master/include/acutest.h

次に test_add.c を追加する

test_add.c
#include "add.h"
#include "acutest.h"

void test_add() {
    TEST_ASSERT(add(1, 2) == 3);
}

TEST_LIST = {
   { "add", test_add },
   { NULL, NULL }
};

次に CMakeLists.txt を用意する

CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(main)

add_executable(${PROJECT_NAME} main.c add.c)

enable_testing()

add_executable(test_add test_add.c add.c)

add_test(NAME run_test COMMAND test_add)

ビルドしてテストを実行する。make test の代わりに ctest を使うこともできる

mkdir build
cd build
cmake ..
make -j $(nproc)
make test
Running tests...
Test project /home/masakielastic/c-project/build
    Start 1: run_test
1/1 Test #1: run_test .........................   Passed    0.00 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) =   0.00 sec

Discussion