背景
我们开发的是嵌入式单板,以前打开某个文件,文件直接定义为单板里的路径,导致了单元测试(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 里定义的,代表项目根目录。
这样,就解决了单元测试中,查找文件的问题了
寻找更漂亮的解决方案
有高人有更好的解决方案,还请指教