2015-06-02 3 views
1

У меня возникли проблемы с составлением любой разумной структуры для модульного тестирования вспомогательных/статических функций модуля. Почти весь этот модуль является статическими функциями, и у него много его, поэтому я стараюсь не ставить все мои тесты в один и тот же файл. Специфическое (большое количество) ошибок: /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11Как структурировать статические функции в C?

Но меня интересует общий подход, который будет скомпилирован.

из командной строки, первая установка Куните:

# Install cunit 
sudo apt-get install libcunit1 libcunit1-doc libcunit1-dev 

В module_a.c:

#include <stdio.h> 

int main(void) 
{ 
    // Do the real thing 
    printf("The number 42: %d\n", get_42()); 
    printf("The number 0: %d\n", get_0()); 

    return 0; 
} 

static int32_t get_42(void) 
{ 
    return 42; 
} 

static int32_t get_0(void) 
{ 
    return 42; 
} 

В module_a_tests.c:

#define UNIT_TEST 
#include "module_a.c" 
#include "CUnit/Basic.h" 
#ifdef UNIT_TEST 

int set_up(void) 
{ 
    return 0; 
} 

int tear_down(void) 
{ 
    return 0; 
} 

void run_good_fn(void) 
{ 
    CU_ASSERT(42 == get_42()); 
} 

void run_bad_fn(void) 
{ 
    CU_ASSERT(0 == get_0()); 
} 

int main(void) 
{ 
    CU_pSuite p_suite = NULL; 

    // Initialize 
    if (CU_initialize_registry() != CUE_SUCCESS) { 
    return CU_get_error(); 
    } 

    p_suite = CU_add_suite("First Suite", set_up, tear_down); 
    if (p_suite == NULL) { 
    goto exit; 
    } 
    CU_basic_set_mode(CU_BRM_VERBOSE); 

    // Add tests 
    if (CU_add_test(p_suite, "Testing run_good_fn", run_good_fn) == NULL) { 
    goto exit; 
    } 

    if (CU_add_test(p_suite, "Testing run_bad_fn", run_bad_fn) == NULL) { 
    goto exit; 
    } 

    // Run the tests 
    CU_basic_run_tests(); 

    exit: 
    CU_cleanup_registry(); 

    return CU_get_error(); 
} 
#endif 

Related:

How to test a static function

+0

Конечно, в 'module_a.c' вам не следует начинать с '#define UNIT_TEST', как это должно быть установлено в тестовом файле, включая его? –

+0

Да. Это означает, что module_a.c не должен иметь основной. Редактирование теперь ... – tarabyte

ответ

1

Это немного взломанный, но один из способов приблизиться к этому - использовать #include как замену необработанного текста в нужном месте (после прямого объявления всех ваших статических функций). Там в зависимости от местоположения, но если вы будете следовать конвенции может быть легко понять:

В module_a.c:

#include <stdio.h> 

// Comment this macro in and out to enable/disable unit testing 
#define UNIT_TEST 

static int32_t get_42(void); 
static int32_t get_0(void); 

#ifndef UNIT_TEST 
int main(void) 
{ 
    // Do the real thing 
    printf("The number 42: %d\n", get_42()); 
    printf("The number 0: %d\n", get_0()); 

    return 0; 
} 
#else 
#include "module_a_tests.c" 
#endif 

static int32_t get_42(void) 
{ 
    return 42; 
} 

static int32_t get_0(void) 
{ 
    return 42; 
} 

В module_a_tests.c:

// Add a #include guard 
#ifndef MODULE_A_TESTS_C 
#define MODULE_A_TESTS_C 

#include "CUnit/Basic.h" 

int set_up(void) 
{ 
    return 0; 
} 

int tear_down(void) 
{ 
    return 0; 
} 

void run_good_fn(void) 
{ 
    CU_ASSERT(42 == get_42()); 
} 

void run_bad_fn(void) 
{ 
    CU_ASSERT(0 == get_0()); 
} 

int main(void) 
{ 
    CU_pSuite p_suite = NULL; 

    // Initialize 
    if (CU_initialize_registry() != CUE_SUCCESS) { 
    return CU_get_error(); 
    } 

    p_suite = CU_add_suite("First Suite", set_up, tear_down); 
    if (p_suite == NULL) { 
    goto exit; 
    } 
    CU_basic_set_mode(CU_BRM_VERBOSE); 

    // Add tests 
    if (CU_add_test(p_suite, "run_good_fn", run_good_fn) == NULL) { 
    goto exit; 
    } 

    if (CU_add_test(p_suite, "run_bad_fn", run_bad_fn) == NULL) { 
    goto exit; 
    } 

    // Run the tests 
    CU_basic_run_tests(); 

    exit: 
    CU_cleanup_registry(); 

    return CU_get_error(); 
} 
#endif