函数
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_path
是 NULL
,则在子进程中重新运行同一测试。可以使用 g_test_subprocess()
来确定测试是否在子进程中。
test_path
还可以是父测试的名称,后跟“/subprocess/
”,然后为特定子测试指定一个名称(如果测试只有一个子测试,则仅以“/subprocess
”结尾);具有此类名称的测试将自动在父进程中跳过。
如果 envp
是 NULL
,则将继承父进程的环境。
如果 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 起可用