LoginSignup
12
11

More than 5 years have passed since last update.

CUnitについての備忘録

Last updated at Posted at 2016-12-17

Cunit

CUnitを使う機会が有ったので、備忘録として記載する。
(なお自サイトにも同様の内容を記載している。)

CUnit:Cの単体テストツール

CUnitはテストコードにリンクして実行を行う
CUnit URL:http://cunit.sourceforge.net/

CUnit インストール:

Google検索すると先人の方々がCUnitのインストールについて記載されているためそちらを確認していただく方が良いと考えるが、一応、インストールの方法についてもここで触れておく

(1)Cunitファイルをダウンロード
C Unit Testing Framework:https://sourceforge.net/projects/cunit/files/

CUIの場合
wget wget http://jaist.dl.sourceforge.net/project/cunit/CUnit/2.1-2/CUnit-2.1-2-src.tar.bz2
# 2016/12/17 現在 最新版は2.1.3だがconfigureが存在しないため,2.1.2を使用する

(2)ダウンロードファイルの解凍及びinstall
ファイル解凍
$ tar xvf ./CUnit-2.1-2-src.tar.bz2
解凍フォルダへ移動
$ cd CUnit-2.1-2
makefile作成
$ ./configure
make実行
$ make
install
$ make install

(3)ライブラリパスを設定
.bashrcに以下を追記
export LD_LIBRARY_PATH=/usr/local/lib
.bashrcの設定を反映
$ source ~/.bashrc

CUnit testコード作成

Sample Code: http://cunit.sourceforge.net/example.html
サンプルコードは上記から取得可能
今回は例として素数の時だけjojoを表示するプログラムをCUnitでテストするコードを記載する

src.c: 素数の時だけjojoを表示するプログラム
src.h: src.cのヘッダファイル
tsrc.c: src.cのテストコード
tsrc.h: tsrc.cのヘッダファイル

src.c
#include <stdio.h>                                                              

int jojo();
void chkPrime(int cnt);
void printJojo();
void printNum();

int jojo(){
  int cnt;

  for(cnt=1; cnt <= 10; cnt++) {
    chkPrime(cnt);
  }

  return 0;
}

void chkPrime(int cnt) {
  if(cnt < 2) {
    printJojo();
    return;
  }
  else if(cnt == 2) {
    printJojo();
    return;
  }

  if((cnt % 2) == 0) {
    printNum(cnt);
    return;
  }

  for(int i=3; i <= (cnt/i); i += 2) {
    if(cnt % i == 0) {
      printNum(cnt);
      return;
    }   
  }
  printJojo();

  return;
}

void printJojo() {
  printf("jojo\n");
  return;
}

void printNum(int cnt) {
  printf("%d\n", cnt);
  return;
}
src.h
#ifndef _SRC_H_
#define _SRC_H_

int jojo();
void chkPrime(int cnt);
void printJojo();
void printNum();

#endif /* _SRC_H_ */
tsrc.c
#include "CUnit/CUnit.h"                                                        
#include "CUnit/Console.h"

#include "tsrc.h"
#include "src.h"

int main() {
  CU_pSuite testSuite;

  /* CUnit初期化 */
  CU_initialize_registry();
  /* Suite登録 */
  testSuite = CU_add_suite("JojoTestSuite", NULL, NULL);

  /* Test関数 */
  CU_add_test(testSuite, "JojoTest", test_jojo);
  CU_add_test(testSuite, "ChkPrimeTest", test_ChkPrime);
  CU_add_test(testSuite, "PrintJojoTest", test_printJojo);
  CU_add_test(testSuite, "PrintNumTest", test_printNum);

  /* CUnit 実行 */
  CU_console_run_tests();
  /* CUnit 終了処理 */
  CU_cleanup_registry();

  return 0;
}

void test_jojo() {

  CU_ASSERT(jojo()==0);

  return;
}

void test_ChkPrime() {

  chkPrime(0);
  chkPrime(2);
  chkPrime(3);
  chkPrime(4);
  chkPrime(10);

  return;
}

void test_printJojo() {

  printJojo();

  return;
}

void test_printNum() {

  printNum(1);

  return;
} 
tsrc.h
#ifndef _TSRC_H_
#define _TSRC_H_

int main(void);
void test_jojo(void);
void test_ChkPrime(void);
void test_printJojo(void);
void test_printNum(void);

#endif /* _TSRC_H_ */

CUnitではテストコードのmain関数でレジストリ初期化などが必要となる
以下の表に簡単に記載した

CUnit関数

概要 関数名称 引数 備考
レジストリ初期化 CU_ErroCode CU_initialize_registry(void) void
Suite登録 CU_pSuite CU_add_suite(const char* strName, CU_InitializeFunc pInit, CU_CleanupFunc pClean) 第1引数:
Suite名称,
第2引数:
初期化関数,
第3引数:
終了処理関数
CU_add_test関数の前に実行しなければならない
Test関数登録 CU_pTest CU_add_test(CU_pSuite pSuite, const char* strName, CU_TestFunc pTestFunc) 第1引数:
CU_add_suiteの戻り値,
第2引数:
Test関数名称,
第3引数:
テスト関数
CUit実行 void CU_console_run_tests(void) void コンソール実行
レジストリ削除 void CU_cleanup_registry(void) void

CUnitコンパイル

コンパイルを実施する場合,CUnitのライブラリをリンクする必要がある
そのためコンパイルコマンドは以下の様になる


gcc ./src.c ./tsrc.c -Wall -L/usr/local/lib -lcunit

CUnit実行結果


$ ./a.out


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


***************** CUNIT CONSOLE - MAIN MENU ******************************
(R)un  (S)elect  (L)ist  (A)ctivate  (F)ailures  (O)ptions  (H)elp  (Q)uit
Enter command: r

Running Suite : JojoTestSuite
     Running Test : JojoTestjojo
jojo
jojo
4
jojo
6
jojo
8
9
10

     Running Test : ChkPrimeTest
     Running Test : PrintJojoTest
     Running Test : PrintNumTest

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites      1      1    n/a      0        0
               tests      4      4      4      0        0
             asserts      8      8      8      0      n/a

Elapsed time =    0.000 seconds

Ran:実行テスト
Passed:通過したテスト
Failed:失敗したテスト
Inactive:未実行テスト

上記の内容でCUnitのinstallからテストの実行までできると考える。
何かの参考になれば幸いである。

12
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11