我一直在尝试使用glib进行单元测试并遇到麻烦。如果单个部件出现故障,我感兴趣的是一种不中止测试剩余部分的方法。我一直试图使用g_test_fail()来做到这一点,但是当测试结束时会产生段错误。如果我注释掉g_test_fail(),则报告测试在正常的程序终止时成功。
使用gdb逐步执行程序我可以告诉测试函数按预期退出,并且错误发生在glib库中的某处。
有什么想法吗?
我的示例测试文件如下:
//
// 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;
}
答案 0 :(得分:1)
这是没有--keep-going
的正常行为。即使是缩小的测试用例也会在第一次错误时中止:
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