一、软件(利器)
1.1 Everything
Everything可以快速的搜索你本地硬盘(仅支持NTFS格式)的所有文件,速度秒杀一切工具,缺点就是只能根据文件名来搜索,不能根据内容来(这个Google Desktop Search也不太好用),但是这已经足够了。
详情请 via 善用佳软-Everything:速度最快的文件名搜索工具 。
Tips:尽量加一个快速打开的快捷键,比如我设置为F7,并过滤一些不想显示的文件,比如 .class 文件。
1.2 Evernote
一款极致的免费笔记资料管理软件,支持多平台(支持PC、手机多平台… 遗憾的是不支持Linux)的数据网络同步,有了它,你就可以随时记录一些“灵感”,让你不在担心“哎,昨天我想什么来着?”,借用阿秋博客里的一句话——The palest ink is better than the best memory。
1.3 Unlocker
Java开发中,很多会有依赖或者关联关系,有的时候,你想移动或者删除一个文件(夹),但是发现“它正在使用”,那这个时候你就可以使用Unlocker, 它还可以帮助你,弹出USB的时候报设备正在使用的问题。
1.4 Chrome
这个不用我说了,只要你喜欢,什么浏览器都行,用着习惯就好。
二、开源库
2.1 jdbcdslog-exp
介绍jdbcdslog-exp之前我先来介绍下jdbcdslog,jdbcdslog是一款jdbc spy的开源项目,主要用来记录SQL中参数的真实值,使用Hibernate的你,应该知道,Log中SQL有很多的 “?” ,这就是参数,但是Hibernate并不能帮助我们显示出来,有这样的需求就可以使用jdbcdslog,当然jdbcdslog的功能不止这些,详情请浏览jdbcdslog的网站 http://code.google.com/p/jdbcdslog/ 和使用指南 http://code.google.com/p/jdbcdslog/wiki/UserGuide 。
jdbcdslog-exp是jdbcdslog的加强版(原始功能全部都有),目前由我一个人在维护,她的主页在 http://code.google.com/p/jdbcdslog-exp/ (github 上也有,就不贴了,搜搜就找到了),主要是在原来的基础上,改进了SQL显示的效果,提供更多的配置,让你随心所欲的使用,并支持Maven。以前写过一篇博客——更有效地跟踪Bug——记录带有详细参数值的SQL,对比分析了几种常见的 jdbc spy 工具并介绍了 jdbcdslog-exp,大家可以看看。你还可以通过SVN Checkout下来代码
1 | svn checkout http://jdbcdslog-exp.googlecode.com/svn/trunk/
|
这里详细说一下在我们的项目中如何使用:
1). MSS-E(Weblogic)
a) 把下载好的jdbcdslog.jar(e.g. jdbcdslog-1.0.6.2.jar) 放到 domains\msseDomain\lib 下;
b) 配置classpath,Windows下修改 msseDomain\bin\setDomainEnv.cmd 中的 set PRE_CLASSPATH= … ,加上 jdbcdslog 的文件路径;
c) 可以使用 Datasource(也就是修改 primary 下的 appctx-mss-app-main.xml中的 xxDataSource ,参考jdbcdslog 的 Wiki),建议使用 jdbc config,进入 msseDomain\config\jdbc 这个文件夹,具体修改如下:
1 2 3 4 5 6 7 | <driver-name>oracle.jdbc.xa.client.OracleXADataSource</driver-name> ==> <driver-name>org.jdbcdslog.ConnectionPoolXADataSourceProxy</driver-name> <url>jdbc:oracle:thin:@10.100.53.85:1521:cmn</url> ==> <url>jdbc:oracle:thin:@10.100.53.85:1521:cmn?targetDS=oracle.jdbc.xa.client.OracleXADataSource</url>
|
请按照上面的规则,替换jdbc文件夹下所有的配置文件(有7个,实际上也可以不用所有的都替换,替换需要的就可以了,还有最好先备份,方便随时还原或者切换jdbc配置文件)。
d) 配置log4j,可以记录jdbcdslog 的 log, 修改 msseDomain\extconf\log4j.xml,添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!-- logger: jdbcdslog --> <logger name="org.jdbcdslog.StatementLogger"> <level value="INFO"/> </logger> <logger name="org.jdbcdslog.ResultSetLogger"> <level value="OFF"/> </logger> <logger name="org.jdbcdslog.SlowQueryLogger"> <level value="OFF"/> </logger> <logger name="org.jdbcdslog.ConnectionLogger"> <level value="OFF"/> </logger>
|
2). Report Server(JBoss)
a) 把下载好的jdbcdslog.jar(e.g. jdbcdslog-1.0.6.2.jar) 放到 jboss_xxx\server\rs\lib 下;
b) 修改 jboss_xxx\server\rs\deploy\oracle-xa-ds.xml 的 datasource,按照下面规则全部替换就可以了
1 2 3 4 5 6 7 | <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class> ==> <xa-datasource-class>org.jdbcdslog.ConnectionPoolXADataSourceProxy</xa-datasource-class> <xa-datasource-property name="URL">jdbc:oracle:thin:@10.100.53.85:1521:cmn</xa-datasource-property> ==> <xa-datasource-property name="URL">jdbc:oracle:thin:@10.100.53.85:1521:cmn?targetDS=oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-property>
|
c) 配置log4j,可以记录jdbcdslog 的 log,修改 jboss_xxx\server\rs\conf\log4j.xml,添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <!-- logger: jdbcdslog --> <logger name="org.jdbcdslog.StatementLogger"> <level value="INFO"/> <appender-ref ref="RS_FILE"/> </logger> <logger name="org.jdbcdslog.SlowQueryLogger" additivity="false"> <level value="INFO"/> </logger> <logger name="org.jdbcdslog.ConnectionLogger" additivity="false"> <level value="INFO"/> </logger> <logger name="org.jdbcdslog.ResultSetLogger" additivity="false"> <level value="INFO"/> </logger>
|
具体的效果,请看我如何操作:
2.2 TableDataCopier
TableDataCopier 是copy某个数据库中某个表的数据到另一个数据库中(存在同样的表结构),e.g. 能够copy SIT DB 的 mc_instr 到 Local DB 的 mc_instr。具体的可以看看它在google code的主页:http://code.google.com/p/table-data-copier/
这个是以前做 OG Capture 的时候用的,主要是想从SIT搬一些数据过来,后面就做了一个统一点、有界面的程序,方便使用。现在看看,好像也没有多大的用途,不过还是分享出来,也许大家以后用得着。你也可以通过SVN Checkout下来代码
1 | svn checkout http://table-data-copier.googlecode.com/svn/trunk/
|
也贴个运行图(仅支持 jdk1.6+):
三、SoapUI
关于SoapUI的简单使用,大家都很清楚,这里就不说了,下面说的是一些不常见的用法,再加一些性能测试方面的经验(这部分好早好早以前Lilian就有想法叫我讲的,现在只能靠这个机会弥补下了)。
3.1 File Import
MSSE 中还是有很多 File Import(Upload)类的Functions的,如果要用SoapUI做INT的话,免不了要处理 byte[] 类型的参数,那么如何通过SoapUI传递byte[](File)的参数了,实际上,也很简单,看图就很清楚了(如果看不清,麻烦请另存后再看大图,全篇文章通用)。
3.2 Property Transfer
Property Transfer 就是在SoapUI不同的Test Steps之间传递数据,具体的可以看看文档 Transferring Property Values。通过下面的实例图你就创建了一个Property Transfer并添加了一个Transfer Value,而每个Transfer Value都有两个部分,一个是Source,一个是Target,都可以选择不同的Step和不同的Property。
如何配置这些内容,请看一个例子。e.g.
在Mic2中,send msg step 需要一个参数,而这个参数是 login step 成功后的response,那么这种情况就可以这样:
贴上要写的配置信息:
Source 1 2 | declare namespace ns1='http://mic2.taifook.com/'; //ns1:loginResponse/return
|
Target 1 2 | declare namespace mic2='http://mic2.taifook.com/'; //mic2:send/arg0
|
3.3 Groovy
在SoapUI中可以写一些脚本,这个脚本语言就是 Groovy ,实际上平常我们需要使用的Groovy还是很简单的(因为和Java很类似),下面举一些例子来看看:
e.g.1
rand 1 2 | import static java.util.UUID.randomUUID randomUUID() as String
|
这个就是用UUID作为一个随机字符串的例子,在Test Step中可以这样使用(上面Groovy Script 文件名为 rand)
1 | <arg2>${rand#result}</arg2>
|
e.g.2
getAccount 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def num = Integer.parseInt(testRunner.testCase.getPropertyValue( "count" )) num = (++num) % 10 testRunner.testCase.setPropertyValue( "count", num + "") String[] acList = [ "02-0000000-22", "02-1000001-22", "02-2000002-22", "02-3000003-22", "02-4000004-22", "02-5000005-22", "02-6000006-22", "02-7000007-22", "02-8000008-22", "02-9000009-22" ] acList[num]
|
这个就是顺序并轮流从一个长度为10的字符串数组里取一个元素(第一行有些错误,一开始得不到 count’s PropertyValue ,你可以用类似第三行先 set count = 0 后删除,或者手动添加 count PropertyValue,如何添加?请看共享文档),这个可以用来做一些性能测试的一些数据输入(可以做到尽量不同),用法和上面一样
1 2 3 | <arg3> <MSG><REC instrCode="985" ... acId="${getAccount#result}" ... /></MSG> </arg3>
|
e.g.3
initData 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import au.com.bytecode.opencsv.CSVReader; def filename = testRunner.testCase.getPropertyValue( "filename" ) log.info("[load data] CSV File Path and Name: " + filename) log.info("[load data] Reading the CSV...") CSVReader reader = new CSVReader(new FileReader(filename)); def isHeader = true List approvalList = [] while ((nextLine = reader.readNext()) != null) { if (isHeader) { isHeader = false } else { approvalList.add nextLine } } //set property to test case context def loopCount = 0 log.info("[load data] Number of Approval: " + approvalList.size()) context.setProperty("approvalList",approvalList) context.setProperty("loopCount",loopCount); // get property log.info("[loop start] Current Loop Count: " + context.loopCount); def msg = context.approvalList.remove(0) testRunner.testCase.testSuite.getTestCaseByName("Approval").setPropertyValue("userid",msg[0]) testRunner.testCase.testSuite.getTestCaseByName("Approval").setPropertyValue("password",msg[1]) testRunner.testCase.testSuite.getTestCaseByName("Approval").setPropertyValue("key",msg[2]) testRunner.testCase.testSuite.getTestCaseByName("Approval").setPropertyValue("body","<![CDATA[" + msg[3].trim() + "]]>") context.setProperty("loopCount", ++context.loopCount);
|
看到没有,这个例子就很像Java了,用其它的Jar包(opencsv-xxx.jar,请把它放到SoapUI安装路径下的lib目录下)里的方法来读csv格式的文件,然后把读出来的数据放到List中并存到context中,后面还用到了getTestCaseByName获得当前的Test Case(本例中TestCase名为Approval,请注意:不是Test Step名),并赋值以供使用。使用这里的值,也很简单
1 | <arg0>${#TestCase#userid}</arg0>
|
这里的例子只是冰山一角,更多的请参考:
Tips & Tricks
Property Expansion
3.4 Load Tests
Load Tests 就是使SoapUI连续多次执行一个Test Steps,很简单就可以创建了,在【Load Tests】选项【New LoadTest】就可以了,大概会是下面的样子,具体的测试方法你就可以亲自试试了(比如Limit,Threads等配置)。
共享中有一份MIC2 SoapUI User Manual.doc的文档,是前面测试Mic2性能时候写的,加上MIC2-soapui-project.xml 和 MIC2 SoapUI Test.eml(email),应该就包括了上面的所有SoapUI知识了。
四、Eclipse常用插件
4.1 Easy Explore
Easy Explore 顾名思义,就是使在 Eclipse 里面浏览本地文件变的很简单。官方的插件有些些不足,不过还好,网上有人已经修改了,请看 改造easyexplore插件 ,可以下载里面的plugin并安装,重启即可使用。
4.2 KeepResident
KeepResident 是一款改进Eclipse性能的插件,个人感觉还是不错的,大家可以试用下。我的配置如下:
4.3 quickmarks
quickmarks 是Eclipse中的一款书签插件,很简单实用,追踪代码非常有帮助。使用超简单的, Ctrl+Shift+[0-9] 加上或者取消书签, Alt+[0-9] 打开对应的书签。
4.4 eclipse-fullscreen
eclipse-fullscreen 是一款能够让eclipse全屏的小插件,会让你的代码编辑窗口变得最大,充满整个屏幕。(小屏幕有福了,我留着备用)。
五、Eclipse最常用快捷键
以前也整理过一次(Eclipse/MyEclipse最最常用的快捷键),现在重新整理一次,尽量保持最简单最实用。子曰:工欲善其事,必先利其器。
快捷键 | 描述 |
Alt+/ | 代码提示 |
Ctrl+D | 删除当前行 |
Ctrl+Shift+O | 作用是缺少的Import语句被加入,多余的Import语句被删除 |
Ctrl+1 | 快速修复(最经典的快捷键,就不用多说了) |
Ctrl+Shift+F | 格式化当前代码 |
Ctrl+Shift+C | 在代码窗口中是这种注释(再次按下,取消注释) |
Ctrl+F | 查找/替换(这个谁都知道) |
Ctrl+Shift+T | 打开类型(查找文件很方便) |
Ctrl+Shift+R | 打开资源,和Ctrl+Shift+T不同的是,T是打开Java类文件,而R是所有文件 |
F2 | 显示详细信息 |
F3 | 跳到声明或定义的地方(这个我现在一般都使用Ctrl+鼠标左击了) |
Ctrl+T | 快速显示当前类的继承结构 |
Ctrl+/ | 在代码窗口中是这种注释(推荐使用Ctrl +Shift + C注释) |
Ctrl+Shift + / | 块注释,不推荐使用,格式化后如果再想取消就比较麻烦了 |
Ctrl+Q | 定位到最后编辑的地方 |
Ctrl[+Shift]+K | 参照选中的Word快速定位到下[上]一个 |
Alt+[↓ or ↑] | 当前行和下/上面一行交互位置(特别实用,可以省去先剪切,再粘贴了) |
Ctrl+Alt+[↓ or ↑] | 复制当前行到下/上一行(复制增加) |
Ctrl+Shift+X | 把当前选中的文本全部变为大写 |
Ctrl+Shift+Y | 把当前选中的文本全部变为小写 |
Alt+Shift+R | 重命名(当然,F2也能有一样的作用) |
Alt+Shift+M | 抽取方法 (这是重构里面最常用的方法之一了) |
Alt+Shift+L | 抽取本地变量 |