单元测试中解决不同环境下的文件路径问题

背景

我们开发的是嵌入式单板,以前打开某个文件,文件直接定义为单板里的路径,导致了单元测试(PC上运行)时,无法在对应路径找到该文件

我们的一个解决方法

不定义死一个文件路径
以前采用

#define XX_FILE /root/power/etc/xx.xml

现在采用

char *get_home_path(void){
    return "/root";
}

int get_nova_xml_path(char *xml_path, size_t size){
    int ret = snprintf(xml_path, size, "%s/esmu/etc/south/nova/%s",get_home_path(), FILE_LEDSCREEN_NOVA_XML);
    return ret;
}

拼接起来。

这样的好处是:
单元测试可以采用mock的方法将get_home_path MOCK掉,在单元测试中,home目录就是你的svn代码根目录,自然就能找到你需要的文件了。

实践过程如下:

在mock文件里加入如下函数

char * mock_get_home_path(void){
    /* this MACRO is from unittest/config/headless.mak */
    return getenv("WORKSPACE");
}

选择WORKSPACE的原因是,jenkins会有一个WORKSPACE,一般代表svn里的根目录,所以沿用这个变量。

这里的问题来了,普通的模块调试时,只需要执行make,那如何在makefile中export出WORKSPACE呢,其实这是个很难直接实现的事(makefile中,$(shell export)只会将变量export到子进程中,无法影响外面的shell环境)。
经过一番尝试,在cpputest的build文件夹里,找到MakefileWorker.mk,这里面有直接让程序运行的地方,因此,在调用程序运行前加入export 就可以了。
目标行

RUN_TEST_TARGET = $(SILENCE)  $(GCOV_CLEAN) ; echo "Running $(TEST_TARGET)";./    $(TEST_TARGET) $(CPPUTEST_EXE_FLAGS)

修改后

RUN_TEST_TARGET = $(SILENCE)  $(GCOV_CLEAN) ; echo "Running $(TEST_TARGET)"; export WORKSPACE=${PROJECT_HOME};./    $(TEST_TARGET) $(CPPUTEST_EXE_FLAGS)

其中,${PROJECT_HOME}是在headless.mak 里定义的,代表项目根目录。

这样,就解决了单元测试中,查找文件的问题了

寻找更漂亮的解决方案

有高人有更好的解决方案,还请指教

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值