自动化测试之CYGWIN



前言

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值