函数

GLibtest_trap_subprocess_with_envp

since: 2.80

声明 [src]

void
g_test_trap_subprocess_with_envp (
  const char* test_path,
  const char* const* envp,
  guint64 usec_timeout,
  GTestSubprocessFlags test_flags
)

描述 [src]

重生测试程序以仅在具有给定环境的子进程中运行 test_path

可用于可能不会返回或可能中止的测试用例。

如果 test_pathNULL,则在子进程中重新运行同一测试。可以使用 g_test_subprocess() 来确定测试是否在子进程中。

test_path 还可以是父测试的名称,后跟“/subprocess/”,然后为特定子测试指定一个名称(如果测试只有一个子测试,则仅以“/subprocess”结尾);具有此类名称的测试将自动在父进程中跳过。

如果 envpNULL,则将继承父进程的环境。

如果 usec_timeout 非 0,则如果测试子进程运行时间超过 usec_timeout,则中止测试子进程并将其视为失败。

可以使用 GTestSubprocessFlags 标志来配置子进程行为。

可以使用诸如 g_test_trap_assert_passed()g_test_trap_assert_failed()g_test_trap_assert_stderr() 的方法来检查子进程的结果。(但请注意,如果 test_flags 指定子级应继承父级 stdout/stderr,则无法使用 g_test_trap_assert_stdout()g_test_trap_assert_stderr()。)

如果 main () 需要在子进程中表现得不同,则可以在调用 g_test_init()(在调用 g_test_subprocess() 之后)以查看是否在子进程中。

在内部,此函数使用 g_child_watch_source_new() 跟踪子进程,因此进程不得忽略 SIGCHLD,也不得尝试通过其他机制监视或等待子进程。

以下示例测试调用 my_object_new(1000000) 将中止并显示错误消息。

  static void
  test_create_large_object (void)
  {
    if (g_test_subprocess ())
      {
        my_object_new (1000000);
        return;
      }

    // Reruns this same test in a subprocess
    g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT);
    g_test_trap_assert_failed ();
    g_test_trap_assert_stderr ("*ERROR*too large*");
  }

  static void
  test_different_username (void)
  {
    if (g_test_subprocess ())
      {
        // Code under test goes here
        g_message ("Username is now simulated as %s", g_getenv ("USER"));
        return;
      }

    // Reruns this same test in a subprocess
    g_autoptr(GStrv) envp = g_get_environ ();
    envp = g_environ_setenv (g_steal_pointer (&envp), "USER", "charlie", TRUE);
    g_test_trap_subprocess_with_envp (NULL, envp, 0, G_TEST_SUBPROCESS_DEFAULT);
    g_test_trap_assert_passed ();
    g_test_trap_assert_stdout ("Username is now simulated as charlie");
  }

  int
  main (int argc, char **argv)
  {
    g_test_init (&argc, &argv, NULL);

    g_test_add_func ("/myobject/create-large-object",
                     test_create_large_object);
    g_test_add_func ("/myobject/different-username",
                     test_different_username);
    return g_test_run ();
  }

自 2.80 起可用

参数

test_path

类型: const char*

在子进程中运行的测试。

该参数可以是 NULL
该数据由函数调用者所有。
该值是一个 NUL 终止的 UTF-8 字符串。
envp

类型: 一个 filename 数组

运行测试的 环境。

该参数可以是 NULL
该数组必须以 NULL 结尾。
该数据由函数调用者所有。
每个元素都是一个平台原生字符串,使用 Unix 上首选 OS 编码和 Windows 上的 UTF-8。
usec_timeout

类型: guint64

子进程测试的超时时间(以微秒为单位)。

test_flags

类型: GTestSubprocessFlags

修改子进程的标志行为。