java开发经验分享(四)
四、 关于测试
1. 在整个项目计划中,测试时间安排的合理性,对测试阶段的情况应作充分预计,不可为了赶发布点而忽略质量。
2. 务必清楚产品包、更新包、bug包的提交规范。具体请参照《开发规范手册》。不要出现测试过程中提交多个bug包,或者提交安装包给测试人员更新的情况。
3. 提包时请先检查,路径是否正确、文件是否完整、配置文件是否应该提交,源代码修改记录描述是否完善。之前经常出现,提包不检查就直接提交来测试,导致出错后环境不断地还原或者重建新的环境。CVS使用不熟悉,提交文件反复出错。
4. 产品质量需要严格控制,自己承认是问题的情况下,请不要试图和测试商谈希望可以不被追究。
5. 请注意提高修改bug的质量,目前,修改一个bug而引发更多的bug的情况特别多。
6. bug修改完成后,在提交测试前请自己先验证通过后再提交,请不要修改完成后不验证就直接提交给测试人员,防止导致bug被反复reopen的情况。
7. 原则上不允许不通过CVS而直接提交文件给测试人员调试问题、寻找原因。如果确有必要,测试人员可以协助调试,但次数不宜过多,防止测试环境版本难以控制。
8. bug是否存在的衡量标准以测试环境为准,不建议出现“我这边是好的”这样的解释。
9. 修改bug时请修改完整,可能会有多个小问题提交在一个BUG里面,BUG修改时多个小问题的地方均需修改。
10. 更新文件必须通过配置发布,无论是否经过测试都不允许直接发给项目或直接更新客户服务器
五、 开发环境
1. Eclipse内存溢出、崩溃、无响应、启动慢
1) 建立多个workspace
2) 将workspace中暂时不用的工程close
3) 修改eclipse配置文件eclipse.ini,参考知识库:
-Xms512m
-Xmx512m
-XX:PermSize=96m
-XX:MaxPermSize=96m
2. Eclipse统一字符集为UTF-8
1) 进入Eclipse->Window->Preferences->General->Workspace界面,在“Text file encoding”中选择“other”并在下拉列表中选择“UTF-8”,并点击【Apply】后,点击【OK】确认保存
2) 修改jsp文件头部
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
将字符集改为“UTF-8”
3) 进入Eclipse->Window->Preferences->Web->JSP Files界面,将“Encoding”属性修改为“ISO 10646/Unicode(UTF-8)”
4) 已建立的项目,右键点击项目名称,进入Properties->Resource界面,选择“Text file encoding”编码为“UTF-8”
3. 打开Eclipse内存监视及回收插件
进入Eclipse->Window->Preferences->General界面,勾选“Show heap status”,点击【Apply】后,点击【OK】确认保存。Eclipse右下角,会显示JVM内存使用情况。
点击垃圾桶图标,可进行手动回收
4. 设置断点,进行调试
1) 行断点
行断点是最普通的断点。只要在Eclipse Java 编辑区的行头双击就会得到一个断点,代码会运行到此处时停止
2) 条件断点
条件断点,顾名思义就是一个有一定条件的断点,只有满足了用户设置的条件,代码才会在运行到断点处时停止。
在断点处点击鼠标右键,选择最后一个"Breakpoint Properties"
断点的属性界面及各个选项的意思如下图,
3) 变量断点
断点不仅能打在语句上,变量也可以接受断点
下图就是一个变量的打的断点,在变量的值初始化,或是变量值改变时可以停止,当然变量断点上也是可以加条件的,和条件断点的设置是一样的
4) 方法断点
方法断点就是将断点打在方法的入口处,方法断点的特别之处在于它可以打在 JDK的源码里,由于 JDK 在编译时去掉了调试信息,所以普通断点是不能打到里面的,但是方法断点却可以,可以通过这种方法查看方法的调用栈
5) 类型载入断点
可以查看什么时候载入的类
6) 异常断点
当异常发生时,代码会停在异常发生处,定位问题时应该比较有帮助
打开Breakpoints视图,点击按钮,增加异常断点
5. 修改代码字体
进入Eclipse->Window->Preferences->General->Appearance->Colors and Fonts界面,选择Basic->Text Font,点击右侧【Edit…】,选择。点击【Apply】后,点击【OK】确认保存
6. Eclipse快捷键,见“附录1—Eclipse快捷键”
六、 Linux
见《Linux_命令详解》
常用命令:
cd 变换工作目录
cd / 返回根目录 cd ../ 返回上层目录
ls 显示指定工作目录下的内容
mv 将一个档案移至另一个档案,或将数个档案移至另一个目录
mv /data/m3 /root 将/data/m3转移到/root目录下
mkdir 创建指定的目录名
mkdir /root/temp 在root目录下创建temp目录
rm 删除档案及目录
rm –rf 文件/文件夹 彻底删除文件/文件夹
rmdir 删除空的目录
kill 终止进程
kill -9 2342 杀掉进程标识号PID为2342的进程
ps 报告进程状况
ps –ef|grep java 查看java进程
tail 从指定点开始将指定的文件写到标准输出
tail –f nohup.out 实时读取日志nohup.out的更新内容
su 变更为其它使用者的身份
su – user1 切换到用户user1
cp 复制
cp config.xml /data/ 将config.xml文件复制到/data/目录下
reboot 重启服务器
halt 关闭服务器
top 显示目前正在系统中执行的程序
free 显示系统内存与swap使用的情况
java –version 查看JDK版本
chromd 777 /temp/runthread.sh 赋予用户/temp/runthread.sh最大权限
cat /dev/null > nohup.out 清空日志nohup.out文件内容
df –hl 查看磁盘空间与使用情况
du 显示目录下所有文件并列出文件大小
pwd 查看当前所在路径
export lang=zh_CN 修改环境变量lang值,解决linux乱码
./startup.sh tomcat启动
nohup ./startWeblogic.sh & weblogic启动(不挂断运行,防止注销后weblogic停止)
./startServer.sh server1 websphere启动
七、 常见问题
1. jsp出现getOutputStream() has already been called for this response
jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好造成的。
jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后有一段这样的代码
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和response.getOutputStream()相冲突的!所以会出现以上这个异常。
out.clear();
out = pageContext.pushBody();
2. xml加载错误
1) weblogic下,xml没有以xml文档方式加载,而是按照文本方式展现,导致出错,例如高级编辑器或树会出现加载错误
解决方法:在web.xml文件中增加
<mime-mapping>
<extension>xml</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
2) 网络问题,导致无法访问DTD(文档类型定义,作用是定义 XML 文档的合法构建模块)
解决方法:删除DTD声明,或者指向服务器本地DTD
3) XML 声明通常在 XML 文档的第一行出现。XML 声明不是必选项,但是如果使用 XML 声明,必须在文档的第一行,前面不得包含任何其他内容或空白。动态产生的xml文档,开头产生了空白行,造成错误。
解决方法:输出xml内容之前,用 out.clear(); 清空缓存
3. 中文乱码
1) jsp页面乱码,头部指定字符集为UTF-8
<%@page language="java" contentType="text/xml; charset=utf-8"%>
2) 数据库乱码,指定数据库字符集为UTF-8,同时dbconfig.xml的连接字符串中设置字符集为UTF-8
3) 中文参数乱码。tomcat下修改server.xml中HTTP的Connector的URIEncoding属性为UTF-8;js传递中文参数,用encodeURI() 进行编码
4. jPage脚本错误,检查proxyUrl指定的jsp页面的输出内容。输出的内容为脚本片段,要符合javascript语法。
dataStore为字符串数组,需要过滤dataStore中元素里的单引号
replaceAll("\'","\\\\'").replaceAll("\r\n","");
输出形式如下:
dataStore = ['第一条\'记录\'内容', '第二条”记录”内容', '第三条记录内容'];
5. Apache与Tomcat整合,session丢失
参考知识库:
http://km.hanweb.com/viewthread.php?tid=1515&highlight=tomcat%2B%E5%80%AA%E7%87%95%E9%9C%9E
http://km.hanweb.com/viewthread.php?tid=978&highlight=tomcat
http://km.hanweb.com/viewthread.php?tid=1127&highlight=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
6. zip文件解压错误,提示找不到方法
应用中的ant.jar同中间件自带的文件冲突,将/WEB-INF/lib/ant-1.7.0.jar改名为ant.jar 覆盖到中间件的目录下
weblogic:weblogic/bea/weblogic81/server/lib/ant
websphere:WebSphere/AppServer/lib
7. 脚本错误,使用浏览器调试工具
IE8及以上版本,使用浏览器自带的开发人员工具,按F12进行脚本调试
FireFox使用Firebug插件进行调试,按F12进行脚本调试
8. 中间件报错如下:java.sql.SQLException: IO异常:The Network Adapter could not establish the connection,先后重启数据库和中间件无效
1) 用“telnet 数据库IP 数据库端口”命令检查网络是否畅通
2) 检查是否超过了数据库最大连接数
参考http://km.hanweb.com/viewthread.php?tid=1448&highlight=%E8%BF%9E%E6%8E%A5%E6%95%B0
3) 检查是否有防火墙
4) 数据库监听日志大小是否超过2G(/data/oracle/product/版本号/network/log/listener.ora)
9. 日志中报too many open files错误
linux默认打开文件的最大数是1024,解决方法:
用cat /proc/sys/fs/file-max 命令查看打开文件的最大限制数
用echo 65536 > /proc/sys/fs/file-max 命令修改
编辑/etc/sysctl.conf文件,编辑行fs.file-max=65536
编辑/etc/security/limits.conf,增加行* - nofile 65536
10. 导入XML文件失败
Editplus检查xml文件是否是UTF-8编码
八、 附录1(Eclipse快捷键)
快捷键 |
功能 |
Ctrl+1 |
快速修复 |
Ctrl+D |
删除当前行 |
Ctrl+Alt+↓ |
复制当前行到下一行(复制增加) |
Ctrl+Alt+↑ |
复制当前行到上一行(复制增加) |
Alt+↓ |
当前行和下面一行交换位置 |
Alt+↑ |
当前行和上面一行交换位置 |
Alt+← |
前一个编辑的页面 |
Alt+→ |
下一个编辑的页面 |
Alt+Enter |
显示当前选择资源的属性 |
Shift+Enter |
在当前行的下一行插入空行 |
Shift+Ctrl+Enter |
在当前行插入空行 |
Ctrl+Q |
定位到最后编辑的地方 |
Ctrl+L |
定位到某行 |
Ctrl+M |
最大化当前的Edit或View |
Ctrl+/ |
注释当前行,再按则取消注释 |
Ctrl+O |
快速显示 OutLine |
Ctrl+T |
快速显示当前类的继承结构 |
Ctrl+W |
关闭当前Editer |
Ctrl+K |
参照选中的Word快速定位到下一个 |
Ctrl+E |
快速显示当前Editer的下拉列表 |
Ctrl+/(小键盘) |
折叠当前类中的所有代码 |
Ctrl+×(小键盘) |
展开当前类中的所有代码 |
Ctrl+Space |
代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替) |
Ctrl+Shift+E |
显示管理当前打开的所有的View的管理器 |
Ctrl+J |
正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了) |
Ctrl+Shift+J |
反向增量查找 |
Ctrl+Shift+F4 |
关闭所有打开的Editer |
Ctrl+Shift+X |
把当前选中的文本全部变为大写 |
Ctrl+Shift+Y |
把当前选中的文本全部变为小写 |
Ctrl+Shift+F |
格式化当前代码 |
Ctrl+Shift+P |
定位到对应的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之) |
Alt+Shift+R |
重命名 |
Alt+Shift+M |
抽取方法 |
Alt+Shift+C |
修改函数结构 |
Alt+Shift+L |
抽取本地变量(可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候) |
Alt+Shift+F |
把Class中的local变量变为field变量 |
Alt+Shift+I |
合并变量 |
Alt+Shift+V |
移动函数和变量 |
Alt+Shift+Z |
重构的后悔药 |
编辑
快捷键 |
功能 |
作用域 |
Ctrl+F |
查找并替换 |
全局 |
Ctrl+Shift+K |
查找上一个 |
文本编辑器 |
Ctrl+K |
查找下一个 |
文本编辑器 |
Ctrl+Z |
撤销 |
全局 |
Ctrl+C |
复制 |
全局 |
Alt+Shift+↓ |
恢复上一个选择 |
全局 |
Ctrl+X |
剪切 |
全局 |
Ctrl1+1 |
快速修正 |
全局 |
Alt+/ |
内容辅助 |
全局 |
Ctrl+A |
全部选中 |
全局 |
Delete |
删除 |
全局 |
Alt+? Alt+Shift+? Ctrl+Shift+Space |
上下文信息 |
全局 |
F2 |
显示工具提示描述 |
Java编辑器 |
Alt+Shift+↑ |
选择封装元素 |
Java编辑器 |
Alt+Shift+← |
选择上一个元素 |
Java编辑器 |
Alt+Shift+→ |
选择下一个元素 |
Java编辑器 |
Ctrl+J |
增量查找 |
文本编辑器 |
Ctrl+Shift+J |
增量逆向查找 |
文本编辑器 |
Ctrl+V |
粘贴 |
全局 |
Ctrl+Y |
重做 |
全局 |
查看
快捷键 |
功能 |
作用域 |
Ctrl+= |
放大 |
全局 |
Ctrl+- |
缩小 |
全局 |
窗口
快捷键 |
功能 |
作用域 |
F12 |
激活编辑器 |
全局 |
Ctrl+Shift+W |
切换编辑器 |
全局 |
Ctrl+Shift+F6 |
上一个编辑器 |
全局 |
Ctrl+Shift+F7 |
上一个视图 |
全局 |
Ctrl+Shift+F8 |
上一个透视图 |
全局 |
Ctrl+F6 |
下一个编辑器 |
全局 |
Ctrl+F7 |
下一个视图 |
全局 |
Ctrl+F8 |
下一个透视图 |
全局 |
Ctrl+W |
显示标尺上下文菜单 |
文本编辑器 |
Ctrl+F10 |
显示视图菜单 |
全局 |
Alt+- |
显示系统菜单 |
全局 |
导航
快捷键 |
功能 |
作用域 |
Ctrl+F3 |
打开结构 |
Java编辑器 |
Ctrl+Shift+T |
打开类型 |
全局 |
F4 |
打开类型层次结构 |
全局 |
F3 |
打开声明 |
全局 |
Shift+F2 |
打开外部javadoc |
全局 |
Ctrl+Shift+R |
打开资源 |
全局 |
Alt+← |
后退历史记录 |
全局 |
Alt+→ |
前进历史记录 |
全局 |
Ctrl+, |
上一个 |
全局 |
Ctrl+. |
下一个 |
全局 |
Ctrl+O |
显示大纲 |
Java编辑器 |
Ctrl+Shift+H |
在层次结构中打开类型 |
全局 |
Ctrl+Shift+P |
转至匹配的括号 |
全局 |
Ctrl+Q |
转至上一个编辑位置 |
全局 |
Ctrl+Shift+↑ |
转至上一个成员 |
Java编辑器 |
Ctrl+Shift+↓ |
转至下一个成员 |
Java编辑器 |
Ctrl+L |
转至行 |
文本编辑器 |
搜索
快捷键 |
功能 |
作用域 |
Ctrl+Shift+U |
出现在文件中 |
全局 |
Ctrl+H |
打开搜索对话框 |
全局 |
Ctrl+G |
工作区中的声明 |
全局 |
Ctrl+Shift+G |
工作区中的引用 |
全局 |
文本编辑
快捷键 |
功能 |
作用域 |
Insert |
改写切换 |
文本编辑器 |
Ctrl+↑ |
上滚行 |
文本编辑器 |
Ctrl+↓ |
下滚行 |
文本编辑器 |
文件
快捷键 |
功能 |
作用域 |
Ctrl+S |
保存 |
全局 |
Ctrl+P |
打印 |
全局 |
Ctrl+F4 |
关闭 |
全局 |
Ctrl+Shift+S |
全部保存 |
全局 |
Ctrl+Shift+F4 |
全部关闭 |
全局 |
Alt+Enter |
属性 |
全局 |
Ctrl+N |
新建 |
全局 |
项目
快捷键 |
功能 |
作用域 |
Ctrl+B |
全部构建 |
全局 |
源代码
快捷键 |
功能 |
作用域 |
Ctrl+Shift+F |
格式化 |
Java编辑器 |
Ctrl+\ |
取消注释 |
Java编辑器 |
Ctrl+/ |
注释 |
Java编辑器 |
Ctrl+Shift+M |
添加导入 |
Java编辑器 |
Ctrl+Shift+O |
组织导入 |
Java编辑器 |
运行
快捷键 |
功能 |
作用域 |
F7 |
单步返回 |
全局 |
F6 |
单步跳过 |
全局 |
F5 |
单步跳入 |
全局 |
Ctrl+F5 |
单步跳入选择 |
全局 |
F11 |
调试上次启动 |
全局 |
F8 |
继续 |
全局 |
Shift+F5 |
使用过滤器单步执行 |
全局 |
Ctrl+Shift+B |
添加/去除断点 |
全局 |
Ctrl+D |
显示 |
全局 |
Ctrl+F11 |
运行上次启动 |
全局 |
Ctrl+R |
运行至行 |
全局 |
Ctrl+U |
执行 |
全局 |
重构
快捷键 |
功能 |
作用域 |
Alt+Shift+Z |
撤销重构 |
全局 |
Alt+Shift+M |
抽取方法 |
全局 |
Alt+Shift+L |
抽取局部变量 |
全局 |
Alt+Shift+I |
内联 |
全局 |
Alt+Shift+V |
移动 |
全局 |
Alt+Shift+R |
重命名 |
全局 |
Alt+Shift+Y |
重做 |
全局 |
九、 附录2(测试常见问题)
1. 表和触发器的创建等sql语句更新执行问题,即sql语句不正确;
2. 新增、编辑信息时,对字段输入的类型(数字、字母、日期等)、长度、范围不作校验,如果校验不对需要在处理之前要有相关的提示信息;
3. 新增、编辑信息时,当某一字段输入有问题,提交时,系统作出错误提示,但是其他正确的字段信息均被清空;
4. 新增和编辑修改信息的要求不一致;例如添加要求必填的项,修改也应该必填;添加规定为整型的项,修改也必须为整型.
5. 对新建完成的信息记录打开编辑时显示不正确;
6. 新建信息时新增的空记录错误地保存成功;
7. 新增信息列表后,信息列表排序没有规律,如正序或者倒序,而是无序地插入;
8. 录入后自动计算的字段要随着别的字段修改更新(如单科成绩变后,总成绩也变);
9. 输入较长的信息后,导致界面变形,浏览器分辨率大小撑大或者内容被遮挡
10. 信息输入开头、结尾的空格、null值判断显示;
11. 删除信息时,勾选部分信息记录进行删除时,系统错误删除了其他未勾选的信息记录;选择性删除一条信息记录和删除所有信息记录效果一样;
12. 删除信息时,没有“删除确认”对话框直接删除了所有信息记录;
13. 没有选择记录直接点击删除/修改按钮需要提示“请先选择记录”;
14. 需要考虑删除的关联性,即删除某一个内容需要同时删除其关联的某些内容;
15. 高级检索中的条件检索无论什么条件均可以检索出所有信息列表;
16. 高级检索完成后条件仍然存在,影响了外面的空检索不能正确检索出所有信息;
17. 查询条件名称与信息列表及信息编辑页面相应的字段名称完全统一;
18. 一个模块的excel表格错误地被导入另一个模块;
19. 新增和导入的文件内容字段判断不一致,或者导入时不作判断;
20. 功能实现时,隐性需求未能实现,例如:用户输入四科成绩后,总成绩还是需要用户手动输入;
21. 返回按钮不能实现返回功能;
22. 信息保存提交后系统给出“保存/提交成功”提示信息,但是系统不能自动更新列表显示;
23. 上传图片、文件系统未正确更新;
24. 上传文件、图片时,对文件、图片的类型、大小系统没有正确作控制;
25. 对于范围的查询应该采用全闭的形式,例如选择范围是1-3,应该表示大于等于1并且小于等于3;
26. 操作完成后系统没有正确提示,不知道是成功了还是失败了,不知道操作完成的情况;
27. 系统显示的提示信息描述不正确、与实际结果不一致;例如系统弹出错误提示信息但是操作成功;
28. 信息列表中如果某个字段显示过长用“…”或者分行显示;
29. 大文本框输入应该可以自动换行显示、控制字数等;
30. 界面只读的时候(查询、统计、导入)等,应当不能编辑;
31. 对于添加的时间控件,未根据实际情况作出控制,即选择的时间应当符合实际条件;并且从**至**时间控件选择时没有先后顺序;
32. 文本框等控件的控制禁止了键盘的输入,但是没有阻止鼠标及快捷键的操作,例如测试的时候可以将一段代码或非法输入使用鼠标操作进行复制粘贴操作;
33. 用户注销或者cookie失效后,有页面正常显示导致的错误操作;
34. 与实际常识逻辑上不符合;例如:大小月、二月各自的实际天数;
35. 多种条件冲突而导致结果矛盾,例如:考勤系统中出现过的,又缺勤又迟到的情况;
36. 调试信息遗留(后台打印与文件开发环境配置,多余文件等)
37. 用户、机构与角色的关联关系没有控制正确,例如系统没有给用户a分配相应角色权限时,但是此用户a在系统中错误地有操作权限;
38. 用户登录后自己可以错误地删除自己的账号;
39. 时间控件需作判断时以服务器时间为基准界面显示,字体样式、对齐方式、按钮风格和布局,和公司其他产品统一;
40. 界面风格、布局和公司其他产品保持统一,遵守以下规则:易用性、规范性、帮助设施、合理性、美观与协调性、菜单位置、快捷键组合、安全性考虑