﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xiaomage234-随笔分类-test tools</title><link>http://www.blogjava.net/xiaomage234/category/33769.html</link><description>生命本就是一次凄美的漂流，记忆中放不下的，永远是孩提时代的那一份浪漫与纯真！</description><language>zh-cn</language><lastBuildDate>Fri, 08 Nov 2013 05:58:06 GMT</lastBuildDate><pubDate>Fri, 08 Nov 2013 05:58:06 GMT</pubDate><ttl>60</ttl><item><title>互联网公司linux运维生产场景常用软件工具一览【转自老男孩】</title><link>http://www.blogjava.net/xiaomage234/archive/2013/11/07/406109.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 07 Nov 2013 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2013/11/07/406109.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/406109.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2013/11/07/406109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/406109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/406109.html</trackback:ping><description><![CDATA[<p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; font-size: 16px;"><strong style="padding: 0px; margin: 0px;">互联网公司linux运维生产场景常用软件工具一览，同时补充了个别常用但不是开源的软件。</strong><br style="padding: 0px; margin: 0px;" /><br style="padding: 0px; margin: 0px;" />下午受邀请参加了一个BBS活动，于是有了下面的内容。<br style="padding: 0px; margin: 0px;" />下面是在linux网站运维方向老男孩最近几年常用的免费的开源软件，临时即兴想起来的，在这里和大家分享，希望给初学者指引一点路。<br style="padding: 0px; margin: 0px;" />linux的世界真的很精彩，还没入门的朋友赶紧进来吧！</span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; font-size: 16px;">操作系统：Centos<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>Freebsd,Ubuntu,Redhatlinux,suselinux<br style="padding: 0px; margin: 0px;" />网站服务：apache<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>nginx<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,lighttpd,php<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>tomcat<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>resin<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;<br style="padding: 0px; margin: 0px;" /></span>数据库：Mysql<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>PostgreSQL,Mysql-proxy,<span style="padding: 0px; margin: 0px; background-color: #f8f8f8; text-indent: 28px; font-size: 14px; line-height: 25px; font-family: 宋体; color: #333333;">MariaDB</span><br style="padding: 0px; margin: 0px;" />代理相关：lvs,keepalived,haproxy,nginx,apache,heartbeat（此行都是<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;）<br style="padding: 0px; margin: 0px;" /></span>网站缓存：squid<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>nginx<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>varnish<br style="padding: 0px; margin: 0px;" />内存缓存：memcached<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>memcachedb,TokyoTyrant<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>MongoDB,Cassandra<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>redis&#8251;,tair,CouchDB<br style="padding: 0px; margin: 0px;" />存储相关：Nfs<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>Moosefs<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>Hadoop<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>gfs<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>lustre,FastDFS<br style="padding: 0px; margin: 0px;" />版本管理：cvs,svn<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>git<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;<br style="padding: 0px; margin: 0px;" /></span>监控报警：mboy,mrtg,nagios<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,cacti<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,zabbix,munin<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,hyperic<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;<br style="padding: 0px; margin: 0px;" /></span>域名解析：bind<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,powerdns,dnsmq<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;<br style="padding: 0px; margin: 0px;" /></span>同步软件：rsync,inotify,sersync,drbd,csync2,union,lsyncd,scp（此行都是&#8251;）<br style="padding: 0px; margin: 0px;" />分发工具：Secboy<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,expect<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>puppet<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>cfengine<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>ssh+rsync+sersync<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;<br style="padding: 0px; margin: 0px;" /></span>虚拟软件：xen<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,kvm<br style="padding: 0px; margin: 0px;" />内网软件：iptables<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,zebra<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,iftraf,ntop<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,tc<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,iftop<br style="padding: 0px; margin: 0px;" />邮件软件：qmail<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>posfix<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>sendmail<br style="padding: 0px; margin: 0px;" />远程拨号：openvpn<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,pptp,openswan<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,ipip<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;<br style="padding: 0px; margin: 0px;" /></span>统一认证：ldap(可结合微软活动目录)<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;<br style="padding: 0px; margin: 0px;" /></span>队列工具：ActiveMQ<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;,</span>RabbitMQ,MemcacheQ<br style="padding: 0px; margin: 0px;" />打包发布：mvn<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,ants<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>,jenkins<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;<br style="padding: 0px; margin: 0px;" /></span>测试软件：apacheab,smokeping,siege,JMeter,Webbench,LoadRunner（此行都是<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>）<br style="padding: 0px; margin: 0px;" />日志相关：syslog,rsyslog,Awstats<br style="padding: 0px; margin: 0px;" />DB代理：mysql-proxy,amoeba（更多还是程序实现读写分离）<br style="padding: 0px; margin: 0px;" />搜索软件：Sphinx,Xapian（大公司会自己开发类似百度的小规模内部搜索引擎）<br style="padding: 0px; margin: 0px;" /></span><span style="padding: 0px; margin: 0px; font-size: 16px;"><br style="padding: 0px; margin: 0px;" />提示：<br style="padding: 0px; margin: 0px;" />1）以上所有软件都是老男孩用过或测试过的。<br style="padding: 0px; margin: 0px;" />2）带<strong style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span></strong>的为老男孩最近几年用的比较多，可信任使用的。也是近年来linux运维的大众。<br style="padding: 0px; margin: 0px;" />3）有了功能分类和软件名，大家有需求，可以按功能找软件直接G就知道了。</span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-size: 16px;">4）学习要有舍有得，什么都抓必然短时间都不会精，希望大家能抓重点，抓精髓，大众软件（带<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>）先熟练了，这是基础加提高，在研究小众软件（不带<span style="padding: 0px; margin: 0px; color: #ff0000;">&#8251;</span>），这是高手之路，最后在研究偏门的，世外高手之路，当然前提是先掌握前面的大众和小众。<br style="padding: 0px; margin: 0px;" />5）当然还有一些没有大众开源的有一些也很棒，如审计堡垒机程序。<br style="padding: 0px; margin: 0px;" /><br style="padding: 0px; margin: 0px;" />还有用的多的，老男孩落下的，大家补充啊。</span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">本文出自 &#8220;<a href="http://oldboy.blog.51cto.com/" style="padding: 0px; margin: 0px; color: #015f91; text-decoration: none;">老男孩linux运维</a>&#8221; 博客，请务必保留此出处<a href="http://oldboy.blog.51cto.com/2561410/775056" style="padding: 0px; margin: 0px; color: #015f91; text-decoration: none;">http://oldboy.blog.51cto.com/2561410/775056</a></p><img src ="http://www.blogjava.net/xiaomage234/aggbug/406109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2013-11-07 16:12 <a href="http://www.blogjava.net/xiaomage234/archive/2013/11/07/406109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存泄露检测工具比较  </title><link>http://www.blogjava.net/xiaomage234/archive/2013/06/26/400968.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 26 Jun 2013 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2013/06/26/400968.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/400968.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2013/06/26/400968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/400968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/400968.html</trackback:ping><description><![CDATA[<p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="nofollow" href="http://www.inf.ethz.ch/personal/biere/projects/ccmalloc/" style="text-decoration: none; color: #1b8cba;">ccmalloc</a>－Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="nofollow" href="http://dmalloc.com/" style="text-decoration: none; color: #1b8cba;">Dmalloc</a>－Debug Malloc Library.</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="nofollow" href="http://perens.com/FreeSoftware/ElectricFence/" style="text-decoration: none; color: #1b8cba;">Electric Fence</a>－Linux分发版中由Bruce Perens编写的malloc()调试库。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="nofollow" href="http://lxr.mozilla.org/mozilla/source/tools/leaky/leaky.html" style="text-decoration: none; color: #1b8cba;">Leaky</a>－Linux下检测内存泄漏的程序。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="nofollow" href="http://www.andreasen.org/LeakTracer/" style="text-decoration: none; color: #1b8cba;">LeakTracer</a>－Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="nofollow" href="http://www.linkdata.se/sourcecode.html" style="text-decoration: none; color: #1b8cba;">MEMWATCH</a>－由Johan Lindh编写，是一个开放源代码C语言内存错误检测工具，主要是通过gcc的precessor来进行。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="nofollow" href="http://valgrind.org/" style="text-decoration: none; color: #1b8cba;">Valgrind</a>－Debugging and profiling Linux programs, aiming at programs written in C and C++.</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="nofollow" href="http://kcachegrind.sourceforge.net/cgi-bin/show.cgi/KcacheGrindIndex" style="text-decoration: none; color: #1b8cba;">KCachegrind</a>－A visualization tool for the profiling data generated by&nbsp;<a rel="nofollow" href="http://valgrind.org/info/tools.html#cachegrind" style="text-decoration: none; color: #1b8cba;">Cachegrind</a>&nbsp;and&nbsp;<a rel="nofollow" href="http://directory.fsf.org/all/calltree.html" style="text-decoration: none; color: #1b8cba;">Calltree</a>.</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">9.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="nofollow" href="http://dbaron.org/mozilla/leak-monitor/" style="text-decoration: none; color: #1b8cba;">Leak Monitor</a>－一个Firefox扩展，能找出跟Firefox相关的泄漏类型。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">10.&nbsp;<a rel="nofollow" href="http://sourceforge.net/projects/ieleak/" style="text-decoration: none; color: #1b8cba;">IE Leak Detector (Drip/IE Sieve)</a>－Drip和IE Sieve leak detectors帮助网页开发员提升动态网页性能通过报告可避免的因为IE局限的内存泄漏。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">11.&nbsp;<a rel="nofollow" href="http://sourceforge.net/projects/winleak" style="text-decoration: none; color: #1b8cba;">Windows Leaks Detector</a>－探测任何Win32应用程序中的任何资源泄漏(内存，句柄等)，基于Win API调用钩子。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">12. SAP&nbsp;<a rel="nofollow" href="https://www.sdn.sap.com/irj/sdn/wiki?path=/display/Java/Java+Memory+Analysis" style="text-decoration: none; color: #1b8cba;">Memory Analyzer</a>－是一款开源的JAVA内存分析软件，可用于辅助查找JAVA程序的内存泄漏，能容易找到大块内存并验证谁在一直占用它，它是基于Eclipse RCP(Rich Client Platform)，可以下载RCP的独立版本或者Eclipse的插件。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">13.&nbsp;<a rel="nofollow" href="http://www.opensolaris.org/os/community/dtrace/" style="text-decoration: none; color: #1b8cba;">DTrace</a>－即动态跟踪Dynamic Tracing，是一款开源软件，能在Unix类似平台运行，用户能够动态检测操作系统内核和用户进程，以更精确地掌握系统的资源使用状况，提高系统性能，减少支持成本，并进行有效的调节。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">14. IBM Rational&nbsp;<a rel="nofollow" href="http://www-111.ibm.com/ecatalog/Detail.wss?locale=zh_CN&amp;synkey=E108274J06775S83" style="text-decoration: none; color: #1b8cba;">PurifyPlus</a>－帮助开发人员查明C/C++、托管.NET、Java和VB6代码中的性能和可靠性错误。PurifyPlus 将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">15. Parasoft&nbsp;<a rel="nofollow" href="http://www.parasoft.com/jsp/products/home.jsp?product=Insure&amp;itemId=63" style="text-decoration: none; color: #1b8cba;">Insure++</a>－针对C/C++应用的运行时错误自动检测工具，它能够自动监测C/C++程序，发现其中存在着的内存破坏、内存泄漏、指针错误和I/O等错误。并通过使用一系列独特的技术（SCI技术和变异测试等），彻底的检查和测试我们的代码，精确定位错误的准确位置并给出详细的诊断信息。能作为Microsoft Visual C++的一个插件运行。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">16. Compuware&nbsp;<a rel="nofollow" href="http://www.compuware.com/products/devpartner/visualc.htm" style="text-decoration: none; color: #1b8cba;">DevPartner for Visual C++ BoundsChecker Suite</a>－为C++开发者设计的运行错误检测和调试工具软件。作为Microsoft Visual Studio和C++ 6.0的一个插件运行。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">17. Electric Software&nbsp;<a rel="nofollow" href="http://www.glowcode.com/summary.htm" style="text-decoration: none; color: #1b8cba;">GlowCode</a>－包括内存泄漏检查，code profiler，函数调用跟踪等功能。给C++和.Net开发者提供完整的错误诊断，和运行时性能分析工具包。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">18. Compuware&nbsp;<a rel="nofollow" href="http://www.compuware.com/products/devpartner/java.htm" style="text-decoration: none; color: #1b8cba;">DevPartner Java Edition</a>－包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">19. Quest<a rel="nofollow" href="http://www.quest.com/jprobe/" style="text-decoration: none; color: #1b8cba;">&nbsp;JProbe</a>－分析Java的内存泄漏。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">20. ej-technologies&nbsp;<a rel="nofollow" href="http://www.quest.com/jprobe/" style="text-decoration: none; color: #1b8cba;">JProfiler</a>－一个全功能的Java剖析工具，专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。4.3.2注册码：A-G666#76114F-1olm9mv1i5uuly#0126</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">21. BEA&nbsp;<a rel="nofollow" href="http://www.bea.com.cn/products/beawebjro81/prodoverview7/index.jsp" style="text-decoration: none; color: #1b8cba;">JRockit</a>－用来诊断Java内存泄漏并指出根本原因，专门针对Intel平台并得到优化，能在Intel硬件上获得最高的性能。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">22. SciTech Software AB&nbsp;<a rel="nofollow" href="http://memprofiler.com/" style="text-decoration: none; color: #1b8cba;">.NET Memory Profiler</a>－找到内存泄漏并优化内存使用针对C#，VB.Net，或其它.Net程序。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">23. YourKit&nbsp;<a rel="nofollow" href="http://www.yourkit.com/" style="text-decoration: none; color: #1b8cba;">.NET &amp; Java Profiler</a>－业界领先的Java和.NET程序性能分析工具。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">24. AutomatedQA&nbsp;<a rel="nofollow" href="http://www.automatedqa.com/products/aqtime/index.asp" style="text-decoration: none; color: #1b8cba;">AQTime</a>－AutomatedQA的获奖产品performance profiling和memory debugging工具集的下一代替换产品，支持Microsoft, Borland, Intel, Compaq 和 GNU编译器。可以为.NET和Windows程序生成全面细致的报告，从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net 1.0,1.1,2.0,3.0和Windows 32/64位应用程序。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">25.&nbsp;<a rel="nofollow" href="http://blogs.msdn.com/gpde/pages/%20-memory-leak-detector.aspx" style="text-decoration: none; color: #1b8cba;">JavaScript Memory Leak Detector</a>－微软全球产品开发欧洲团队(Global Product Development- Europe team, GPDE) 发布的一款调试工具，用来探测JavaScript代码中的内存泄漏，运行为IE系列的一个插件。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;"></p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;"></p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">附录：内存泄漏的发生方式</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">1.&nbsp;&nbsp;&nbsp;&nbsp; 常发性内存泄漏。发生内存泄漏的代码会被多次执行到，每次被执行的时候都会导致一块内存泄漏。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">2.&nbsp;&nbsp;&nbsp;&nbsp; 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境，偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">3.&nbsp;&nbsp;&nbsp;&nbsp; 一次性内存泄漏。发生内存泄漏的代码只会被执行一次，或者由于算法上的缺陷，导致总会有一块且仅有一块内存发生泄漏。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">4.&nbsp;&nbsp;&nbsp;&nbsp; 隐 式内存泄漏。程序在运行过程中不停的分配内存，但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏，因为最终程序释放了所有申请的内存。但是 对于一个服务器程序，需要运行几天，几周甚至几个月，不及时释放内存也可能导致最终耗尽系统的所有内存。所以，我们称这类内存泄漏为隐式内存泄漏。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;"></p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">什么是系统资源？</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">当应用程序在Windows中运行时，Windows必须实时"跟踪"该应用程序的运行，并保留与之相关的许多信息，如按钮、光标、菜单的位置和位图、窗口的状况等，这些信息由Windows保留在一种叫堆的内存块中，堆的英文为Heap。简单地说，堆是采用特殊机制管理的内存块。由Windows的一个系统内核User.exe管理的堆叫做User资源堆（User Resource Heap），由另一个系统内核Gdi.exe管理的堆叫做GDI资源堆（Graphical Device Interface Resource Heap，简称GDI Resource Heap），User资源堆和GDI资源堆合称为系统资源堆（System Resource Heap），习惯上就把它们叫做系统资源（System Resource）。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">　　微软将Windows的系统资源（堆）分为五个堆，其中User资源堆为三个，而GDI资源堆为两个。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">　　三个User资源堆分别是：16位的用户堆（User Heap，64KB）；32位的窗口堆（Windows Heap，2MB）；32位的用户菜单堆（User Menu Heap，2MB）。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">　　两个GDI资源堆分别是：16位的GDI堆（GDI Heap，64KB）；32位的GDI堆（GDI，2MB）。</p><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;">　　从这里的系统资源分类和大小我们应该明白，不管CPU是P4还是486，内存是8M还是1G，所有Windows的用户都拥有同样大小的系统资源（堆），用户不能自已增加或减少系统资源的大小，这是由操作系统决定的，与硬件档次没有任何关系。</p><span style="font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #ffffff;">　　Windows的User资源堆和GDI资源堆的可用（Free）空间称为可用 User资源和可用GDI资源，Windows中以百分数表示它们，用户可以选择 "开始/附件/系统工具/系统信息"，来实时查看它们的大小。&nbsp;</span><br style="line-height: 25px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff;" /><span style="font-family: Arial, Helvetica, simsun, u5b8bu4f53; line-height: 25px; background-color: #ffffff;">为了您的安全，请只打开来源可靠的网址</span><p style="line-height: 25px; margin: 0px 0px 10px; padding: 0px; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ffffff; text-indent: 2em;"><br />来自:&nbsp;<a target="_blank" rel="nofollow" href="http://hi.baidu.com/jrckkyy/blog/item/6947f42332ec80589922ed6d.html" style="text-decoration: none; color: #1b8cba;">http://hi.baidu.com/jrckkyy/blog/item/6947f42332ec80589922ed6d.html</a>&nbsp;</p><img src ="http://www.blogjava.net/xiaomage234/aggbug/400968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2013-06-26 15:12 <a href="http://www.blogjava.net/xiaomage234/archive/2013/06/26/400968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件测试宣言的诠释</title><link>http://www.blogjava.net/xiaomage234/archive/2013/03/14/396417.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 14 Mar 2013 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2013/03/14/396417.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/396417.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2013/03/14/396417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/396417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/396417.html</trackback:ping><description><![CDATA[from:http://blog.csdn.net/kerryzhu/article/details/8299383<br /><br /><h2><span style="margin: 0px; padding: 0px; font-family: SimSun; font-size: 32px; font-weight: normal;">从</span><span style="margin: 0px; padding: 0px; font-family: SimSun; font-size: 14px; font-weight: normal;">2000年</span><span style="margin: 0px; padding: 0px; font-family: SimSun; font-size: 14px; font-weight: normal;">开始从事软件测试，逐渐形成自己的软件测试思想，而第一次比较清晰呈现自己的测试的思想是2007年出版的《全程软件测试》，正如前言所叙：&#8220;从项目启动的第一天起到需求和设计的评审阶段，从后期的缺陷修正到产品维护&#8212;&#8212;在整个软件生命周期中，开发人员和测试人员愉快地合作、共同努力，将软件产品的开发效率和质量推到一个新的高度。&#8221;，这些思想在测试管理工作的体现就是让测试人员更早地融入项目中，更主动、更密切地与开发人员协作，与项目相关利益者合作，确保项目按时按质地完成，即：</span></h2><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><ul style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">测试人员越快地发现缺陷，项目越能尽早结束；</span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">测试人员尽可能多地发现Bug，遗留在产品中的Bug就会越少，产品的质量就会越高；&nbsp;</span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">测试人员和自己（开发人员）的工作都是为了相同的目标&#8212;&#8212;按时、高质量地发布产品；&nbsp;</span></li></ul><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">而此后和业界的测试人员、开发人员交流更多，思考得更多，在测试上的思想更清晰，于是在2012年9月5日在新浪微博（<a href="http://weibo.com/1652927771/yArIqoCKW" style="margin: 0px; padding: 0px; color: #336699; text-decoration: none;">http://weibo.com/1652927771/yArIqoCKW</a>&nbsp;）上发表了自己的个人软件测试宣言：</span></p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;"><img src="http://img.my.csdn.net/uploads/201212/15/1355563470_2055.png" alt="" style="margin: 0px; padding: 0px; border: none;" /><br style="margin: 0px; padding: 0px;" /></span></p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">宣言发布后，得到不少网友的肯定。最给力的，要属@<span style="margin: 0px; padding: 0px; color: #262626;">培根芝士牛蛙堡</span><span style="margin: 0px; padding: 0px; color: #262626;">:</span><span style="margin: 0px; padding: 0px; color: #262626;">感觉总结的太到位，</span><span style="margin: 0px; padding: 0px; color: #262626;">can</span><span style="margin: 0px; padding: 0px; color: #262626;">&#8217;</span><span style="margin: 0px; padding: 0px; color: #262626;">t agree more</span><span style="margin: 0px; padding: 0px; color: #262626;">了，最近在看《软测之魂》，很多观点都是异曲同工啊，虽说就简单四句话，但是每一句话展开去都能写一本书</span><span style="margin: 0px; padding: 0px; color: #262626;">。还有@</span><a href="http://weibo.com/365testing" style="margin: 0px; padding: 0px; color: #336699; text-decoration: none;"><span style="margin: 0px; padding: 0px; color: #54370d;">让测试飞起来</span></a><span style="margin: 0px; padding: 0px; color: #262626;">：</span><span style="margin: 0px; padding: 0px; color: #262626;">又见右下八卦图亮点。每当遇到左、右难以分辩时就想到它，并以此为基点，偿试思考再进一步，思丝多而力争不乱。分割线不是直的哟，似乎体现开发中有测试(</span>调试)，测试中有开发，而又不完全符合对立统一。</span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">当然，也有不同声音，例如：@<a href="http://weibo.com/huzhenghui" style="margin: 0px; padding: 0px; color: #336699; text-decoration: none;"><span style="margin: 0px; padding: 0px; color: #54370d;">胡争辉</span></a><span style="margin: 0px; padding: 0px; color: #262626;">：</span><span style="margin: 0px; padding: 0px; color: #262626;">首先应当强调产品工程，然后在产品工程中强调需求工程，其次在需求工程的基础上强调品质保证工程。脱离的产品工程的品质保证工程是无本之木，无源之水。</span>这实际和我宣言没有关系，这里丝毫没有否定产品工程，也没有否定需求工程，实际第一句&#8220;<span style="margin: 0px; padding: 0px; color: #262626;">更鼓励事先确定验证的标准并以此来驱动开发</span>&#8221;就是强调需求的重要性。需求是软件开发的源泉，而这里关注点是&#8220;软件测试&#8221;，比较局限于测试自身的内涵和测试与开发的关系。如果拓展出去，我需要发表我的&#8220;软件工程宣言&#8221;了。</span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">还有其它有意义的补充：</span></p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><ul style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">&nbsp;@</span><a href="http://weibo.com/sdxinz" title="程序员邹欣" style="margin: 0px; padding: 0px; color: #336699; text-decoration: none; font-family: SimSun;"><span style="margin: 0px; padding: 0px; color: black;">程序员邹欣</span></a><span style="margin: 0px; padding: 0px; font-family: SimSun;">：值得开发，测试，项目管理人员思考。 认可内部测试的重要性, 但更重视产品对用户的长期影响；</span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">&nbsp;@</span><a href="http://weibo.com/xzdoudou" style="margin: 0px; padding: 0px; color: #336699; text-decoration: none; font-family: SimSun;"><span style="margin: 0px; padding: 0px; color: black;">王立杰</span><span style="margin: 0px; padding: 0px; color: black;">-WangLijie</span></a><span style="margin: 0px; padding: 0px; font-family: SimSun;">：认可测试对质量的改善，但更提倡质量是內建的；</span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">&nbsp;与</span><a href="http://weibo.com/n/Testin-Daiyibin" style="margin: 0px; padding: 0px; color: #336699; text-decoration: none; font-family: SimSun;"><span style="margin: 0px; padding: 0px; color: black;">@Testin-Daiyibin</span></a><span style="margin: 0px; padding: 0px; font-family: SimSun;">&nbsp;讨论之后，增加一条，即：认可自动化测试的价值，但更提倡测试分析和设计的创造性和系统性。</span></li></ul><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">那下面回归主题，就我自己的<strong style="margin: 0px; padding: 0px;"><u style="margin: 0px; padding: 0px;">软件测试宣言</u></strong>，逐条分别进行说明，并简要阐述如何将它们应用于实际的软件开发工作之中。</span></p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun; color: #3333ff;">1. 认可测试的价值，但更鼓励事先确定验证的标准并以此来驱动开发&nbsp;</span></strong></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;"><span style="margin: 0px; padding: 0px;">首先认识测试的价值，测试是质量保证的重要手段之一，正如在我的博客中所讨论的&#8220;</span><a href="http://blog.csdn.net/kerryzhu/article/details/7516100" style="margin: 0px; padding: 0px; color: #336699; text-decoration: none;"><span style="margin: 0px; padding: 0px; color: #990000;">软件测试究竟发挥什么作用？</span></a><span style="margin: 0px; padding: 0px;">&#8221;：</span></span></p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><ul style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">对产品质量完成全面的评估，为软件产品发布（如验收测试）、软件系统部署（如性能规划测试）、软件产品鉴定（第三方独立测试）委托方和被委托方纠纷仲裁（第三方独立测试）和其它决策提供信息；</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">通过持续的测试（包括需求评审、设计评审、代码评审等）可以对产品质量提供持续的、快速的反馈，从而在整个开发过程中不断地、及时地改进产品的质量，并减少各种返工，降低软件开发的成本；</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">通过测试发现所要交付产品的缺陷，特别是尽可能地发现各种严重的缺陷，降低或消除产品质量风险，提高客户的满意度，扩大市场份额，提高客户的忠诚度。</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">通过对缺陷进行分析，找出缺陷发生的根本原因（软件过程中的问题，包括错误的行为方式）或总结出软件产品的缺陷模式，避免将来犯同样的错误或产生类似的产品问题，达到缺陷预防的目的</span></span></li></ul><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">所以软件测试的价值不容忽视，但是我们一直提倡&#8220;质量更是內建的（Quality is built in）&#8221;，软件产品的质量是在需求分析、功能设计、系统设计、编程等过程中逐渐形成的，事先清楚客户的需求，明确软件产品的验收标准，基于这些需求和验收标准来开发，开发人员清楚自己要实现的目标、清楚待实现系统的要求和限制，在工作中能够第一次将事情做对，或者说，第一次将事情做对的可能性会显著提高，在需求、设计、代码中引入的缺陷就会大大减少。理解这一点并不难，如果还是不能很好理解，就看看砖墙是如何砌成的？是先拉上水准线再墙砌，还是墙砌好之后再拉线来检测？</span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;"><img src="http://img.my.csdn.net/uploads/201212/15/1355563529_5489.png" alt="" style="margin: 0px; padding: 0px; border: none;" /><br style="margin: 0px; padding: 0px;" /></span></p><p align="center" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">而且，对测试人员说，全生命周期的测试依据也明确了，能够及时提供明确的质量反馈，测试与开发之间也不容易引起的争议，测试效率也会明显改善。本句宣言和验收测试驱动开发（Acceptance Test Driven Development, ATDD）拥有共同的思想和内涵，无论是在传统研发流程中还是在敏捷过程中，都可以尝试这样去做。虽然在某些项目上需求不够清楚、或需求变化比较大，但也不能成为&#8220;自己懒于彻底分析需求&#8221;的借口，能明确60%的需求，也不能做到30%就停下来了。 否则，无论是&#8220;迭代&#8221;、还是&#8220;重构&#8221;，都是&#8220;返工&#8221;美化之后的代名词。难道企业希望自己团队常犯错误而不断修正吗？</span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun; color: #3333ff;">2. 认可专业测试人员的不可替代的价值，但更鼓励开发人员做好测试</span></strong></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">上一句已经回答了测试的价值，而这里是讨论测试工作由谁来做？测试有价值，但不一定由专职的测试人员来做，正如一些公司（如facebook）没有专职的测试人员，软件产品的研发也能正常开展。也许在某些初创的企业、特殊商业模式的软件服务、某些移动终端的且免费的产品等可以不要专职的测试人员，但对大多数软件产品、软件企业还是需要专业的测试人员，因为系统复杂、业务更复杂的原因，更可能是测试本身更需要方法和技术。当我们不能简单地掌握软件产品（系统）的测试方法和技术，就需要专业的测试人员。即使在相对低端的制造业，掌握其工作技能不是很难，但熟练工人的工作效率也是初级操作工的几倍。而软件测试所涉及的方法、技术与工具，从功能测试到性能测试、安全性测试、兼容测试、可达性测试到可靠性测试等，从测试计划、测试分析与设计到测试结果分析，从等价类划分、判定表、因果图到基于模型的测试、自动化测试等，已形成一个庞大的体系，没有专注，很难做得精，不能精通测试，又如何有良好的测试效率呢？没有专业的测试技能，测试的风险也很大。这些内容，在我的另一篇博客&#8220;</span><a href="http://blog.csdn.net/kerryzhu/article/details/8126203" style="margin: 0px; padding: 0px; color: #336699; text-decoration: none; font-family: SimSun;"><span style="margin: 0px; padding: 0px; color: #990000;">专业测试团队会消亡还是新生</span></a><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">&#8221;进行了充分讨论。正如网友在本博客上还评论说：&#8220;</span><span style="margin: 0px; padding: 0px; line-height: 20px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;"><span style="margin: 0px; padding: 0px; color: #ff0000;">如果没有专业的测试团队</span><span style="margin: 0px; padding: 0px;">，那么天上的飞机一定会无缘无故地掉下来，ICU里面的心电监护仪罢工也不会是新闻，核弹未接收到真正的发射命令而自行启动也不是没有可能，</span><span style="margin: 0px; padding: 0px; color: #ff0000;">这个世界将不再是安全的世界</span><span style="margin: 0px; padding: 0px;">。</span></span></span><span style="margin: 0px; padding: 0px; font-family: SimSun;">&#8221;</span></span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">为什么更鼓励开发人员做好测试呢？这是因为：</span></p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><ul style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">单元测试是基础，没有单元的质量，如何有系统的质量？而单元测试主要是在代码层次上展开，而且和编程交织在一起，编程和单元测试难以分开处理，所以单元测试最好由开发人员来做，确保良好的工作效率与工作质量；</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">如果开发了一个测试工具，先让开发人员用起来好，还是只让测试人员用？无论是功能测试工具还是性能测试、安全性测试工具，都可以让开发人员先用，测试的效率会更高。一边构建、一边验证，更能及时发现问题，能更快调试和修正问题，将问题消除在萌芽之中。这也就是为什么我们一直提倡持续构建、持续测试；</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">如果开发人员做更多测试，就更能认识到自己的问题，了解问题产生的原因，将来在设计、编程中更好地避免同样问题的发生，预防缺陷效果更好。</span></span></li></ul><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">这里鼓励开发人员做的测试，主要集中在单元测试（功能、性能方面的测试）、集成测试等方面。而系统的测试、用户需求的进一步验证和确认、大规模的性能测试、兼容性测试、安全性测试等则有专业的测试人员完成。</p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px;"><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun; color: #3333ff;">3. 认可测试计划的价值，但更强调计划是一个基于风险不断调整的过程</span></strong></span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">这点比较容易理解，做一件事，如果没有计划就比较盲目，失败的可能性就很大。测试计划目的就是明确测试的目标、测试的需求（包括测试范围、测试任务优先级等）、测试风险、测试资源和进度安排等，但同时需求会发生变更、开发的设计与代码质量超出我们的预料、测试工作量估算不足以及其它新的测试风险等各种因素的影响，我们可能需要不断调整测试计划，以适应新的测试需求等。计划重要，但不是一成不变的，也就是我们强调：</span></p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><ul style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">测试计划不能停留在文档上面，它是对测试过程的规划与指导，使测试工作开展得更顺利、更有效；</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">测试计划不是一个文档，而是一个计划的过程，适时调整以及时满足项目新的需求；</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">对测试计划的调整也是学习的过程，有利于将来（为下一个项目）制定出更可靠的测试计划。</span></span></li></ul><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun; color: #3333ff;">4. 认可探索式测试的价值，但更希望测试是具有系统方法的、相对规范的过程</span></strong></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">我们都知道，测试不能穷尽，测试不能做到百分之百，总是有不能测到的地方，总是有缺陷遗留下来，这就给我们留下了足够的探索空间。探索式测试（Exploratory Testing，ET）的出现正是因为在软件系统中存在许多未知的东西难以得到快速、简单的验证，需要我们转变思路，不要以固定的模式来完成测试，而是要换一种新的模式来进行测试，以提高测试效率。因为需求不清楚、时间紧等各种原因，探索式测试才更有效，在一定程度上是因为软件开发本身的问题，所以，我也戏称&#8220;敏捷开发&#8221;为&#8220;探索式开发&#8221;。从这个意义上讲，探索式测试方法是不得已而为之的一种方式。在传统行业，没有看到一种&#8220;探索式检验&#8221;（除了食品安全检验，在我国还不够成熟，可能会采用探索式检验，哈哈），而是有明确的技术规格，有相应的检测仪器或方法进行检验，可以明确地给出检查结果。</span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;"><strong style="margin: 0px; padding: 0px;"><u style="margin: 0px; padding: 0px;">探索式测试</u></strong>作为明确的术语或概念，最早是由测试专家CemKaner博士在1983年提出的，距今天差不多有30年，但绝大多数测试人只是最近几年才听到或熟知这个概念。说明其价值是有限的，如果价值很高，也不至于我们现在才比较关注的。但最近几年<strong style="margin: 0px; padding: 0px;"><u style="margin: 0px; padding: 0px;">探索式测试</u></strong>很热，为什么？</span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">一方面要感谢James A. Whittaker撰写的《<a href="http://www.amazon.com/Exploratory-Software-Testing-Tricks-Techniques/dp/0321636414/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1355553419&amp;sr=1-1&amp;keywords=Exploratory+Software+Testing" style="margin: 0px; padding: 0px; color: #336699; text-decoration: none;"><span style="margin: 0px; padding: 0px; color: black;">ExploratorySoftware Testing</span></a>》一书，比较全面地介绍了探索式软件测试（国内是2010年引进本书的，但也有不足，我在为史亮和高翔写的《探索式测试实践之路》的序中谈到这一点），对推广探索式测试有很大的促进作用。另方面，在互联网时代，需求衍变越来越快；软件已经成为一种服务（SaaS），迭代周期越来越频繁。敏捷方法开始流行，被软件企业广泛采用，敏捷测试随之而生，正是探索式测试用武之时。而且探索式测试的确给人一些新鲜的感觉，将测试工作变成更有趣的探索式活动，在享受工作的同时完成测试，容易受到测试工程师的欢迎。</span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">探索式测试也在不断发展，人们试图帮助它建立一套方法体系，例如James Bach提出的基于会话的测试管理(Session Based Test Management,简称 SBTM)。该管理方法将测试任务分解成一系列会话(Sessions，发生在特定时间盒内的会话活动，对软件系统的测试就是看成不断地问系统的过程，从系统那里获得答案，探索式测试的会话特征更为明显),测试人员在会话过程中完成一个特定测试任务的设计、执行和记录。</span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">但从探索式测试的&#8220;探索&#8221;概念本身来看，还是强调&#8220;设计与执行&#8221;同时发生的特点来看，探索式测试更多强调人的创造性，强调随软件功能的使用对其理解不断深入来发现问题，更强调这种上下文驱动的思维模式，而对验收的标准、验证的具体指标缺乏关注，更谈不上测试需求的分析、测试的系统设计，在系统性和规范性方面有很大的欠缺，所以难以得到国际标准的支持，在多数软件产品的测试工作中探索式测试只能起着辅助、补充的作用。</span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">任何严重的缺陷的遗漏可能给公司带来不可估量的损失，软件测试更注重对软件质量的全面评估，最大程度地减少软件产品的质量风险，从这个意义看，测试目标、测试需求、测试风险等都是非常重要的，需要认真分析，然后在此基础上进行系统的测试设计。测试的结果需要严格的覆盖率衡量，而要确保高覆盖率，需要事先进行精心的设计，从业务流程、数据流程、用户场景等各个方面进行细致分析，采用合适的测试方法设计出相应的测试用例来覆盖流程路径、数据输入空间以及各种产品使用的场景。事先能从需求覆盖出发来设计测试用例，事后还可以从代码覆盖来检验测试的效果。当然，更理想的方式是用基于模型的测试或形式化方法来验证系统的需求，给出更客观的、更准确的质量评估，我们对产品的发布就更有信心，客户就能得到高质量的产品或服务。</span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun; color: #3333ff;">5. 认可发现缺陷的价值，但更重视对软件产品质量的全面评估与持续反馈</span></strong></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">发现一个缺陷并得到修正，产品的质量就减少一份风险；在当前产品中发现的缺陷越多，就能更多地消除产品的质量风险，这是软件测试价值之一个方面的体现。但我们不能有这样的思想：测试人员发现的缺陷越多，测试人员的价值越大。例如，我们不能一直等开发人员把设计、代码都工作全部完成之后，我们再来发现问题，以体现测试的价值。我们更不能明明看着开发人员犯错误、或者明明知道开发人员可能会在某些地方犯错误，我们也不给予提醒、不给予帮助，而是等到他们做完工作，我们再把问题发现出来，以体现我们的价值。</span></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">正确的做法则是及时提供有关质量的反馈，可能是一种质量风险的提示，也可能是一种质量担心的倾诉，更可能是一种有关质量改进的、积极的建议。例如：</span></p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><ul style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">在需求分析时，发现需求不够清晰，发现可能给开发、测试带来困惑的地方，都要及时指出来，并帮助纠正。</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">如果发现文档中新增加的功能没有多大意义，或者是自己难以看清楚其功能对客户的价值，就要主动和产品经理沟通，建议拿掉这个功能，或让产品经理解释清楚、说服自己。</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">如果觉得开发任务安排不合理，或觉得开发之前的讨论、培训不够，对业务理解还很肤浅，就要及时和开发沟通，帮忙消除这种潜在的质量风险；</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">如果发现开发不重视单元测试、或者单元测试做得很少，就要协助开发做好单元测试，提供单元测试指导，提供单元测试框架，提供一切可以帮助开发改善单元测试的服务。</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">如果发现个别的开发工程师不遵守编程规范，就要启动质量反馈机制&#8230;</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">&nbsp;&#8230; &#8230;</span></li></ul><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: SimSun;">这意味着：</span></p><p align="left" style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><ul style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">测试工作不是软件开发生命周期的某个环境、某个阶段性的工作，而是贯穿整个软件软件开发生命周期，测试人员无时无刻不在关注质量；</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">测试人员不仅仅要关注已经存在的产品缺陷的问题，还要关注可能导致缺陷发生的问题，尽量帮助产品需求人员、设计人员、编程人员预防质量问题的发生。</span></span></li><li style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-family: KaiTi_GB2312;">测试不仅仅是测试人员的工作，而且和软件开发的其他团队（人员）有关系；测试工作不是测试团队内部的事，而是整个开发团队的事。</span></span></li></ul><img src ="http://www.blogjava.net/xiaomage234/aggbug/396417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2013-03-14 10:26 <a href="http://www.blogjava.net/xiaomage234/archive/2013/03/14/396417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript(js) 单元测试工具 -- JsUnit(转载)</title><link>http://www.blogjava.net/xiaomage234/archive/2013/02/01/395013.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 01 Feb 2013 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2013/02/01/395013.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/395013.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2013/02/01/395013.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/395013.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/395013.html</trackback:ping><description><![CDATA[<span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">Jsunit 就是 Junit 的javascript 版本，下载并解压Jsunit zip，大部分的核心文件都在 jsunit/app 目录下，</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">两个最基本的文件：</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">. jsUnitCore.js -- 每个测试文件都要引用它</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">. testRunner.html -- 用来运行具体的jsunit 测试</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">(1) 起步例子：</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">在Jsunit解压后的同级目录下建立两个文件，目录结构：</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">|-- jsunit</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">|-- simple.js</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">|-- simple_test.html</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">写完后运行 jsunit/testRunner.html，在页面中选择simple_test.html, 点击run，可以看到测试结果信息。</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">// simple.js 被测试的javascript文件</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">function addTwoNumbers(value1, value2){</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; return parseInt(value1) + parseInt(value2);</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">}</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">// simple_test.html 测试文件</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;!DOCTYPE HTML PUBLIC&nbsp;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">"-//W3C//DTD HTML 4.0 Transitional//EN"&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;HTML&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;HEAD&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;TITLE&gt; New Document &lt;/TITLE&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;script language="JavaScript"&nbsp;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">src="jsunit/app/jsUnitCore.js"&gt;&lt;/script&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;script language="JavaScript"&nbsp;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">src="simple.js"&gt;&lt;/script&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;script language="JavaScript"&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">function testValidArgs()</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">{</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; assertEquals("2 + 2 is 4",&nbsp;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 4, addTwoNumbers(2, 2));</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">}</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">function testWithNegativeNumbers()</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">{</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; assertEquals("-2 + -2 is -4",&nbsp;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; -4, addTwoNumbers(-2, -2));</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">}</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">function exposeTestFunctionNames()</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">{</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; var tests = new Array(2);</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; tests[0] = "testValidArgs";</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; tests[1] = "testWithNegativeNumbers";</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; return tests;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">}</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;/script&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;/HEAD&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;BODY&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">test page for addTwoNumbers(value1, value2);</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;/BODY&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;/HTML&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">通常以"test"开头的测试函数会被自动发现，但如果没有发现，就需要我们用exposeTestFunctionNames 函数来显示指定测试函数。</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">(2) setUpPage()</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">jsunit 包含了一次性启动方法，setUpPage() 只对每个测试页调用一次，即在所有测试函数调用之前调用，适于做预处理，但要注意在setUpPage()最后一行要把 setUpPageStatus 变量设置为 &#8220;complete&#8221;, 如：</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">var arg1;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">var arg2;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">function setUpPage(){</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; arg1 = 2;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; arg2 = 2;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; setUpPageStatus = "complete";</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">}</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">(3) 测试集</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">测试集把不同的测试页分组组织，其中包含测试页或其他测试集，他们会按照顺序执行。</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">注意点：</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">. 测试集中不能包含任何测试函数</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">. 必须包含一个返回 jsUnitTestSuite 对象的 suite 函数</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">. 有两个方法添加测试页：addTestPage(testPage) addTestSuite(testSuite), 在添加测试页时要注意路径，应是相对于testRunner.html 的</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">例子：</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;HTML&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;HEAD&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;TITLE&gt; New Document &lt;/TITLE&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;script language="JavaScript"&nbsp;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">src="jsunit/app/jsUnitCore.js"&gt;&lt;/script&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;script language="JavaScript"&nbsp;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">src="simple.js"&gt;&lt;/script&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;script language="JavaScript"&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">function sampleSuite()</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">{</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">var sampleSuite = new top.jsUnitTestSuite();</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">sampleSuite.addTestPage("../simple_test.html");</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">return sampleSuite;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">}</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">function suite()</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">{</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">var testSuite = new top.jsUnitTestSuite();</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">testSuite.addTestSuite(sampleSuite());</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">testSuite.addTestPage("../simple_test.html");</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">return testSuite;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">}</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;/script&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;/HEAD&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;BODY&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;/BODY&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">&lt;/HTML&gt;</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">(4) 日志和跟踪</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">运行testRunner.html时会发现他有 Trace level 项，用于现实我们在测试方法中的日志信息，包含3个函数：</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">warn(message, [value])</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">inform(message, [value])</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">debug(message, [value])</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">原文出处：http://www.zhuoda.org/irini/83098.html</span><br style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;" /><span style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">JsUnit下载地址：http://sourceforge.net/projects/jsunit/</span><img src ="http://www.blogjava.net/xiaomage234/aggbug/395013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2013-02-01 11:24 <a href="http://www.blogjava.net/xiaomage234/archive/2013/02/01/395013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS测试工具 Google JS Test</title><link>http://www.blogjava.net/xiaomage234/archive/2013/02/01/395014.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 01 Feb 2013 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2013/02/01/395014.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/395014.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2013/02/01/395014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/395014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/395014.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Google JS Test是一个运行于V8 JavaScript引擎下的Javascript单元测试框架，其在Google内部负责对Chrome的快速JS执行速度进行测试，现在Google以开源工程开放大家使用。Google JS Test主要特性：超快的启动速度和执行时间，不需要在浏览器里运行清爽而具有可读性的输出内容也有一个可选的基于浏览器的测试器，可在JS修改的时候刷新其样式和语义跟Goo...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2013/02/01/395014.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/395014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2013-02-01 11:24 <a href="http://www.blogjava.net/xiaomage234/archive/2013/02/01/395014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHPUnit和Selenium</title><link>http://www.blogjava.net/xiaomage234/archive/2011/05/25/350990.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 25 May 2011 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/05/25/350990.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/350990.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/05/25/350990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/350990.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/350990.html</trackback:ping><description><![CDATA[<div><span style="border-collapse: collapse; font-family: song, Verdana; font-size: 12px; line-height: normal; "><div xml:lang="en"><div><div><div><h2>Selenium RC</h2></div></div></div><p style="font: normal normal normal 12px/normal song, Verdana; "><a href="http://www.openqa.org/selenium-rc/" target="_top" style="text-decoration: underline; color: #0044b6; ">Selenium RC</a>是一款测试工具，允许你为web应用编写自动化的用户接口测试，支持任何程序设计语言、任何HTTP站点以及任何主流浏览器。它使用<a href="http://www.openqa.org/selenium/" target="_top" style="text-decoration: underline; color: #0044b6; ">Selenium Core</a>，这是个利用JavaScript执行自动浏览器任务的库。Selenium测试直接运行于浏览器中，就像真实做的那样。这些测试既可用于<em>验收测试</em>（通过在集成系统上执行更高级的测试而不是只独立地测试系统的各个单元），又可用于<em>浏览器兼容性测试</em>（通过测试不同操作系统和浏览器上的web应用）。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">我看看下Selenium RC是如何安装的：</p><div><ol type="1"><li>下载一个<a href="http://www.openqa.org/selenium-rc/" target="_top" style="text-decoration: underline; color: #0044b6; ">Selenium RC</a>分发包存档。</li><li>分发包存档并拷贝<code>server/selenium-server.jar</code>至<code>/usr/local/bin</code>（例如）。</li><li>通过运行<strong><code>java -jar /usr/local/bin/selenium-server.jar</code></strong>启动Selenium RC服务器。</li></ol></div><p style="font: normal normal normal 12px/normal song, Verdana; ">现在我们可以利用它的客户/服务器协议向Selenium RC服务器发送命令了。</p></div><div xml:lang="en"><div><div><div><h2>PHPUnit_Extensions_SeleniumTestCase</h2></div></div></div><p style="font: normal normal normal 12px/normal song, Verdana; "><code>PHPUnit_Extensions_SeleniumTestCase</code>测试用例扩展将同Selenium RC通话的客户/服务器协议实现为专门用于web测试的断言方法。</p><p style="font: normal normal normal 12px/normal song, Verdana; "><a href="file:///F:/data2/PHPUnit_Pocket_Guide_-_v32/index_cn.html#selenium.seleniumtestcase.examples.WebTest.php" title="Example 19.1: Usage example for PHPUnit_Extensions_SeleniumTestCase" style="text-decoration: underline; color: #0044b6; ">范例 19.1</a>显示如何测试<code>http://www.example.com/</code>站点的<code>&lt;title&gt;</code>元素的内容。</p><div><p style="font: normal normal normal 12px/normal song, Verdana; "><strong>范例 19.1: PHPUnit_Extensions_SeleniumTestCase使用举例</strong></p><div><pre><code>&lt;?php<br style="font: normal normal normal 12px/normal song, Verdana; " />require_once&nbsp;'PHPUnit/Extensions/SeleniumTestCase.php';<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;<br style="font: normal normal normal 12px/normal song, Verdana; " />class&nbsp;WebTest&nbsp;extends&nbsp;PHPUnit_Extensions_SeleniumTestCase<br style="font: normal normal normal 12px/normal song, Verdana; " />{<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;function&nbsp;setUp()<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;{<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;setBrowser('*firefox&nbsp;/usr/lib/firefox/firefox-bin');<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;setBrowserUrl('http://www.example.com/');<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;}<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;testTitle()<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;{<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;open('http://www.example.com/');<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;assertTitleEquals('Example&nbsp;Web&nbsp;Page');<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;}<br style="font: normal normal normal 12px/normal song, Verdana; " />}<br style="font: normal normal normal 12px/normal song, Verdana; " />?&gt;<br style="font: normal normal normal 12px/normal song, Verdana; " /></code></pre></div></div><br style="font: normal normal normal 12px/normal song, Verdana; " /><p style="font: normal normal normal 12px/normal song, Verdana; ">不同于<code>PHPUnit_Framework_TestCase</code>类，扩展了<code>PHPUnit_Extensions_SeleniumTestCase</code>的测试用例类必须提供<code>setUp()</code>方法。该方法用于配置Selenium RC会话。可用于此的方法列表见<a href="file:///F:/data2/PHPUnit_Pocket_Guide_-_v32/index_cn.html#selenium.seleniumtestcase.tables.seleniumrc-api.setup" title="Table&nbsp;19.1.&nbsp;Selenium RC API: Setup" style="text-decoration: underline; color: #0044b6; ">表 19.1</a>。</p><div><p style="font: normal normal normal 12px/normal song, Verdana; "><strong>表 19.1. Selenium RC API：装配</strong></p><div><table summary="Selenium RC API: Setup" border="1"><colgroup><col><col></colgroup><thead><tr style="font: normal normal normal 12px/normal song, Verdana; "><th align="left">方法</th><th align="left">含义</th></tr></thead><tbody><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void setBrowser(string $browser)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">Selenium RC服务器使用的浏览器。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void setBrowserUrl(string $browserUrl)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">设置用于测试的基址URL。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void setHost(string $host)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">设置连接到Selenium RC服务器的主机名。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void setPort(int $port)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">设置连接到Selenium RC服务器的端口号。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void setTimeout(int $timeout)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">设置连接到Selenium RC服务器的超时时间。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void setSleep(int $seconds)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">设置Selenium RC客户端向Selenium RC服务器发送动作指令之间睡眠的秒数。</td></tr></tbody></table></div></div><br style="font: normal normal normal 12px/normal song, Verdana; " /><p style="font: normal normal normal 12px/normal song, Verdana; ">你也可以使用一组浏览器运行每一个测试：在你的测试用例类中声明一个名为<code>$browsers</code>的<code>public static</code>数组代替使用<code>setBrowser()</code>设置一个浏览器。该数组中的每一项都描述一个浏览器配置。这些浏览器中的每一个都能被不同的Selenium RC服务器接待：</p><div><p style="font: normal normal normal 12px/normal song, Verdana; "><strong>范例 19.2: 设置多浏览器配置</strong></p><div><pre><code>&lt;?php<br style="font: normal normal normal 12px/normal song, Verdana; " />require_once&nbsp;'PHPUnit/Extensions/SeleniumTestCase.php';<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;<br style="font: normal normal normal 12px/normal song, Verdana; " />class&nbsp;WebTest&nbsp;extends&nbsp;PHPUnit_Extensions_SeleniumTestCase<br style="font: normal normal normal 12px/normal song, Verdana; " />{<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$browsers&nbsp;=&nbsp;array(<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;'Firefox&nbsp;on&nbsp;Linux',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'browser'&nbsp;=&gt;&nbsp;'*firefox&nbsp;/usr/lib/firefox/firefox-bin',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'host'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;'my.linux.box',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'port'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;4444,<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'timeout'&nbsp;=&gt;&nbsp;30000,<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;'Safari&nbsp;on&nbsp;MacOS&nbsp;X',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'browser'&nbsp;=&gt;&nbsp;'*safari',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'host'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;'my.macosx.box',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'port'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;4444,<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'timeout'&nbsp;=&gt;&nbsp;30000,<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;'Safari&nbsp;on&nbsp;Windows&nbsp;XP',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'browser'&nbsp;=&gt;&nbsp;'*custom&nbsp;C:\Program&nbsp;Files\Safari\Safari.exe&nbsp;-url',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'host'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;'my.windowsxp.box',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'port'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;4444,<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'timeout'&nbsp;=&gt;&nbsp;30000,<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;'Internet&nbsp;Explorer&nbsp;on&nbsp;Windows&nbsp;XP',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'browser'&nbsp;=&gt;&nbsp;'*iexplore',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'host'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;'my.windowsxp.box',<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'port'&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;4444,<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'timeout'&nbsp;=&gt;&nbsp;30000,<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;);<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;function&nbsp;setUp()<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;{<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;setBrowserUrl('http://www.example.com/');<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;}<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;testTitle()<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;{<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;open('http://www.example.com/');<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;assertTitleEquals('Example&nbsp;Web&nbsp;Page');<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;}<br style="font: normal normal normal 12px/normal song, Verdana; " />}<br style="font: normal normal normal 12px/normal song, Verdana; " />?&gt;<br style="font: normal normal normal 12px/normal song, Verdana; " /></code></pre></div></div><br style="font: normal normal normal 12px/normal song, Verdana; " /><p style="font: normal normal normal 12px/normal song, Verdana; "><code>PHPUnit_Extensions_SeleniumTestCase</code>能够收集测试经由Selenium运行时的代码覆盖率信息：</p><div><ol type="1"><li>拷贝<code>PHPUnit/Extensions/SeleniumTestCase/phpunit_coverage.php</code>到你的web服务器的文件根目录中。</li><li>在你的web服务器的<code>php.ini</code>配置文件中，配置<code>PHPUnit/Extensions/SeleniumTestCase/prepend.php</code>和<code>PHPUnit/Extensions/SeleniumTestCase/append.php</code>分别作为<code>auto_prepend_file</code>和<code>auto_append_file</code>。</li><li>在你的扩展了<code>PHPUnit_Extensions_SeleniumTestCase</code>的测试用例类中，使用<pre><code>protected $coverageScriptUrl = 'http://host/phpunit_coverage.php';</code></pre>配置用于<code>phpunit_coverage.php</code>脚本的URL。</li></ol></div><p style="font: normal normal normal 12px/normal song, Verdana; "><a href="file:///F:/data2/PHPUnit_Pocket_Guide_-_v32/index_cn.html#selenium.seleniumtestcase.tables.assertions" title="Table&nbsp;19.2.&nbsp;Assertions" style="text-decoration: underline; color: #0044b6; ">表 19.2</a>列出<code>PHPUnit_Extensions_SeleniumTestCase</code>提供的各种断言方法。</p><div><p style="font: normal normal normal 12px/normal song, Verdana; "><strong>表 19.2. 断言</strong></p><div><table summary="Assertions" border="1"><colgroup><col><col></colgroup><thead><tr style="font: normal normal normal 12px/normal song, Verdana; "><th align="left">断言</th><th align="left">含义</th></tr></thead><tbody><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertAlertPresent()</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果不存在警告（对话框）则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertNoAlertPresent()</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果存在警告（对话框）则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertChecked(string $locator)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素未选中则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertNotChecked(string $locator)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素被选中则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertConfirmationPresent()</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果不存在确认（对话框）则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertNoConfirmationPresent()</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果存在确认（对话框）则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertEditable(string $locator)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素不可编辑则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertNotEditable(string $locator)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素可编辑则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertElementValueEquals(string $locator, string $text)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素的值不等于给定的<code>$text</code>则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertElementValueNotEquals(string $locator, string $text)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素的值等于给定的<code>$text</code>则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertElementContainsText(string $locator, string $text)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素不含给定的<code>$text</code>则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertElementNotContainsText(string $locator, string $text)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素包含给定的<code>$text</code>则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertElementPresent(string $locator)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素不存在则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertElementNotPresent(string $locator)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素存在则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertLocationEquals(string $location)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果当前位置（location）不等于给定的<code>$location</code>则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertLocationNotEquals(string $location)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果当前位置（location）等于给定的<code>$location</code>则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertPromptPresent()</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果不存在提示（对话框）则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertNoPromptPresent()</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果存在提示（对话框）则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertSelectHasOption(string $selectLocator, string $option)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果给定的选项不可用则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertSelectNotHasOption(string $selectLocator, string $option)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果给定的选项可用则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertSelected($selectLocator, $option)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果给定的标签未选中则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertNotSelected($selectLocator, $option)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果给定的标签被选中则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertIsSelected(string $selectLocator, string $value)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果给定的值未选中则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertIsNotSelected(string $selectLocator, string $value)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果给定的值被选中则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertSomethingSelected(string $selectLocator)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$selectLocator</code>标识的选项未选中则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertNothingSelected(string $selectLocator)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$selectLocator</code>标识的选项被选中则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertTextPresent(string $pattern)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果给定的<code>$pattern</code>不存在则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertTextNotPresent(string $pattern)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果给定的<code>$pattern</code>存在则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertTitleEquals(string $title)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果当前标题不等于给定的<code>$title</code>则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertTitleNotEquals(string $title)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果当前标题等于给定的<code>$title</code>则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertVisible(string $locator)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素不可见则报错。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void assertNotVisible(string $locator)</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">如果<code>$locator</code>标识的元素可见则报错。</td></tr></tbody></table></div></div><br style="font: normal normal normal 12px/normal song, Verdana; " /><p style="font: normal normal normal 12px/normal song, Verdana; "><a href="file:///F:/data2/PHPUnit_Pocket_Guide_-_v32/index_cn.html#selenium.seleniumtestcase.tables.template-methods" title="Table&nbsp;19.3.&nbsp;Template Methods" style="text-decoration: underline; color: #0044b6; ">表 19.3</a>显示<code>PHPUnit_Extensions_SeleniumTestCase</code>的两个模板方法：</p><div><p style="font: normal normal normal 12px/normal song, Verdana; "><strong>表 19.3. 模板方法</strong></p><div><table summary="Template Methods" border="1"><colgroup><col><col></colgroup><thead><tr style="font: normal normal normal 12px/normal song, Verdana; "><th align="left">方法</th><th align="left">含义</th></tr></thead><tbody><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void defaultAssertions()</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">重写以执行一个测试用例中的所有测试共享的断言。该方法在发送给Selenium RC服务器的每个命令之后被调用。</td></tr><tr style="font: normal normal normal 12px/normal song, Verdana; "><td align="left" style="font: normal normal normal 12px/normal song, Verdana; "><code>void sharedAssertions()</code></td><td align="left" style="font: normal normal normal 12px/normal song, Verdana; ">重写以执行一个测试用例中的所有测试共享的断言。该方法在一个测试执行结束之前被调用。</td></tr></tbody></table></div></div><br style="font: normal normal normal 12px/normal song, Verdana; " /><p style="font: normal normal normal 12px/normal song, Verdana; ">请查阅<a href="http://www.openqa.org/selenium-core/reference.html" target="_top" style="text-decoration: underline; color: #0044b6; ">Selenium Core的文档</a>获得关于可用的命令以及如何使用的参考。</p><p style="font: normal normal normal 12px/normal song, Verdana; ">利用<code>runSelenese($filename)</code>方法，你也能从它的Selenese/HTML规范运行一个Selenium测试。此外，利用静态属性<code>$seleneseDirectory</code>，你能从一个包含Selenese/HTML文件的目录自动地创建测试对象。指定的目录被递归地搜索预期包含Selenese/HTML的<code>.htm</code>文件。&nbsp;<a href="file:///F:/data2/PHPUnit_Pocket_Guide_-_v32/index_cn.html#selenium.seleniumtestcase.examples.WebTest3.php" title="Example 19.3: Use a directory of Selenese/HTML files as tests" style="text-decoration: underline; color: #0044b6; ">范例 19.3</a>显示一个例子。</p><div><p style="font: normal normal normal 12px/normal song, Verdana; "><strong>范例 19.3: 使用Selenese/HTML文件的目录作为测试</strong></p><div><pre><code>&lt;?php<br style="font: normal normal normal 12px/normal song, Verdana; " />require_once&nbsp;'PHPUnit/Extensions/SeleniumTestCase.php';<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;<br style="font: normal normal normal 12px/normal song, Verdana; " />class&nbsp;SeleneseTests&nbsp;extends&nbsp;PHPUnit_Extensions_SeleniumTestCase<br style="font: normal normal normal 12px/normal song, Verdana; " />{<br style="font: normal normal normal 12px/normal song, Verdana; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;$seleneseDirectory&nbsp;=&nbsp;'/path/to/files';<br style="font: normal normal normal 12px/normal song, Verdana; " />}<br style="font: normal normal normal 12px/normal song, Verdana; " />?&gt;</code></pre></div></div></div></span></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/350990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-05-25 12:14 <a href="http://www.blogjava.net/xiaomage234/archive/2011/05/25/350990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程[转]</title><link>http://www.blogjava.net/xiaomage234/archive/2010/07/22/326850.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 22 Jul 2010 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2010/07/22/326850.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/326850.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2010/07/22/326850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/326850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/326850.html</trackback:ping><description><![CDATA[<div class="TextContent">
<div class="entry">
<p><strong>一、http_load</strong></p>
<p>程序非常小，解压后也不到100K</p>
<p>http_load以并行复用的方式运行，用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工</p>
<p>具，它可以以一个单一的进程运行，一般不会把客户机搞死。还可以测试HTTPS类的网站请求。</p>
<p>下载地址：<a href="http://soft.vpser.net/test/http_load/http_load-12mar2006.tar.gz">http://soft.vpser.net/test/http_load/http_load-12mar2006.tar.gz</a><br />
安装很简单<br />
#tar zxvf http_load-12mar2006.tar.gz<br />
#cd http_load-12mar2006<br />
#make &amp;&amp; make install</p>
<p>命令格式：http_load&nbsp; -p 并发访问进程数&nbsp; -s 访问时间&nbsp; 需要访问的URL文件</p>
<p>参数其实可以自由组合，参数之间的选择并没有什么限制。比如你写成http_load -parallel 5 -seconds</p>
<p>300 urls.txt也是可以的。我们把参数给大家简单说明一下。<br />
-parallel 简写-p ：含义是并发的用户进程数。<br />
-fetches 简写-f ：含义是总计的访问次数<br />
-rate&nbsp;&nbsp;&nbsp; 简写-p ：含义是每秒的访问频率<br />
-seconds简写-s ：含义是总计的访问时间</p>
<p>准备URL文件：urllist.txt，文件格式是每行一个URL，URL最好超过50－100个测试效果比较好.文件格式</p>
<p>如下：<br />
<a href="http://www.vpser.net/uncategorized/choose-vps.html">http://www.vpser.net/uncategorized/choose-vps.html</a><br />
<a href="http://www.vpser.net/vps-cp/hypervm-tutorial.html">http://www.vpser.net/vps-cp/hypervm-tutorial.html</a><br />
<a href="http://www.vpser.net/coupons/diavps-april-coupons.html">http://www.vpser.net/coupons/diavps-april-coupons.html</a><br />
<a href="http://www.vpser.net/security/vps-backup-web-mysql.html">http://www.vpser.net/security/vps-backup-web-mysql.html</a><br />
例如：</p>
<p>http_load -p 30 -s 60&nbsp; urllist.txt<br />
参数了解了，我们来看运行一条命令来看看它的返回结果<br />
命令：% ./http_load -rate 5 -seconds 10 urls说明执行了一个持续时间10秒的测试，每秒的频率为5。</p>
<p>49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds5916 mean bytes/connection4.89274</p>
<p>fetches/sec, 28945.5 bytes/secmsecs/connect: 28.8932 mean, 44.243 max, 24.488 minmsecs/first</p>
<p>-response: 63.5362 mean, 81.624 max, 57.803 minHTTP response codes: code 200 — 49&nbsp;</p>
<p>结果分析：<br />
1．49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds<br />
说明在上面的测试中运行了49个请求，最大的并发进程数是2，总计传输的数据是289884bytes，运行的时间是10.0148秒<br />
2．5916 mean bytes/connection说明每一连接平均传输的数据量289884/49=5916<br />
3．4.89274 fetches/sec, 28945.5 bytes/sec<br />
说明每秒的响应请求为4.89274，每秒传递的数据为28945.5 bytes/sec<br />
4．msecs/connect: 28.8932 mean, 44.243 max, 24.488 min说明每连接的平均响应时间是28.8932 msecs</p>
<p>，最大的响应时间44.243 msecs，最小的响应时间24.488 msecs<br />
5．msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min<br />
6、HTTP response codes: code 200 — 49&nbsp;&nbsp;&nbsp;&nbsp; 说明打开响应页面的类型，如果403的类型过多，那可能</p>
<p>要注意是否系统遇到了瓶颈。<br />
特殊说明：<br />
测试结果中主要的指标是 fetches/sec、msecs/connect 这个选项，即服务器每秒能够响应的查询次数，</p>
<p>用这个指标来衡量性能。似乎比 apache的ab准确率要高一些，也更有说服力一些。<br />
Qpt-每秒响应用户数和response time，每连接响应用户时间。<br />
测试的结果主要也是看这两个值。当然仅有这两个指标并不能完成对性能的分析，我们还需要对服务器的</p>
<p>cpu、men进行分析，才能得出结论</p>
<p>&nbsp;</p>
<p><strong>二、webbench</strong></p>
<p>webbench是Linux下的一个网站压力测试工具，最多可以模拟3万个并发连接去测试网站的负载能力。下载地址可以到google搜，我这里给出一个<br />
下载地址：<a href="http://soft.vpser.net/test/webbench/webbench-1.5.tar.gz">http://soft.vpser.net/test/webbench/webbench-1.5.tar.gz</a><br />
这个程序更小，解压后不到50K，呵呵<br />
安装非常简单<br />
#tar zxvf webbench-1.5.tar.gz<br />
#cd webbench-1.5<br />
#make &amp;&amp; make install<br />
会在当前目录生成webbench可执行文件，直接可以使用了</p>
<p>用法：</p>
<p>webbench -c 并发数 -t 运行测试时间 URL<br />
如：<br />
webbench -c 5000 -t 120 <a href="http://www.vpser.net/">http://www.vpser.net</a></p>
<p><strong>三、ab</strong><br />
ab是apache自带的一款功能强大的测试工具<br />
安装了apache一般就自带了，<br />
用法可以查看它的说明</p>
<p>$ ./ab<br />
./ab: wrong number of arguments<br />
Usage: ./ab [options] [http://]hostname[:port]/path<br />
Options are:<br />
-n requests Number of requests to perform<br />
-c concurrency Number of multiple requests to make<br />
-t timelimit Seconds to max. wait for responses<br />
-p postfile File containing data to POST<br />
-T content-type Content-type header for POSTing<br />
-v verbosity How much troubleshooting info to print<br />
-w Print out results in HTML tables<br />
-i Use HEAD instead of GET<br />
-x attributes String to insert as table attributes<br />
-y attributes String to insert as tr attributes<br />
-z attributes String to insert as td or th attributes<br />
-C attribute Add cookie, eg. &#8216;Apache=1234. (repeatable)<br />
-H attribute Add Arbitrary header line, eg. &#8216;Accept-Encoding: gzip&#8217;<br />
Inserted after all normal header lines. (repeatable)<br />
-A attribute Add Basic WWW Authentication, the attributes<br />
are a colon separated username and password.<br />
-P attribute Add Basic Proxy Authentication, the attributes<br />
are a colon separated username and password.<br />
-X proxy:port Proxyserver and port number to use<br />
-V Print version number and exit<br />
-k Use HTTP KeepAlive feature<br />
-d Do not show percentiles served table.<br />
-S Do not show confidence estimators and warnings.<br />
-g filename Output collected data to gnuplot format file.<br />
-e filename Output CSV file with percentages served<br />
-h Display usage information (this message)<br />
参数众多，一般我们用到的是-n 和-c<br />
例如：<br />
./ab -c 1000 -n 100 <a href="http://www.vpser.net/index.php">http://www.vpser.net/index.php</a></p>
<p>这个表示同时处理1000个请求并运行100次index.php文件.<br />
<strong>四、Siege<br />
</strong>一款开源的压力测试工具，可以根据配置对一个WEB站点进行多用户的并发访问，记录每个用户所有请求过程的相应时间，并在一定数量的并发访问下重复进行。<br />
官方：<a href="http://www.joedog.org/">http://www.joedog.org/</a><br />
Siege下载：<a href="http://soft.vpser.net/test/siege/siege-2.67.tar.gz">http://soft.vpser.net/test/siege/siege-2.67.tar.gz</a><br />
解压：<br />
# tar -zxf siege-2.67.tar.gz<br />
进入解压目录：<br />
# cd siege-2.67/<br />
安装：<br />
#./configure ; make<br />
#make install</p>
<p>使用<br />
siege -c 200 -r 10 -f example.url<br />
-c是并发量，-r是重复次数。 url文件就是一个文本，每行都是一个url，它会从里面随机访问的。</p>
<p>example.url内容:</p>
<p><a href="http://www.licess.cn/">http://www.licess.cn</a><br />
<a href="http://www.vpser.net/">http://www.vpser.net</a><br />
<a href="http://soft.vpser.net/">http://soft.vpser.net</a></p>
<p>结果说明<br />
Lifting the server siege&#8230; done.<br />
Transactions: 3419263 hits //完成419263次处理<br />
Availability: 100.00 % //100.00 % 成功率<br />
Elapsed time: 5999.69 secs //总共用时<br />
Data transferred: 84273.91 MB //共数据传输84273.91 MB<br />
Response time: 0.37 secs //相应用时1.65秒：显示网络连接的速度<br />
Transaction rate: 569.91 trans/sec //均每秒完成 569.91 次处理：表示服务器后<br />
Throughput: 14.05 MB/sec //平均每秒传送数据<br />
Concurrency: 213.42 //实际最高并发数<br />
Successful transactions: 2564081 //成功处理次数<br />
Failed transactions: 11 //失败处理次数<br />
Longest transaction: 29.04 //每次传输所花最长时间<br />
Shortest transaction: 0.00 //每次传输所花最短时间</p>
</div>
</div>
<div class="copyright">转帖自：<a href="http://blog.licess.cn/http_load-webbench-ab-siege/">http://blog.licess.cn/http_load-webbench-ab-siege/</a> </div>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/326850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2010-07-22 17:00 <a href="http://www.blogjava.net/xiaomage234/archive/2010/07/22/326850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Bugzilla安装</title><link>http://www.blogjava.net/xiaomage234/archive/2008/08/14/221950.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 14 Aug 2008 04:30:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2008/08/14/221950.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/221950.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2008/08/14/221950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/221950.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/221950.html</trackback:ping><description><![CDATA[今天准备安装一个Bugzilla为工作提供方便。<br />
准备：下载Mysql，Bugzilla，Apache<br />
<br />
安装：<br />
1、Mysql安装<br />
&nbsp; 我是到Mysql官方网站下载For Suse的rpm包（下载了所有的rpm包，本来只安装了server包，不过最后因为缺包而中断安装）。<br />
&nbsp; 安装所有的Mysql包：<br />
&nbsp; #rpm -ivh Mysql-*<br />
<br />
&nbsp; 最后就是对数据库进行设置：<br />
&nbsp; #mysql<br />
<font class="f14" id="zoom">&nbsp;&nbsp;&nbsp; mysql&gt;create database bugs;<br />
&nbsp;&nbsp;&nbsp; mysql&gt;GRANT SELECT, INSERT,UPDATE, DELETE, INDEX, ALTER,CREATE,LOCK TABLES,CREATE TEMPORARY TABLES, DROP, REFERENCES ON bugs.* TO bugs@localhost IDENTIFIED BY 'bugs';<br />
&nbsp;&nbsp;&nbsp; mysql&gt;FLUSH PRIVILEGES;<br />
&nbsp;&nbsp;&nbsp; mysql&gt;quit</font><br />
&nbsp; 这样就建了一个bugs表;一个用户名为bugs，密码的Mysql用户。<br />
<br />
2、安装Apache<br />
&nbsp; 到Apache官方网站下载源代码。<br />
&nbsp; #./configure<br />
&nbsp; #make<br />
&nbsp; #make install<br />
<br />
安装完毕。<br />
启动Apache<br />
&nbsp; #./apachectl start<br />
不过这里是用root来启动的，如果切换到其它用户启动就会抛出错误，说没有权限，在网上找了些资料，但最终也未能完全解决。<br />
<br />
3、安装Bugzilla<br />
&nbsp; 到官方网站下载Bugzilla<br />
&nbsp; #tar zxvf bugzilla-2.22-...<br />
&nbsp; #cd bugzilla-2.22-...<br />
&nbsp; #./checksetup.pl<br />
&nbsp; 这样就会检测出来Perl需要安装的模块。然后根据列出的提示信息下载安装Perl模块。（这个比较方便的）而且只需要安装那些必要的模块就可以了。<br />
&nbsp; 当<br />
&nbsp; #./checksetup.pl能正常执行完毕时，在当前目录下就会生成一个文件：localconfig<br />
&nbsp; 然后，需要修改localconfig文件，这样就可以对Bugzilla的设置进行修改。<br />
在这里你可以对数据库表名，用户名和密码进行配置。<br />
&nbsp; 修改好之后再次运行：<br />
&nbsp; #./checksetup.pl<br />
&nbsp; 如果正常则表示安装成功<br />
<br />
4、配置Apache<br />
&nbsp; 配置Apache是一个比较郁闷的事情，因为以前都没有好好地接触过Apache。<br />
如果熟悉Apache的配置文件就很容易了。<br />
&nbsp; 下面给出一些有用的配置：<br />
配置文件可能是apache2.conf和httpd.conf<br />
找到文件，然后做以下操作：<br />
找到<br />
<font class="f14" id="zoom">AddHandler cgi-script .cgi <br />
把注释去掉<br />
添加以下配置<br />
Alias /bugzilla/ "/usr/local/apache2/cgi-bin/bugzilla/"<br />
&lt;Directory "/usr/local/apache2/cgi-bin/bugzilla/"&gt;<br />
&nbsp;&nbsp; AddHandler cgi-script .cgi<br />
&nbsp;&nbsp; Options +Indexes +ExecCGI<br />
&nbsp;&nbsp; DirectoryIndex index.cgi<br />
&nbsp;&nbsp; AllowOverride Limit<br />
&lt;/Directory&gt;<br />
<br />
</font>基本上这样安装就完全结束了。<br />
<br />
然后重启apache<br />
最后就可以访问了<br />
<img src ="http://www.blogjava.net/xiaomage234/aggbug/221950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2008-08-14 12:30 <a href="http://www.blogjava.net/xiaomage234/archive/2008/08/14/221950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>每日构造与冒烟测试</title><link>http://www.blogjava.net/xiaomage234/archive/2008/08/11/221339.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Mon, 11 Aug 2008 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2008/08/11/221339.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/221339.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2008/08/11/221339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/221339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/221339.html</trackback:ping><description><![CDATA[<p>如果你想创建一个只包含一个源程序文件的简单程序，那么你只需要编译、连接那一个文件就可以了。如果是一个团队项目组，有着许多甚至上千个源程序文件，那么要创建一个可执行程序的过程就变得更复杂、更耗时。你必须用各种各样的组件将程序逐步建立起来。 </p>
<p>在微软或其它一些软件公司中惯例是：每日构造并做&#8220;冒烟测试&#8221;。每天都对已完成的源程序进行编译，然后连接组合成可执行的程序，并做&#8220;冒烟测试&#8221;，以简单的检查该执行程序在运行时是否会&#8220;冒烟&#8221;。 </p>
<p>带来的好处</p>
<p>虽然这是一个非常简单的过程，但却有非常重要的意义： </p>
<p>1、能最小化集成风险 </p>
<p>项目组可能遇到的一个很大的风险是，项目组成员根据不同的系统功能各自开发不同的代码，但是当这些代码集成为一个系统的时候，也许系统完成不了预期的功能。这种风险的发生取决于项目中的这种不兼容性多久才被发现，由于程序界面已经发生了变化，或者系统的主要部分已经被重新设计和重新实现了，相应的排错工作将非常困难和耗时。极端情况下，集成的错误可能回导致项目被取消掉。每日构造和冒烟测试可以使这种集成错误变得非常小，而且便于解决，防止了很多集成问题的产生。</p>
<p>2、能减小产品低质量的风险 </p>
<p>&nbsp;&nbsp;&nbsp; 这种风险是和集成不成功、集成出错相关联的。每天对集成的代码做一些少量的冒烟测试，即可杜绝项目中那些基本的质量问题。通过这种方式，使系统达到一种周知的良好状态，维护这样的系统可以防止系统逐步恶化到耗费大量时间排查质量问题的地步。</p>
<p>3、能简单化错误诊断</p>
<p>当系统每天都进行build和测试时，系统任何一天发生的错误都能够变得十分精细，便于排查。比如在17日系统还运行正常，18日就出错了，那么只需要检查这两次build之间的代码变化就可以了。</p>
<p>4、能极大鼓舞项目组的士气 </p>
<p>看到产品的不断成长，能够极大的鼓舞项目组的士气，有时甚至不管这个产品到底用来做什么。开发人员可能会为系统显示了一个矩形而感到激动。通过每日构造，产品每天进步一点点，保证项目士气的持续高涨。</p>
<p>进行每日构造和冒烟测试</p>
<p>虽然说这是一个简单枯燥的活，每天进行build，每天进行测试，但也有着一些值得注意的细节： </p>
<p>1、每天坚持 </p>
<p>每日构造，最重要的就是&#8220;每日&#8221;。如Jim McCarthy所说，把每日构造看作是项目的&#8220;心跳&#8221;，没有&#8220;心跳&#8221;的话，项目也就死了(Dynamics of Software Development, Microsoft Press, 1995)。Michael Cusumano and Richard W. Selby描述了另外一种隐含的比喻，把每日构造比作项目的&#8220;同步脉冲&#8221;(Microsoft Secrets, The Free Press, 1995)。 不同开发人员写的代码在他们的&#8220;脉冲&#8221;之间肯定都会存在&#8220;同步&#8221;的差异，但是必须有这样一个&#8220;同步脉冲&#8221;，使得这些代码能够组合为一个整体。当项目组坚持每天把这些不同的&#8220;脉冲&#8221;组合到一起的时候，开发人员脱离整体的情况就会得到极大程度的杜绝。</p>
<p>有些项目组把这一过程简化为&#8220;每周build一次&#8221;。这样带来的问题是，某一次build失败后，可能要回溯好几周才能找到原因。如果这种情况发生的话，已经得不到经常build带来的好处了。</p>
<p>2、严格检查每一次build</p>
<p>要保证每一次build的成功，就必须保证build后的结果（也可称为build）是可以正常运行的，如果build不可运行，那么本次build被认为是不成功的，同时应该将修复此次build的工作提高到项目组最高级别来处理。</p>
<p>对于如何衡量一个build，每一个项目组都会定义一些自己的标准，这些标准需要设定一个严格的质量级别来处理那些特别严重的缺陷，同时也需要具有一定的伸缩性来忽略掉那些微不足道的缺陷，一些不适当的关心也许会使整个过程举步为艰。</p>
<p>一个好的build起码应该具备以下条件：</p>
<p>●能够成功编译所有的文件、库，以及其它相关组件；</p>
<p>●能够成功链接所有的文件、库，以及其它相关组件；</p>
<p>●不能存在任何使得系统无法运行或者运行出错的高级别故障；</p>
<p>●当然，必须通过冒烟测试</p>
<p>3、每天进行冒烟测试</p>
<p>冒烟测试应该是对整个系统流程从输入到输出的完整测试。测试不必是面面俱到的，但是应该能够发现系统中较大的问题。冒烟测试应该是足够充分的，通过了冒烟测试的build就可以认为是经过充分测试、足够稳定的。</p>
<p>不进行冒烟测试的build是没有太大价值的。冒烟测试就像一个哨兵，在阻止着产品质量恶化和集成问题的产生，不进行冒烟测试，每日构造可能会变成浪费时间的练习。</p>
<p>冒烟测试必须随着系统的扩充而扩充。最初，冒烟测试可能是非常简单的，比如验证系统是否会打印&#8220;Hello World&#8221;，随着系统功能的扩充，冒烟测试需要越来越充分。最初的冒烟测试也许只需要几秒钟来执行，逐渐地，测试可能会花费30分钟，1小时，甚至更长。</p>
<p>4、建立一个专门的build小组</p>
<p>&nbsp;&nbsp;&nbsp; 在很多项目组，维护每日构造，并更新冒烟测试用例，会耗费一个人工作的大部分时间。因此在一些大的项目中，这项工作独立成不止一个人来完成的全职工作。比如在 Windows NT 3.0的研发中，就有一个由四个全职人员组成的专门的build小组(Pascal Zachary, Showstopper!, The Free Press, 1994)。</p>
<p>5、为build增加修订，如果这样做有意义的话</p>
<p>&nbsp;&nbsp;&nbsp; 一般开发人员不会每天都经常向系统中快速的增加实际的代码，通常是每隔几天，他们在开发好完成某个功能的一套代码以后，然后集成到整个系统中。</p>
<p>6、规定一些导致build失败的惩罚措施</p>
<p>很多执行每日构造的项目组都会规定一些惩罚措施，来惩罚那些导致build失败的行为。从最开始，项目组成员就清楚的知道，build的正常执行是项目组的头等大事。一个失败的build是项目组的意外，无法成为项目组工作的准则。必须坚持：导致build失败的同事，必须停下手中的工作，首先来解决build失败的问题。如果一个项目组的build经常失败的话，久而久之的，再来谈build的正确性就没有意义了。</p>
<p>有种轻松的惩罚措施，能够突出解决问题的优先性。Some groups give out lollipops to each "sucker" who breaks the build. This developer then has to tape the sucker to his office door until he fixes the problem. 有些项目组会惩罚犯错的同事戴上山羊角，或者向一个项目基金捐献5块钱。</p>
<p>有些项目组对此的惩罚就有点残酷了。微软的开发人员，在一些知名度很高、很重要的产品如Windows NT，Windows 95，Excel等产品后期研发中，被要求随时带着寻呼机，如果你的代码导致build失败的话，即使是凌晨3点钟，也会要求你立即来处理这个问题。</p>
<p>7、即使在压力下也需坚持每日构造和冒烟测试</p>
<p>当项目进度的压力越来越大时，维护每日构造的工作看起来有些浪费时间，但是恰恰相反。在压力之下，开发人员丢掉一些平时的规定，会采用一些设计和实现的捷径，这在平时压力较小的环境下一般时不会用的。代码的review和单元测试也可能会比平时粗心一些，这些代码的状态变化也会比平时快很多。</p>
<p>为防止这种情况的出现，每日构造会坚持相关的规定，让压力下的项目保持在正轨上。代码仍然每天在不断变化，但是构造过程使得这种变化每天都可控。</p>
<p>谁能够从每日构造这种过程中得到好处呢？一些开发人员会抗议说，由于他们的项目太大，每天进行build是没有实际意义的。但是为什么现在最复杂的软件项目组却能够成功的执行每日构造的制度呢？本文首发时，Windows NT包括了560万行代码、分布在4万个源程序文件中，项目组仍然可以坚持每日构造。<br />
</p>
 <img src ="http://www.blogjava.net/xiaomage234/aggbug/221339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2008-08-11 17:12 <a href="http://www.blogjava.net/xiaomage234/archive/2008/08/11/221339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>