用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的安装包里面找的到了。
如图所示;

 
代码:
-----------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
--------
posted on 2010-10-13 11:31  Jessica Lu  阅读(791)  评论(0)    收藏  举报