Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
41
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

CUnitでCプログラムの単体テストをする

チュートリアルを鵜呑みにしたらハマったのでメモ。

インストール

チュートリアルに従い、以下のコマンドを打つことで/usr/local/以下にCUnit関連がインストールされます。

Bash
$ wget http://jaist.dl.sourceforge.net/project/cunit/CUnit/2.1-2/CUnit-2.1-2-src.tar.bz2
$ tar xvf CUnit-2.1-2-src.tar.bz2
$ cd CUnit-2.1-2
$ ./configure
$ make
$ sudo make install

事前準備

LD_LIBRARY_PATHを明示的に指定しないと共有オブジェクトファイルがないと怒られるのであらかじめ指定しておきます。大事です。
ここで1時間弱はまりました。

Bash
$ export LD_LIBRARY_PATH=/usr/local/lib

永続化するには.bashrcあたりに追記しておきます。

.bashrc
export LD_LIBRARY_PATH=/usr/local/lib

追記した結果を反映させるには下記いずれかのコマンドを打ってください。

Bash
$ source ~/.bashrc
$ . ~/.bashrc

動作確認

チュートリアルに従ってmain.cを作成します。

main.c
//=============================================================================
// ファイル : main.c
//=============================================================================
#include <CUnit/CUnit.h>
#include <CUnit/Console.h>

//-----------------------------------------------------------------------------
// プロトタイプ宣言
//-----------------------------------------------------------------------------
void sort(int array[], int num);
void test_sort_001(void);
void test_sort_002(void);
void test_sort_003(void);
void test_sort_004(void);
void test_sort_005(void);

//-----------------------------------------------------------------------------
// main() 関数
//-----------------------------------------------------------------------------
int main() {
  CU_pSuite sort_suite;

  CU_initialize_registry();
  sort_suite = CU_add_suite("Sort", NULL, NULL);
  CU_add_test(sort_suite, "test_001", test_sort_001);
  CU_add_test(sort_suite, "test_002", test_sort_002);
  CU_add_test(sort_suite, "test_003", test_sort_003);
  CU_add_test(sort_suite, "test_004", test_sort_004);
  CU_add_test(sort_suite, "test_005", test_sort_005);
  CU_console_run_tests();
  CU_cleanup_registry();

  return(0);
}

//-----------------------------------------------------------------------------
// テスト対象のソート関数
//-----------------------------------------------------------------------------
void sort(int array[], int num) {
  int i;
  int j;
  int val;

  for(i=0; i<(num-1); i++) {
    for(j=(num-1); j>i; j--) {
      if (array[j-1] > array[j]) {
        val = array[j];
        array[j] = array[j-1];
        array[j-1] = val;
      }
    }
  }
}

//-----------------------------------------------------------------------------
// テスト関数1
//-----------------------------------------------------------------------------
void test_sort_001(void) {
  int array[] = {3};

  sort(array, 1);
  CU_ASSERT(array[0] == 3);
}

//-----------------------------------------------------------------------------
// テスト関数2
//-----------------------------------------------------------------------------
void test_sort_002(void) {
  int array[] = {11, 7, 5, 3, 2};

  sort(array, 5);
  CU_ASSERT(array[0] == 2);
  CU_ASSERT(array[1] == 3);
  CU_ASSERT(array[2] == 5);
  CU_ASSERT(array[3] == 7);
  CU_ASSERT(array[4] == 11);
}

//-----------------------------------------------------------------------------
// テスト関数3
//-----------------------------------------------------------------------------
void test_sort_003(void) {
  int array[] = {7, 11, 3, 2, 5};

  sort(array, 5);
  CU_ASSERT(array[0] == 2);
  CU_ASSERT(array[1] == 3);
  CU_ASSERT(array[2] == 5);
  CU_ASSERT(array[3] == 7);
  CU_ASSERT(array[4] == 11);
}

//-----------------------------------------------------------------------------
// テスト関数4
//-----------------------------------------------------------------------------
void test_sort_004(void) {
  int array[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};

  sort(array, 10);
  CU_ASSERT(array[0] == 1);
  CU_ASSERT(array[1] == 2);
  CU_ASSERT(array[2] == 3);
  CU_ASSERT(array[3] == 4);
  CU_ASSERT(array[4] == 5);
  CU_ASSERT(array[5] == 6);
  CU_ASSERT(array[6] == 7);
  CU_ASSERT(array[7] == 8);
  CU_ASSERT(array[8] == 9);
  CU_ASSERT(array[9] == 10);
}

//-----------------------------------------------------------------------------
// テスト関数5
//-----------------------------------------------------------------------------
void test_sort_005(void) {
  int array[] = {2, 9, 3, 6, 10, 5, 8, 4, 1, 7};

  sort(array, 10);
  CU_ASSERT(array[0] == 1);
  CU_ASSERT(array[1] == 2);
  CU_ASSERT(array[2] == 3);
  CU_ASSERT(array[3] == 4);
  CU_ASSERT(array[4] == 5);
  CU_ASSERT(array[5] == 6);
  CU_ASSERT(array[6] == 7);
  CU_ASSERT(array[7] == 8);
  CU_ASSERT(array[8] == 9);
  CU_ASSERT(array[9] == 10);
}

//=============================================================================
// ファイルエンド
//=============================================================================

コンパイルして実行します。

Bash
$ gcc main.c -Wall -L/usr/local/lib -lcunit
$ ./a.out

チュートリアル通りに以下の画面が出れば成功です。
出ない場合はエラーメッセージをググってください。

Bash
     CUnit - A Unit testing framework for C - Version 2.1-0
     http://cunit.sourceforge.net/


*************** CUNIT CONSOLE - MAIN MENU ***********************
(R)un all, (S)elect suite, (L)ist suites, Show (F)ailures, (Q)uit
Enter Command :

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
41
Help us understand the problem. What are the problem?