2013-05-23 2 views
0

unittesting을 시도하고 문제가 발생했습니다. 한 부분이 실패 할 경우 테스트의 나머지 부분을 중단하지 않는 방법에 관심이 있습니다. g_test_fail()을 사용하여이 작업을 시도했지만 테스트가 끝나면 segfault가 발생합니다. g_test_fail()을 주석 처리하면 테스트는 정상적인 프로그램 종료로 성공한 것으로보고됩니다.gtest_fail()을 사용하여 glib로 유닛 테스팅을 수행하면 segfault가 발생합니다.

gdb로 프로그램을 실행하면 테스트 기능이 예상대로 종료되고 결함이 glib 라이브러리의 어딘가에서 발생 함을 알 수 있습니다.

아이디어가 있으십니까? --keep-going없이 정상적인 동작입니다

// 
// Unit Test with GLib 
// 
// 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <glib.h> 


typedef struct TestFixture_T { 
    unsigned int uiA; 
    unsigned int uiB; 
    char szString[16]; 
} TestFixture_T; 

void TestFixtureContructor(TestFixture_T* pFixture, gconstpointer pg) { 
    pFixture->uiA = 1u; 
    pFixture->uiB = 2u; 
    strcpy(pFixture->szString, "Blank"); 
} 

void TestFixtureDestructor(TestFixture_T* pFixture, gconstpointer pg) { 
    pFixture->uiA = 0u; 
    pFixture->uiB = 0u; 
    strcpy(pFixture->szString, ""); 
} 

gboolean TestFixtureCompare(TestFixture_T* pFixtureA, TestFixture_T* pFixtureB) { 
    return pFixtureA->uiA == pFixtureB->uiA 
    && pFixtureA->uiB == pFixtureB->uiB 
    && strcmp(pFixtureA->szString, pFixtureB->szString) == 0; 
} 


void test_this(TestFixture_T* pFixtureInput, gconstpointer pg) { 
    TestFixture_T LocalFixture; 
    TestFixtureContructor(&LocalFixture, NULL); 
    if(!TestFixtureCompare(&LocalFixture, pFixtureInput)) { 
    g_test_fail(); // <-- This is the trouble spot. Comment this out and there is no segfault. 
    } 
} 

int main(int argc, char** argv) { 
    /* Initialize test framework */ 
    g_test_init(&argc, &argv, NULL); 

    /* Add test */ 
    TestFixture_T Fixture; 
    g_test_add("/MyFirstTest", 
     TestFixture_T, 
     &Fixture, 
     TestFixtureContructor, 
     test_this, 
     TestFixtureDestructor 
    ); 
    g_test_add("/MySecondTest", 
     TestFixture_T, 
     &Fixture, 
     NULL, 
     test_this, 
     NULL 
    ); 

    int result = g_test_run(); 

    printf("...aaaaand scene!\n"); 

    return result; 
} 

답변

1

을 다음과 같이

내 예제 테스트 파일입니다. 심지어 감소 된 테스트 케이스는 첫 번째 오류에 중단 :

int main(int argc, char **argv) { 
    g_test_init(&argc, &argv, NULL); 
    g_test_add_func("/fail", g_test_fail); 
    return g_test_run(); 
} 

하지만 --keep-going

+0

알고 유용하지만 실행하면 --keep-가는 프로그램을 실행할 때 세그먼트 폴트를 방지하지 않습니다. - 아뇨, ​​미안 해요. 그냥 다시 시도하기 전에 깨끗하게 만드는 것을 잊었습니다. – Kenneth

관련 문제