c - 使用 glibc 进行单元测试会导致 g_test_fail() 出现段错误

标签 c unit-testing glib

我一直在尝试使用 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;
} 

最佳答案

这是没有 --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 运行则不会

关于c - 使用 glibc 进行单元测试会导致 g_test_fail() 出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16710964/

相关文章:

c - 使用 Linux 接收系统 key 的信号?

c - 在 libpango 中调用 pango_cairo_font_map_get_default() 时出现 "GLib-GObject-CRITICAL"的原因是什么?

c - 为什么 printf 有返回值?

c - 单击按钮后,为什么我的窗口卡住了?

objective-c - 如何改进我的代码(C/Objective C)乒乓球游戏

unit-testing - IO返回值测试

c# - 单元测试顺序约定?

javascript - 如何在 Jest 测试中测试链式 promise ?

c - 二进制数中1的个数

C CSV GLOB排序优化