[MariaDB] 테스트 프레임워크

mariadb 프로젝트의 테스트 코드가 실행되는 과정 분석


빌드

  • mkdir build && cd build && cmake .. && cmake --build . --parallel 5
    • 빌드 결과가 저장될 디렉토리 build 생성&이동
    • 따로 옵션을 명시하지 않아도 단위 테스트들이 기본적으로 빌드된다

테스트 실행

  • 모든 테스트 실행
    • build 디렉토리에서 ctest 명령어 실행
  • 특정 테스트 실행
    • build/unittest/mysys/my_malloc-t 실행

테스트 프레임워크

  • MariaDB의 테스트 프레임워크는 ctest, cmake를 감싸는 cmake 매크로와 함수로 구현되어 있다
  • MY_ADD_TESTS(dynarray LINK_LIBRARYS mysys)
    • cmake/ctest.cmake에 정의된 cmake 매크로
    • dynarray-t.c파일에 mytap 라이브러리를 링크하여 dynarray-t 실행파일을 만드는 규칙을 생성한다
  • mytap : MariaDB에서 사용하는 테스트 라이브러리
    • 테스트 작성에 반복적으로 사용되는 함수들을 제공
    • unittest/examples/simple-t.c에서 사용법을 익힐 수 있다
    • plan함수 : 이 파일에서 몇 개의 테스트를 진행할지 미리 선언한다
    • ok함수 : 첫 번째 인자로 0이 전달되면 테스트 실패를 의미한다

실습

  • cmake에게 테스트 빌드 방법 전달
    • unittest/mysys/CMakeLists.txt 파일 편집
    • MY_ADD_TESTS 매크로에 dynarray 추가
  • unittest/mysys/dynarray-t.c 파일 생성
#include <tap.h>
#include <my_global.h>
#include <my_sys.h>
#include <stdio.h>

struct _foo {
  int num;
  char str[64];
};

static unsigned int test_dynamic_increase(int size)
{
  /* @given
   * 초기 크기가 size이고 element32개만큼의 공간이 늘어나는 동적 배열 생성
   */
  unsigned int inc = 32;
  DYNAMIC_ARRAY array;
  // my_init_dynamic_array 함수는 항상 FALSE를 반환한다
  my_init_dynamic_array(PSI_NOT_INSTRUMENTED, &array, sizeof(struct _foo), 
      size, inc, MYF(0));
  /* @when
   * size + 1개의 원소를 배열에 추가
   */
  unsigned int i;
  struct _foo foo;
  for (i = 0; i <= size; ++i)
  {
    foo.num = i;
    snprintf(foo.str, 64, "sample string-%u", i);
    /* @then
     * 원소 추가에 성공
     */
    if (insert_dynamic(&array, (const void *)&foo)) {
      diag("insert_dynamic failed");
      return TRUE;
    }
  }
  /* @then
   * capacity가 size에서 inc만큼 증가함
   */
  if (size + array.alloc_increment != array.max_element) {
    diag("actual: %u expected: %u", array.max_element, 
        size+array.alloc_increment);
    return TRUE;
  }

  /*
   * C/C++ 프로그래밍에서 함수가 성공할 경우 0을 반환하는 관례를 따름
   */
  return FALSE;
}

int main() {
  unsigned int a,b;
  unsigned int failed;
  plan(1);
  diag("Testing DYNAMIC_ARRAY");
  failed = 0;
  for (a = 1 ; a < 200 ; ++a)
    if (test_dynamic_increase(a)) {
      ++failed;
      diag("Failed for test_dynamic_increase(%3u)", a);
    }
  ok(failed == 0, "test_dynamic_increase");
  return exit_status();
}
  • 빌드한 뒤 전체 실행 또는 build/unittest/mysys/dynarray-t 실행

출처