用JAVA写STAF测试框架扩展service 学习
这是我写的的第一个JAVA程序,呵呵。
因为工作用到STAF(源自IBM的一个开源测试框架,用起来感觉还不错。可以看我以前发的一篇关于STAF的文章),staf是基于不同的service的,通过请求各种service来请求各种测试。我看到别人写了service在里面,而且有jstaf类型的,所以一时兴起,也学着用java写过扩展service。以前从没用过java,这次也是纯粹是玩玩而已。不过想不到那么简单,复制人家的例子过来在Eclipse 中竟然很顺利的就编译通过了,一个编译错误都没遇到。倒是花了点时间去找Eclipse中怎么添加外部jar库进来(我是第一次用Eclipse^_^ )。
参考资料 :http://staf.sourceforge.net/current/stafsdg.html
STAF资料 : http://staf.sourceforge.net/index.php
在 Eclipse 中新建一个工程,工程属性里面 -》java bulldpath -》liberary 里面添加外部扩展库,把 staf的JSTAF.jar库添加进来。
JSTAF.jar可以在 staf的安装包里面找的到了。
如图所示;
这是我写的的第一个JAVA程序,呵呵。
因为工作用到STAF(源自IBM的一个开源测试框架,用起来感觉还不错。可以看我以前发的一篇关于STAF的文章),staf是基于不同的service的,通过请求各种service来请求各种测试。我看到别人写了service在里面,而且有jstaf类型的,所以一时兴起,也学着用java写过扩展service。以前从没用过java,这次也是纯粹是玩玩而已。不过想不到那么简单,复制人家的例子过来在Eclipse 中竟然很顺利的就编译通过了,一个编译错误都没遇到。倒是花了点时间去找Eclipse中怎么添加外部jar库进来(我是第一次用Eclipse^_^ )。
在 Eclipse 中新建一个工程,工程属性里面 -》java bulldpath -》liberary 里面添加外部扩展库,把 staf的JSTAF.jar库添加进来。
JSTAF.jar可以在 staf的安装包里面找的到了。
如图所示;

