2013-03-01 3 views
2

Его первое тестирование программ C. У меня есть этот файл заголовок, который я хотел бы проверить:CUnit Tests get Build Error

#ifndef CALCULATOR_HELPER_H 
#define CALCULATOR_HELPER_H 
#endif 

    int add(int num1, int num2) { 
     return num1 + num2; 
    } 

Я использую рамки Кунит, чтобы проверить его. Я использую Netbeans как IDE. Ниже приведен код.

#include <stdio.h> 
#include <stdlib.h> 
#include "CUnit/Basic.h" 
#include "calculator_helper.h" 

/* 
* CUnit Test Suite 
*/ 

int init_suite(void) { 
    return 0; 
} 

int clean_suite(void) { 
    return 0; 
} 

/* IMPORTANT PART: */ 

void testAdd() { 
    int num1 = 2; 
    int num2 = 2; 
    int result = add(num1, num2); 
    if (result == 4) { 
     CU_ASSERT(0); 
    } 
} 

int main() { 
    CU_pSuite pSuite = NULL; 

    /* Initialize the CUnit test registry */ 
    if (CUE_SUCCESS != CU_initialize_registry()) 
     return CU_get_error(); 

    /* Add a suite to the registry */ 
    pSuite = CU_add_suite("newcunittest", init_suite, clean_suite); 
    if (NULL == pSuite) { 
     CU_cleanup_registry(); 
     return CU_get_error(); 
    } 

    /* Add the tests to the suite */ 
    if ((NULL == CU_add_test(pSuite, "testAdd", testAdd))) { 
     CU_cleanup_registry(); 
     return CU_get_error(); 
    } 

    /* Run all tests using the CUnit Basic interface */ 
    CU_basic_set_mode(CU_BRM_VERBOSE); 
    CU_basic_run_tests(); 
    CU_cleanup_registry(); 
    return CU_get_error(); 
} 

ПРОБЛЕМА

Когда я строю тест, я получаю Скопление ИСПЫТАНИЯ FAILED. В частности, я получаю следующее:

 
In function `add': NetBeans/Calculator/calculator_helper.h:12: 
multiple definition of `add' 
build/Debug/GNU-Linux-x86/tests/tests/newcunittest.o:NetBeans/Calculator/./calculator_helper.h:12: 
first defined here collect2: error: ld returned 1 exit status 

Может кто-нибудь сказать мне, почему я получаю эту ошибку. Я пробовал искать в Google, но мне не повезло.

ответ

2

У меня есть этот файл заголовок, который я хотел бы проверить:

Вы , образующую функция в файле заголовок:

int add(int num1, int num2) { 
    return num1 + num2; 
} 

объявит его в заголовок:

#ifndef CALCULATOR_HELPER_H 
#define CALCULATOR_HELPER_H 

int add(int num1, int num2); 

#endif  /* the endif goes at the end of the file */ 

... и определить его в исходном файле:

#include "helper.h" 

int add(int num1, int num2) { 
    return num1 + num2; 
} 

Рекомендуемая литература:

+0

Спасибо. Его работа сейчас :) – Goaler444

1

Это:

#ifndef CALCULATOR_HELPER_H 
#define CALCULATOR_HELPER_H 
#endif 

Является "включить охрану". Но все сделано неправильно: ваш код должен идти до #endif, а не после.

Бонусный наконечник: не используйте слово «помощник» в коде - всегда лучше. Как и в этом случае, вы можете назвать это CALCULATOR_MATH_H.

+0

Я поместил охрану #endif в нижней части моего кода. Он по-прежнему не работал = s – Goaler444

+0

OK, следующий шаг, добавьте 'inline' перед' int add', потому что вам это нужно, когда вы определяете (а не просто декларируете, как это более типично) функции в заголовочных файлах. Или вы можете сделать то, что здесь предлагает другой ответ, который должен определять функцию в файле .cpp. –

1

линкер говорит y ou, что есть два определения «добавить». Игнорируя на минуту действительные точки, поднятые другими ответами, ваш код строит отлично, как на Ubuntu 12.04.2, используя gcc в командной строке. Я построил его так и не увидел никаких предупреждений (установил libcunit.а к/USR/местные/Библиотека):

gcc -Wall -c testsuite.c 
gcc testsuite.o -L/usr/local/lib -lcunit -static -o testsuite 

и он побежал, в противном случае, как вы могли бы ожидать, учитывая тест:

... 
Suite: newcunittest 
    Test: testAdd ...FAILED 
    1. testsuite.c:25 - 0 
... 

В таком случае, кажется, что ваша проблема вызвана либо что-то в Netbeans также определяет функцию «добавить», или в вашей сборке больше, чем вы опубликовали, а в других файлах - «calculator_helper.h», что приведет к включению и определению вашей функции дважды благодаря ее сломанной защите.

Возможно, вы также захотите изменить стиль своего теста, чтобы он утверждал, что он ожидает быть истинным. В текущем тесте не удается утверждать, когда add() делает правильную вещь, чего не ожидает большинство людей! Попробуйте это вместо:

void testAdd() { 
    int num1 = 2; 
    int num2 = 2; 
    int result = add(num1, num2); 
    CU_ASSERT(result == 4); 
} 
+0

Спасибо за ваш ответ. Код, который я представил, был полным, что означало, что я ничего не оставлял. По какой-то причине, когда я отделил код от файла заголовка и поместил его в исходные файлы, он начал работать. Все, что у меня есть в файле заголовка, это прототипы. Я думаю, что это связано с NetBeans. – Goaler444

+0

Если вы хотите прибить его к NetBeans, вернитесь к исходному коду, чтобы восстановить проблему и переименовать функцию добавления (например, в «goaler444_add»). Если это столкновение с NetBeans, тогда ошибка исчезнет. –