作为一名iPad浏览器测试人员,经常被重复操作,机型系统覆盖等问题折磨,就在几个月前,版本上线恰好赶上newpad发布,一机难求加上时间紧迫,没有充分测试就放出去了。接下来的一个多月,随着newpad用户激增,大量的适配问题暴露出来,用户抱怨,老大吐槽,项目组反省,测试更是那个压力山大啊...
某天在微博闲逛,突然看到一条消息“全球首个iOS自动化Touch脚本测试工具横空出世”,抱着瞧瞧看的态度,随手点开了链接...
第一次接触iTestin,就是“简洁”二字,测试工具最重要的一点就是简单化,如果测试工具做的比测试本身还要复杂,那他的推广效果恐怕就要大打折扣了。iTestin在这方面做的非常赞,上手特别容易,完全不需要专业知识,下载安装注册一气呵成,连上iPad立即就可以录制了,这让我第一感觉非常好。
连下来的几天我用iPad尝试了iTestin的录制回放功能,回放效果流畅,截图清晰,各种手势都没问题,录制一个脚本在各个机器上跑就行了,心里暗喜,这下做机型覆盖可方便多了。
紧接着我又试了“云测试”功能,只要提交APP或下载网址,Testin真机适配测试报告就直接发到邮箱,测试结果清晰,图文并茂,这是多少测试人员的梦想啊....这里还有个小插曲,一开始提交APP云测试,总是显示审核失败,无奈之下用微博发了条私信给wangjun,没想到王总立即回复问我情况,第二天一早还有工作人员和我联系,跟踪解决问题,这让我不禁感慨到,对用户如此重视的公司,难怪产品体验做的这么好。
这一段时间来,我们用iTestin工具尝试做了各种类型的测试,比如功能测试,速度测试,内存测试,抓包分析等,在节约人力提高测试效率方面有了很大改进。当然,也遇到了不少实际问题,比如云测试部署的iPad机型系统太少覆盖不全,屏幕没有录制功能,浏览器闪退后不能重启等, 但我们相信,iTestin一定会越来越好越完善,在IOS测试上发挥更大的作用。
读取:
http://blog.csdn.net/Android_Tutor/article/details/6238325
第一次接触MQ(Message Query)消息队列,就是往队列里面写消息和从队列里面读取消息两种方式
package com.bulain.wasmq;
import org.apache.log4j.Logger;
import java.io.InputStream;
import java.util.Properties;
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
//----------------------------------------------
// ……
public class Main {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(Main.class);
private String strExtraSendXmlFileName = "jndi.properties";
private static Properties props;
static {
props = new Properties();
props.put("mqHostName","10.240.13.81");
props.put("mqPort","1414");
props.put("mqCCSID","932");
props.put("mqUserName","mqadmin");
props.put("mqPassword","Art515940");
props.put("mqQManager","QM_mphch085");
props.put("mqChannel","S_mphch085");
props.put("mqLocalOutQueue","clq_default_mphch085");
props.put("mqLocalInQueue","clq_default_mphch085");
}
public static void main(String[] args) {
Main test = new Main();
test.send();
test.recieve();
}
public void send() {
// MQ?送
try {
// 建立MQ客?端?用上下文?境
MQEnvironment.hostname = props.getProperty("mqHostName"); // 服?器ip地址
MQEnvironment.port = Integer.parseInt(props.getProperty("mqPort")); // 服?器MQ服?端口
MQEnvironment.CCSID = Integer.parseInt(props.getProperty("mqCCSID")); // 服?器MQ服?使用的??
MQEnvironment.channel = props.getProperty("mqChannel"); // 服?器?接通道名
MQEnvironment.userID = props.getProperty("mqUserName"); // MQ服?用?名
MQEnvironment.password = props.getProperty("mqPassword");
// ?接?列管理器
MQQueueManager qMgr = new MQQueueManager(props.getProperty("mqQManager"));
int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;
// 打?MQ?列
MQQueue q = qMgr.accessQueue(props.getProperty("mqLocalOutQueue"), openOptions);
//FileInputStream fins = new FileInputStream(new File(strExtraSendXmlFileName));
InputStream fins = ClassLoader.getSystemResourceAsStream(strExtraSendXmlFileName);
byte[] data = new byte[fins.available()];
fins.read(data);
fins.close();
MQMessage msg = new MQMessage();
msg.write(data);
// 放入消息
q.put(msg);
// ???列
q.close();
// ???列管理器
qMgr.disconnect();
} catch (MQException e) {
logger.error(e);
e.printStackTrace();
} catch (Exception e) {
logger.error(e);
e.printStackTrace();
}
}
public void recieve() {
// MQ接收
try {
// 建立MQ客?端?用上下文?境
MQEnvironment.hostname = props.getProperty("mqHostName"); // 服?器ip地址
MQEnvironment.port = Integer.parseInt(props.getProperty("mqPort")); // 服?器MQ服?端口
MQEnvironment.CCSID = Integer.parseInt(props.getProperty("mqCCSID")); // 服?器MQ服?使用的??
MQEnvironment.channel = props.getProperty("mqChannel"); // 服?器?接通道名
MQEnvironment.userID = props.getProperty("mqUserName"); // MQ服?用?名
MQEnvironment.password = props.getProperty("mqPassword");
// ?接?列管理器
MQQueueManager qMgr = new MQQueueManager(props.getProperty("mqQManager"));
int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING;
// 打?MQ?列
MQQueue q = qMgr.accessQueue(props.getProperty("mqLocalInQueue"), openOptions);
MQGetMessageOptions mgo = new MQGetMessageOptions();
mgo.options |= MQC.MQGMO_NO_WAIT;
MQMessage msg = new MQMessage();
if ((msg = fetchOneMsg(q)) != null) {
byte[] xmlData = new byte[msg.getDataLength()];
msg.readFully(xmlData);
logger.info(new String(xmlData));
}
// ???列
q.close();
// ???列管理器
qMgr.disconnect();
} catch (MQException e) {
logger.error(e);
e.printStackTrace();
} catch (Exception e) {
logger.error(e);
e.printStackTrace();
}
}
/**
* 从?列中取出一个消息
*
* @param q
* ?列名称
* @return
* @throws Exception
*/
private static MQMessage fetchOneMsg(MQQueue q) throws Exception {
MQGetMessageOptions mgo = new MQGetMessageOptions();
mgo.options |= MQC.MQGMO_NO_WAIT;
MQMessage msg = new MQMessage();
try {
// ?取消息
q.get(msg, mgo);
} catch (MQException e) {
return null;
}
return msg;
}
}