前言
跨平台的中间件往往需要分别为Linux/Solaris/Windows三个平台制作自动化测试集,以满足削减测试工数的需求。
Linux/Solaris的差异性不是非常大,往往可以使用同一个测试集进行少量修改后适应不同的OS。
Windows和Unix系列差异太大,以至于测试人员往往需要学习两种不同的脚本语言:shell和bat。
对于已经拥有成熟的Unix平台测试集的产品,使用CYGWIN进行测试集移植,将是熟悉shell,却被迫转向Windows测试的人们的最佳选择。
由于Windows和Unix的差异性,以及纯粹的Unixshell环境和CYGWIN环境的差异性,测试集的移植比想象的要复杂。本文使用Q/A的方式,将项目组遇到过的问题一一罗列,以便于大家参考。
Q1 执行dos风格路径的命令时报错
例如
'c:\Windows\System32\find' cygwin warning: MS-DOS style path detected:… |
A1 使用”cmd /c”命令可以解决。
例如
cmd /c 'c:\Windows\System32\find' |
Q2 怎样在bat中调用shell脚本?
A2 使用“sh”命令可以解决。
例如
sh b.sh |
Q3 shell脚本提示有语法错误,但是查不原因
A3 常见的原因是换行符问题。Windows下编辑shell脚本时很可能使得换行符成为CR+LF。对策:
/usr/bin/find.exe ${ROOT_DIR}/ -name "*.sh" -exec dos2unix {} \; |
ROOT_DIR为测试集根目录。
Q4 测试集运行过程中生成的临时文件无权限访问
A4 由于Windows的权限控制,Cygwin环境启动的脚本的子进程可能无法访问一些Windows守护进程生成的文件。对此只能在这些临时文件生成时进行权限修改。
例:
#!/bin/sh -x
# LOOP 10 times per second.Max = 6000s MAX_WAIT_COUT=60000 LOOP=0 $* & # 脚本的参数是向守护进程发送请求,使守护进程生成临时文件的命令,例如java命令
while [ ${LOOP} -le ${MAX_WAIT_COUT} ] do ps -ef | grep java > /dev/null # 判断java命令是否存在,如果存在,则尝试更新临时文件的权限。这里可以根据实际情况判断临时文件是否已被生成,是否需要加一些处理让后续操作等待chmod结束。 if [ $? = 0 ]; then chmod -R 777 ${ROOT_DIR}/xxx/output_* > /dev/null 2>&1 else echo "wait end(LOOP=${LOOP})" exit 0 fi LOOP=`expr ${LOOP} + 1` if [ ${LOOP} = 3000 ]; then echo "The following process has run over 5min. If it's not the test program, please kill it." echo "Process name: $1" fi sleep 0.1 done |
Q5 测试集中有大量的Unix特有路径,比如软件的安装路径/opt,在Windows下都不存在
A5 可以用“ln -s”命令解决。创建链接后Cygwin可以通过链接来访问Windows的实际路径,无需修改测试集中的Unix风格路径。
例如
XXX_WINDOWS="C:\\XXX" mkdir -p /opt ln -s ${XXX_WINDOWS} /opt/XXX |
但是有例外:
Windows命令中如果有参数包含文件路径,一般需要转换为DOS风格路径才能正确运行。转换方法:使用cygpath命令。例如:
PARAM="/opt/XXX" abc.exe `cygpath -w ${PARAM}` |
Q6 java命令出现错误“java.lang.ClassNotFoundException:Files”,找不到原因
A6 这种错误一般出现于Windows环境的java指定了-cp参数时。Windows的CLASSPATH常常包含“C:\Program Files\...”这样的字符串,其中的空格易被java命令解析为参数分隔符,导致“Files”被理解为class名。
对策1:-cp后的字符串用双引号标注,防止空格被单独解析。
对策2:不使用-cp的方式,改为export CLASSPATH。
Q7 CLASSPATH中设置了正确的jar路径还是找不到class
A7 Cygwin环境中,PATH是可以设置为Unix风格路径的,Cygwin会在运行Windows命令时自动将PATH转换为Windows风格路径。
但是Cygwin没有为CLASSPATH进行自动转换处理。必须设置为Windows风格路径并以分号分隔。
参考方法:
export CLASSPATH="C:\\a\\b.jar;C:\\a\\c.jar;$CLASSPATH" |
或者
MY_CLASSPATH=`cygpath -w /a/b/c.jar` export CLASSPATH="$MY_CLASSPATH;$CLASSPATH" |
Q8 LD_LIBRARY_PATH在Cygwin环境怎么处理
A8 LD_LIBRARY_PATH是Unix环境中用于指定库文件(*.so等)路径的,Windows下库文件(*.dll)路径对应的环境变量为PATH,因此Cygwin中可以这样处理:
export LD_LIBRARY_PATH=/a/b export PATH=/c/d # 原测试集的PATH export PATH=$PATH:$LD_LIBRARY_PATH # 追加LD_LIBRARY_PATH到PATH中 |