2 Stimmen

CUnit-Tests erhalten Build-Fehler

Es ist das erste Mal, dass ich C-Programme teste. Ich habe diese Header-Datei, die ich testen möchte:

#ifndef CALCULATOR_HELPER_H
#define CALCULATOR_HELPER_H
#endif

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

Ich benutze das Framework CUnit zum Testen. Ich benutze Netbeans als IDE. Hier ist der Code:

#include 
#include 
#include "CUnit/Basic.h"
#include "calculator_helper.h"

/*
 * CUnit-Test-Suite
 */

int init_suite(void) {
    return 0;
}

int clean_suite(void) {
    return 0;
}

/* WICHTIGER TEIL: */

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;

    /* Initialisierung des CUnit-Test-Registers */
    if (CUE_SUCCESS != CU_initialize_registry())
        return CU_get_error();

    /* Füge eine Suite dem Register hinzu */
    pSuite = CU_add_suite("newcunittest", init_suite, clean_suite);
    if (NULL == pSuite) {
        CU_cleanup_registry();
        return CU_get_error();
    }

    /* Füge die Tests zur Suite hinzu */
    if ((NULL == CU_add_test(pSuite, "testAdd", testAdd))) {
        CU_cleanup_registry();
        return CU_get_error();
    }

    /* Führe alle Tests mit der CUnit Basic-Schnittstelle aus */
    CU_basic_set_mode(CU_BRM_VERBOSE);
    CU_basic_run_tests();
    CU_cleanup_registry();
    return CU_get_error();
}

PROBLEM

Beim Erstellen des Tests erhalte ich ein FEHLER BEIM BAUEN DER TESTS. Genauer gesagt, erhalte ich dies:

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

Kann mir jemand sagen, warum ich diesen Fehler bekomme? Ich habe versucht, auf Google zu suchen, aber hatte kein Glück.

2voto

netcoder Punkte 64375

Ich habe diese Headerdatei, die ich testen möchte:

Sie definieren eine Funktion in einer Headerdatei:

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

Deklarieren Sie sie in der Headerdatei:

#ifndef CALCULATOR_HELPER_H
#define CALCULATOR_HELPER_H

int add(int num1, int num2);

#endif      /* das endif gehört ans Ende der Datei */

...und definieren Sie sie in einer Quelldatei:

#include "helper.h"

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

Empfohlene Lektüre:

1voto

John Zwinck Punkte 221200

Dieses:

#ifndef CALCULATOR_HELPER_H
#define CALCULATOR_HELPER_H
#endif

Ist ein "Include Guard". Aber es ist falsch gemacht: Ihr Code soll vor dem #endif stehen, nicht danach.

Extratipp: Verwenden Sie das Wort "helper" nicht im Code - es gibt immer ein besseres. Wie in diesem Fall könnten Sie es CALCULATOR_MATH_H nennen.

1voto

Robin Mallinson Punkte 11

Der Linker sagt Ihnen, dass es zwei Definitionen von "add" gibt. Ignorieren wir für einen Moment die gültigen Punkte, die von den anderen Antworten aufgeworfen wurden, baut Ihr Code so, wie er auf Ubuntu 12.04.2 mit gcc auf der Befehlszeile ist. Ich habe es so gebaut und keine Warnungen gesehen (libcunit.a nach /usr/local/lib installiert):

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

und es lief, scheiterte, wie Sie es bei Ihrem Test erwarten könnten:

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

Da dies der Fall ist, scheint Ihr Problem entweder durch etwas in Netbeans verursacht zu werden, das auch eine "add"-Funktion definiert, oder Ihr Build enthält mehr als das, was Sie gepostet haben, und andere Dateien enthalten "calculator_helper.h", was dazu führen würde, dass Ihre Funktion aufgrund ihres fehlerhaften Include-Schutzes zweimal enthalten und definiert wird.

Sie könnten auch das Testverfahren ändern, damit es behauptet, was es für wahr hält. Ihr aktueller Test scheitert an einer Behauptung, wenn add() das Richtige tut, was die meisten Menschen nicht erwarten würden! Versuchen Sie stattdessen dies:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X