代码:
-----------widebrightservice.java-------------------------------------------------------------------------------------------
/*****************************************************************************/
/* Software Testing Automation Framework (STAF) */
/* (C) Copyright widebright */
/*http://staf.sourceforge.net/current/stafsdg.html */
/* */
/* This software is licensed under the Common Public License (CPL) V1.0. */
/*****************************************************************************/
package widebright;
import com.ibm.staf.*; //添加staf库的引用
import com.ibm.staf.service.*; //添加staf库的引用
import java.util.StringTokenizer;
public class widebrightservice implements STAFServiceInterfaceLevel30 {
private final String kVersion = "3.0.2";
private String fServiceName;
private STAFHandle fHandle;
private String fLocalMachineName = "";
// Define any error codes unique to this service
private static final int kDeviceInvalidSerialNumber = 4001;
// STAFCommandParsers for each request
private STAFCommandParser fQueryParser;
private String fLineSep;
public widebrightservice () {}
public STAFResult init(STAFServiceInterfaceLevel30.InitInfo info)
{
try
{
fServiceName = info.name; //service 的名字
fHandle = new STAFHandle("STAF/Service/" + info.name); //注册service
}
catch (STAFException e)
{
return new STAFResult(STAFResult.STAFRegistrationError,
e.toString());
}
//为请求字符串申请解析器
// QUERY parser
fQueryParser = new STAFCommandParser();
// STAFCommandParser.VALUENOTALLOWED 表示请求时不能给 QUERY传一个值
fQueryParser.addOption("QUERY", 1,
STAFCommandParser.VALUENOTALLOWED);
//STAFCommandParser.VALUEREQUIRED 表示请求时可以给 NAME传一个值,但不是必须的
fQueryParser.addOption("NAME", 1,
STAFCommandParser.VALUEALLOWED);
//STAFCommandParser.VALUEREQUIRED 表示请求时必须给 EDUCATION传一个值
fQueryParser.addOption("EDUCATION", 1,
STAFCommandParser.VALUEREQUIRED);
// 这个表明你需要NAME 和 EDUCATION , 但不能两个都有
fQueryParser.addOptionGroup("NAME EDUCATION", 0, 1);
// 如果你指定了 NAME 或者 EDUCATION , QUERY是必须的
fQueryParser.addOptionNeed("NAME EDUCATION", "QUERY");
// 如果你指定了QUERY, 需要NAME 或者 EDUCATION
fQueryParser.addOptionNeed("QUERY", "NAME EDUCATION");
STAFResult res = new STAFResult();
// 获取STAF设置中本机的换行符,(linux和Windows的换行标志就不一样)
res = STAFUtil.resolveInitVar("{STAF/Config/Sep/Line}", fHandle);
if (res.rc != STAFResult.Ok) return res;
fLineSep = res.result;
//从STAF设置中获取本机的 机器名字
res = STAFUtil.resolveInitVar("{STAF/Config/Machine}", fHandle);
if (res.rc != STAFResult.Ok) return res;
fLocalMachineName = res.result;
// Register Help Data
registerHelpData(
kDeviceInvalidSerialNumber,
"Invalid serial number",
"A non-numeric value was specified for serial number");
return new STAFResult(STAFResult.Ok);
}
public STAFResult acceptRequest(STAFServiceInterfaceLevel30.RequestInfo info)
{
String lowerRequest = info.request.toLowerCase();
StringTokenizer requestTokenizer = new StringTokenizer(lowerRequest);
String request = requestTokenizer.nextToken();
// Call the appropriate method to handle the command
if (request.equals("query"))
return handleQuery(info);
else if (request.equals("help"))
return handleHelp(info);
else if (request.equals("version"))
return handleVersion(info);
else
{
return new STAFResult(
STAFResult.InvalidRequestString,
"Unknown widebright Service Request: " + lowerRequest);
}
}
private STAFResult handleHelp(STAFServiceInterfaceLevel30.RequestInfo info)
{
// 确认请求者至少拥有 level 1 的胜任级别,显示帮助需要这个level ?
STAFResult trustResult = STAFUtil.validateTrust(
1, fServiceName, "HELP", fLocalMachineName, info);
if (trustResult.rc != STAFResult.Ok) return trustResult;
// Return help text for the service
return new STAFResult(
STAFResult.Ok,
"widebright Service Help" + fLineSep +
fLineSep +
"QUERY NAME <Name> | EDUCATION <Education>" + fLineSep +
"VERSION" + fLineSep + "HELP");
}
private STAFResult handleVersion(
STAFServiceInterfaceLevel30.RequestInfo info)
{
// 确认请求者至少拥有 level 1 的胜任级别,显示版本信息需要这个level ?
STAFResult trustResult = STAFUtil.validateTrust(
1, fServiceName, "VERSION", fLocalMachineName, info);
if (trustResult.rc != STAFResult.Ok) return trustResult;
//返回这个 service 的版本
return new STAFResult(STAFResult.Ok, kVersion);
}
private STAFResult handleQuery(STAFServiceInterfaceLevel30.RequestInfo info)
{
// 确认请求者至少拥有 level 2 的胜任级别,请求需要这个level ?
STAFResult trustResult = STAFUtil.validateTrust(
2, fServiceName, "QUERY", fLocalMachineName, info);
if (trustResult.rc != STAFResult.Ok) return trustResult;
// 解析请求字符串
STAFCommandParseResult parsedRequest = fQueryParser.parse(info.request);
if (parsedRequest.rc != STAFResult.Ok)
{
return new STAFResult(STAFResult.InvalidRequestString,
parsedRequest.errorBuffer);
}
//得到 任何 STAF variables , NAME 选项'的值
STAFResult res = new STAFResult();
res = STAFUtil.resolveRequestVar(
parsedRequest.optionValue("name"), fHandle, info.requestNumber);
if (res.rc != STAFResult.Ok) return res;
String name = res.result;
//得到 任何 STAF variables , Education 选项'的值
res = STAFUtil.resolveRequestVar(
parsedRequest.optionValue("education"), fHandle, info.requestNumber);
if (res.rc != STAFResult.Ok) return res;
String education = res.result;
if (!name.equals(""))
{
return new STAFResult(STAFResult.Ok, "my name is widebright.");
}
else if (!education.equals(""))
{
if ( education.equals("daxue"))
{
return new STAFResult(STAFResult.Ok, "SCUT");
}
else if ( education.equals("zhongxue"))
{
return new STAFResult(STAFResult.Ok, "bu ji de le ^_^");
}
else
{
return new STAFResult(STAFResult.DoesNotExist, name);
}
}
return new STAFResult(STAFResult.Ok, "ni xiang yao gan shen me ?");
}
public STAFResult term()
{
try
{
// Un-register Help Data
unregisterHelpData(kDeviceInvalidSerialNumber);
// Un-register the service handle
fHandle.unRegister();
}
catch (STAFException ex)
{
return new STAFResult(STAFResult.STAFRegistrationError,
ex.toString());
}
return new STAFResult(STAFResult.Ok);
}
// Register error codes for the STAX Service with the HELP service
private void registerHelpData(int errorNumber, String info,
String description)
{
STAFResult res = fHandle.submit2(
"local", "HELP", "REGISTER SERVICE " + fServiceName +
" ERROR " + errorNumber +
" INFO " + STAFUtil.wrapData(info) +
" DESCRIPTION " + STAFUtil.wrapData(description));
}
// Un-register error codes for the STAX Service with the HELP service
private void unregisterHelpData(int errorNumber)
{
STAFResult res = fHandle.submit2(
"local", "HELP", "UNREGISTER SERVICE " + fServiceName +
" ERROR " + errorNumber);
}
}
---------------------------------------------------------------------------------------------------------
完了编译一下就可以了。不过STAF要求注册的service是一个jar包,而且包里面的文件按一定的规定。
就是有个MANIFEST.MF 文件还有 一个STAF-INF文件夹。可以文章开始部分参考资料那个网页来得到详细信息了。
我是在一个linux服务器上测试的,一开始本机编译一个 *.jar过去,注册的时候竟然提示java版本不对,后来把*.java代码直接传过去然后在那里本地编译了一下才行。
这个就是完整的文件结构信息了,只要最后的那个widebright.jar就可以注册service了。
mkdir STAF-INF
mkdir STAF-INF/classes 要按照一定的文件夹结构
[root@Computer-A widebright]# javac -d STAF-INF/classes *.java 编译代码
[root@Computer-A widebright]# jar cfm widebright.jar MANIFEST.MF STAF-INF 打包 jar文件
[root@Computer-A widebright]# find ./
./
./widebright.jar
./MANIFEST.MF
./STAF-INF
./STAF-INF/classes
./STAF-INF/classes/widebright
./STAF-INF/classes/widebright/widebrightservice.class
./widebrightservice.java
--------------------------------------------
MANIFEST.MF文件内容如下,只要根据需要修改Service-Class:后面的字符串指定 package 和类名就可以了,这里要写对才行,不然注册不成功的。
[root@Computer-A widebright]# cat MANIFEST.MF
Manifest-Version: 1.0
Name: staf/service/info
Service-Class: widebright.widebrightservice
-------------------------------------------------
注册自己的jstaf service到staf服务里里面 ,如果不会用staf命令去参考我前面提供的网站了,就不多说了。
[root@Computer-A widebright]# staf local SERVICE ADD SERVICE widebrightservice LIBRARY JSTAF EXECUTE /widebright/widebright.jar
Response
--------
下面列出来的本地的service,可以看到自己的扩展service已经成功添加到staf里面了。
[root@Computer-A widebright]# staf local service list
Response
--------
Name Library Executable
----------------- ----------- ---------------------------------------------
CLI <Delegated> <None>
DELAY <Internal> <None>
DIAG <Internal> <None>
ECHO <Internal> <None>
FS <Internal> <None>
HANDLE <Internal> <None>
HELP <Internal> <None>
MISC <Internal> <None>
PING <Internal> <None>
PROCESS <Internal> <None>
QUEUE <Internal> <None>
SEM <Internal> <None>
SERVICE <Internal> <None>
SHUTDOWN <Internal> <None>
TRACE <Internal> <None>
TRUST <Internal> <None>
VAR <Internal> <None>
WIDEBRIGHTSERVICE JSTAF /widebright/widebright.jar
--------------------------------------------------
下面 利用staf命令简单的测试了一下自己的测个service
[root@Computer-A widebright]# staf local widebrightservice query name
Response
--------
ni xiang yao gan shen me ?
[root@Computer-A widebright]# staf local widebrightservice help
Response
--------
widebright Service Help
QUERY NAME <Name> | EDUCATION <Education>
VERSION
HELP
[root@Computer-A widebright]# staf local widebrightservice query education daxue
Response
--------
SCUT
[root@Computer-A widebright]# staf local widebrightservice query education zhongxue
Response
--------
bu ji de le ^_^
[root@Computer-A widebright]# staf local widebrightservice query name me
Response
--------
my name is widebright.
又从远程机器上测试了一下,也是可以的。
[root@Computer-B root]# staf 172.27.226.77 widebrightservice query name a
Response
--------
my name is widebright.
好了测试完成,最后把service从列表里面删除了,不然让别人发现说我在那里玩就不好了^_^
[root@Computer-A widebright]# staf local service remove SERVICE widebrightservice
Response
--------
-----------widebrightservice.java-------------------------------------------------------------------------------------------
/*****************************************************************************/
/* Software Testing Automation Framework (STAF) */
/* (C) Copyright widebright */
/*
/* */
/* This software is licensed under the Common Public License (CPL) V1.0. */
/*****************************************************************************/
package widebright;
import com.ibm.staf.*; //添加staf库的引用
import com.ibm.staf.service.*; //添加staf库的引用
import java.util.StringTokenizer;
public class widebrightservice implements STAFServiceInterfaceLevel30 {
private final String kVersion = "3.0.2";
private String fServiceName;
private STAFHandle fHandle;
private String fLocalMachineName = "";
// Define any error codes unique to this service
private static final int kDeviceInvalidSerialNumber = 4001;
// STAFCommandParsers for each request
private STAFCommandParser fQueryParser;
private String fLineSep;
public widebrightservice () {}
public STAFResult init(STAFServiceInterfaceLevel30.InitInfo info)
{
try
{
fServiceName = info.name; //service 的名字
fHandle = new STAFHandle("STAF/Service/" + info.name); //注册service
}
catch (STAFException e)
{
return new STAFResult(STAFResult.STAFRegistrationError,
e.toString());
}
//为请求字符串申请解析器
// QUERY parser
fQueryParser = new STAFCommandParser();
// STAFCommandParser.VALUENOTALLOWED 表示请求时不能给 QUERY传一个值
fQueryParser.addOption("QUERY", 1,
STAFCommandParser.VALUENOTALLOWED);
//STAFCommandParser.VALUEREQUIRED 表示请求时可以给 NAME传一个值,但不是必须的
fQueryParser.addOption("NAME", 1,
STAFCommandParser.VALUEALLOWED);
//STAFCommandParser.VALUEREQUIRED 表示请求时必须给 EDUCATION传一个值
fQueryParser.addOption("EDUCATION", 1,
STAFCommandParser.VALUEREQUIRED);
// 这个表明你需要NAME 和 EDUCATION , 但不能两个都有
fQueryParser.addOptionGroup("NAME EDUCATION", 0, 1);
// 如果你指定了 NAME 或者 EDUCATION , QUERY是必须的
fQueryParser.addOptionNeed("NAME EDUCATION", "QUERY");
// 如果你指定了QUERY, 需要NAME 或者 EDUCATION
fQueryParser.addOptionNeed("QUERY", "NAME EDUCATION");
STAFResult res = new STAFResult();
// 获取STAF设置中本机的换行符,(linux和Windows的换行标志就不一样)
res = STAFUtil.resolveInitVar("{STAF/Config/Sep/Line}", fHandle);
if (res.rc != STAFResult.Ok) return res;
fLineSep = res.result;
//从STAF设置中获取本机的 机器名字
res = STAFUtil.resolveInitVar("{STAF/Config/Machine}", fHandle);
if (res.rc != STAFResult.Ok) return res;
fLocalMachineName = res.result;
// Register Help Data
registerHelpData(
kDeviceInvalidSerialNumber,
"Invalid serial number",
"A non-numeric value was specified for serial number");
return new STAFResult(STAFResult.Ok);
}
public STAFResult acceptRequest(STAFServiceInterfaceLevel30.RequestInfo info)
{
String lowerRequest = info.request.toLowerCase();
StringTokenizer requestTokenizer = new StringTokenizer(lowerRequest);
String request = requestTokenizer.nextToken();
// Call the appropriate method to handle the command
if (request.equals("query"))
return handleQuery(info);
else if (request.equals("help"))
return handleHelp(info);
else if (request.equals("version"))
return handleVersion(info);
else
{
return new STAFResult(
STAFResult.InvalidRequestString,
"Unknown widebright Service Request: " + lowerRequest);
}
}
private STAFResult handleHelp(STAFServiceInterfaceLevel30.RequestInfo info)
{
// 确认请求者至少拥有 level 1 的胜任级别,显示帮助需要这个level ?
STAFResult trustResult = STAFUtil.validateTrust(
1, fServiceName, "HELP", fLocalMachineName, info);
if (trustResult.rc != STAFResult.Ok) return trustResult;
// Return help text for the service
return new STAFResult(
STAFResult.Ok,
"widebright Service Help" + fLineSep +
fLineSep +
"QUERY NAME <Name> | EDUCATION <Education>" + fLineSep +
"VERSION" + fLineSep + "HELP");
}
private STAFResult handleVersion(
STAFServiceInterfaceLevel30.RequestInfo info)
{
// 确认请求者至少拥有 level 1 的胜任级别,显示版本信息需要这个level ?
STAFResult trustResult = STAFUtil.validateTrust(
1, fServiceName, "VERSION", fLocalMachineName, info);
if (trustResult.rc != STAFResult.Ok) return trustResult;
//返回这个 service 的版本
return new STAFResult(STAFResult.Ok, kVersion);
}
private STAFResult handleQuery(STAFServiceInterfaceLevel30.RequestInfo info)
{
// 确认请求者至少拥有 level 2 的胜任级别,请求需要这个level ?
STAFResult trustResult = STAFUtil.validateTrust(
2, fServiceName, "QUERY", fLocalMachineName, info);
if (trustResult.rc != STAFResult.Ok) return trustResult;
// 解析请求字符串
STAFCommandParseResult parsedRequest = fQueryParser.parse(info.request);
if (parsedRequest.rc != STAFResult.Ok)
{
return new STAFResult(STAFResult.InvalidRequestString,
parsedRequest.errorBuffer);
}
//得到 任何 STAF variables , NAME 选项'的值
STAFResult res = new STAFResult();
res = STAFUtil.resolveRequestVar(
parsedRequest.optionValue("name"), fHandle, info.requestNumber);
if (res.rc != STAFResult.Ok) return res;
String name = res.result;
//得到 任何 STAF variables , Education 选项'的值
res = STAFUtil.resolveRequestVar(
parsedRequest.optionValue("education"), fHandle, info.requestNumber);
if (res.rc != STAFResult.Ok) return res;
String education = res.result;
if (!name.equals(""))
{
return new STAFResult(STAFResult.Ok, "my name is widebright.");
}
else if (!education.equals(""))
{
if ( education.equals("daxue"))
{
return new STAFResult(STAFResult.Ok, "SCUT");
}
else if ( education.equals("zhongxue"))
{
return new STAFResult(STAFResult.Ok, "bu ji de le ^_^");
}
else
{
return new STAFResult(STAFResult.DoesNotExist, name);
}
}
return new STAFResult(STAFResult.Ok, "ni xiang yao gan shen me ?");
}
public STAFResult term()
{
try
{
// Un-register Help Data
unregisterHelpData(kDeviceInvalidSerialNumber);
// Un-register the service handle
fHandle.unRegister();
}
catch (STAFException ex)
{
return new STAFResult(STAFResult.STAFRegistrationError,
ex.toString());
}
return new STAFResult(STAFResult.Ok);
}
// Register error codes for the STAX Service with the HELP service
private void registerHelpData(int errorNumber, String info,
String description)
{
STAFResult res = fHandle.submit2(
"local", "HELP", "REGISTER SERVICE " + fServiceName +
" ERROR " + errorNumber +
" INFO " + STAFUtil.wrapData(info) +
" DESCRIPTION " + STAFUtil.wrapData(description));
}
// Un-register error codes for the STAX Service with the HELP service
private void unregisterHelpData(int errorNumber)
{
STAFResult res = fHandle.submit2(
"local", "HELP", "UNREGISTER SERVICE " + fServiceName +
" ERROR " + errorNumber);
}
}
---------------------------------------------------------------------------------------------------------
完了编译一下就可以了。不过STAF要求注册的service是一个jar包,而且包里面的文件按一定的规定。
就是有个MANIFEST.MF 文件还有 一个STAF-INF文件夹。可以文章开始部分参考资料那个网页来得到详细信息了。
我是在一个linux服务器上测试的,一开始本机编译一个 *.jar过去,注册的时候竟然提示java版本不对,后来把*.java代码直接传过去然后在那里本地编译了一下才行。
这个就是完整的文件结构信息了,只要最后的那个widebright.jar就可以注册service了。
mkdir STAF-INF
mkdir STAF-INF/classes 要按照一定的文件夹结构
[root@Computer-A widebright]# javac -d STAF-INF/classes *.java 编译代码
[root@Computer-A widebright]# jar cfm widebright.jar MANIFEST.MF STAF-INF 打包 jar文件
[root@Computer-A widebright]# find ./
./
./widebright.jar
./MANIFEST.MF
./STAF-INF
./STAF-INF/classes
./STAF-INF/classes/widebright
./STAF-INF/classes/widebright/widebrightservice.class
./widebrightservice.java
--------------------------------------------
MANIFEST.MF文件内容如下,只要根据需要修改Service-Class:后面的字符串指定 package 和类名就可以了,这里要写对才行,不然注册不成功的。
[root@Computer-A widebright]# cat MANIFEST.MF
Manifest-Version: 1.0
Name: staf/service/info
Service-Class: widebright.widebrightservice
-------------------------------------------------
[root@Computer-A widebright]# staf local SERVICE ADD SERVICE widebrightservice LIBRARY JSTAF EXECUTE /widebright/widebright.jar
Response
--------
下面列出来的本地的service,可以看到自己的扩展service已经成功添加到staf里面了。
[root@Computer-A widebright]# staf local service list
Response
--------
Name Library Executable
----------------- ----------- ---------------------------------------------
CLI <Delegated> <None>
DELAY <Internal> <None>
DIAG <Internal> <None>
ECHO <Internal> <None>
FS <Internal> <None>
HANDLE <Internal> <None>
HELP <Internal> <None>
MISC <Internal> <None>
PING <Internal> <None>
PROCESS <Internal> <None>
QUEUE <Internal> <None>
SEM <Internal> <None>
SERVICE <Internal> <None>
SHUTDOWN <Internal> <None>
TRACE <Internal> <None>
TRUST <Internal> <None>
VAR <Internal> <None>
WIDEBRIGHTSERVICE JSTAF /widebright/widebright.jar
--------------------------------------------------
下面 利用staf命令简单的测试了一下自己的测个service
[root@Computer-A widebright]# staf local widebrightservice query name
Response
--------
ni xiang yao gan shen me ?
[root@Computer-A widebright]# staf local widebrightservice help
Response
--------
widebright Service Help
QUERY NAME <Name> | EDUCATION <Education>
VERSION
HELP
[root@Computer-A widebright]# staf local widebrightservice query education daxue
Response
--------
SCUT
[root@Computer-A widebright]# staf local widebrightservice query education zhongxue
Response
--------
bu ji de le ^_^
[root@Computer-A widebright]# staf local widebrightservice query name me
Response
--------
my name is widebright.
又从远程机器上测试了一下,也是可以的。
[root@Computer-B root]# staf 172.27.226.77 widebrightservice query name a
Response
--------
my name is widebright.
好了测试完成,最后把service从列表里面删除了,不然让别人发现说我在那里玩就不好了^_^
[root@Computer-A widebright]# staf local service remove SERVICE widebrightservice
Response
--------
浙公网安备 33010602011771号