您的位置:首页 > 其它

自动化测试之CYGWIN

2016-04-12 11:03 316 查看

前言

跨平台的中间件往往需要分别为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中

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: