HarryWei / cloudxy

Automatically exported from code.google.com/p/cloudxy
6 stars 3 forks source link

hardcode when use system call for unit-test's setup and teardown #8

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
bug描述
=======
我们在单测时,我们需要setup(一些初始化工作)和teardown(销毁�
��回收工作),
我们开始都是自己全部从头写的,但是为了降低耦合度(这��
�是单测的核心工作),
我们采用系统调用来执行我们存在的一些app或者系统本身的(�
��如mkfs.hlfs,等)来进行
setup和teardown(这样也很方便)。这就存在一个问题,当你执�
��system时,这个app
的路径如何确定呢??(这里我们指的是我们的app没有安装到�
��器上)

bug分析(这里以test_hlfs_take_snapshot.c为例)
====================================
[snip]

static void 
hlfs_take_snapshot_setup(Fixture *fixture, const void *data) {
    const char *test_dir = (const char *)data;
    g_print("test env dir is %s\n", test_dir);
    char *fs_dir = g_build_filename(test_dir, "testfs", NULL);
//  g_assert(g_mkdir(fs_dir, 0700) == 0);
    char *uri = g_malloc0(128);
    g_assert(uri != NULL);
    snprintf(uri, 128, "%s%s", "local://", fs_dir);
//  char *uri = g_build_path(tmp, fs_dir, NULL);
    g_print("uri is %s\n", uri);
    pid_t status;
    const char cmd[256];
    memset((char *) cmd, 0, 256);
    sprintf((char *) cmd, "%s %s %s %s %d %s %d %s %d", "../../../../output/bin/mkfs.hlfs", 
                                "-u", uri,
                                "-b", 8192,
                                "-s", 67108864,
                                "-m", 1024);
    g_message("cmd is [%s]", cmd);
    status = system(cmd);
    fixture->uri = uri;
    g_print("fixture->uri is %s\n", fixture->uri);
    fixture->ctrl = init_hlfs(fixture->uri);
    g_assert(fixture->ctrl != NULL);
    int ret = hlfs_open(fixture->ctrl, 1);
    g_assert(ret == 0);
//  g_key_file_free(sb_keyfile);
//  g_free(sb_file_path);
    g_free(fs_dir);
    return ;
}
[snip]
static void 
hlfs_take_snapshot_tear_down(Fixture *fixture, const void *data) {
    const char *test_dir = (const char *) data;
    g_print("clean dir path: %s\n", test_dir);
    char *fs_dir = g_build_filename(test_dir, "testfs", NULL);
    pid_t status;
    const char cmd[256];
    memset((char *) cmd, 0, 256);
    sprintf((char *) cmd, "%s %s %s", "rm", "-r", fs_dir);
    g_message("cmd is [%s]", cmd);
    status = system(cmd);
    g_free(fs_dir);
    g_free(fixture->uri);
    hlfs_close(fixture->ctrl);
    deinit_hlfs(fixture->ctrl);
    return;
}
[snip]

这个测试用例,我就做成了硬编码,这样不好,肯定有问题��
�如下
sprintf((char *) cmd, "%s %s %s %s %d %s %d %s %d", 
"../../../../output/bin/mkfs.hlfs", 
                                "-u", uri,
                                "-b", 8192,
                                "-s", 67108864,
                                "-m", 1024);
如果测试者的mkfs.hlfs没在 ../../../../output/bin/mkfs.hlfs, 
那么就出现问题了。

bug解决方案
============
这里给出以下方案:
1, 
安装所有app,也就是说把我们生产的所有app都安装到系统目��
�下,这样就
    可以和使用系统的命令一样很方便了。
2, 在环境变量中添加我们的生成的app路径,这样也就可以了

这里我更喜欢方案1,我将按照方案1进行fix,如有其它意见,
可以发来讨论一下 ;-) 

指导人:陈莉君老师,康华老师
测试人:贾威威
后期负责人:贾威威

Original issue reported on code.google.com by harryxi...@gmail.com on 1 Jan 2012 at 5:42

GoogleCodeExporter commented 9 years ago
这种问题解决一般都是:
在untest目录下 存放环境建设的所需程序。
也就是将mkfs.hlfs拷贝到untest下,这样能保证找到该文件。
进一步,为了确保版本一致问题。一般我们执行程序都有-v参
数打印版本(目前我们程序还没有)。 
所以setup 
中首先检测mkfs.hlfs版本是否否和要求(比如>多少),通过则执
行之

Original comment by harryxi...@gmail.com on 2 Jan 2012 at 12:48