vmstat命令是最常見的Linux/Unix監(jiān)控工具,可以展現(xiàn)給定時(shí)間間隔的服務(wù)器的狀態(tài)值,包括服務(wù)器的CPU使用率,內(nèi)存使用,虛擬內(nèi)存交換情況,IO讀寫情況。這個(gè)命令是我查看Linux/Unix最喜愛的命令,一個(gè)是Linux/Unix都支持,二是相比top,我可以看到整個(gè)機(jī)器的CPU,內(nèi)存,IO的使用情況,而不是單單看到各個(gè)進(jìn)程的CPU使用率和內(nèi)存使用率(使用場(chǎng)景不一樣)。
一般vmstat工具的使用是通過(guò)兩個(gè)數(shù)字參數(shù)來(lái)完成的,第一個(gè)參數(shù)是采樣的時(shí)間間隔數(shù),單位是秒,第二個(gè)參數(shù)是采樣的次數(shù),如:
root@ubuntu:~# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 0
2表示每個(gè)兩秒采集一次服務(wù)器狀態(tài),1表示只采集一次。
實(shí)際上,在應(yīng)用過(guò)程中,我們會(huì)在一段時(shí)間內(nèi)一直監(jiān)控,不想監(jiān)控直接結(jié)束vmstat就行了,例如:
root@ubuntu:~# vmstat 2 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0 0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0 0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0 0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0 1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0 |
這表示vmstat每2秒采集數(shù)據(jù),一直采集,直到我結(jié)束程序,這里采集了5次數(shù)據(jù)我就結(jié)束了程序。
好了,命令介紹完畢,現(xiàn)在開始實(shí)戰(zhàn)講解每個(gè)參數(shù)的意思。
r 表示運(yùn)行隊(duì)列(就是說(shuō)多少個(gè)進(jìn)程真的分配到CPU),我
測(cè)試的服務(wù)器目前CPU比較空閑,沒(méi)什么程序在跑,當(dāng)這個(gè)值超過(guò)了CPU數(shù)目,就會(huì)出現(xiàn)CPU瓶頸了。這個(gè)也和top的負(fù)載有關(guān)系,一般負(fù)載超過(guò)了3就比較高,超過(guò)了5就高,超過(guò)了10就不正常了,服務(wù)器的狀態(tài)很危險(xiǎn)。top的負(fù)載類似每秒的運(yùn)行隊(duì)列。如果運(yùn)行隊(duì)列過(guò)大,表示你的CPU很繁忙,一般會(huì)造成CPU使用率很高。
b 表示阻塞的進(jìn)程,這個(gè)不多說(shuō),進(jìn)程阻塞,大家懂的。
swpd 虛擬內(nèi)存已使用的大小,如果大于0,表示你的機(jī)器物理內(nèi)存不足了,如果不是程序內(nèi)存泄露的原因,那么你該升級(jí)內(nèi)存了或者把耗內(nèi)存的任務(wù)遷移到其他機(jī)器。
free 空閑的物理內(nèi)存的大小,我的機(jī)器內(nèi)存總共8G,剩余3415M。
buff Linux/Unix系統(tǒng)是用來(lái)存儲(chǔ),目錄里面有什么內(nèi)容,權(quán)限等的緩存,我本機(jī)大概占用300多M
cache cache直接用來(lái)記憶我們打開的文件,給文件做緩沖,我本機(jī)大概占用300多M(這里是Linux/Unix的聰明之處,把空閑的物理內(nèi)存的一部分拿來(lái)做文件和目錄的緩存,是為了提高 程序執(zhí)行的性能,當(dāng)程序使用內(nèi)存時(shí),buffer/cached會(huì)很快地被使用。)
si 每秒從磁盤讀入虛擬內(nèi)存的大小,如果這個(gè)值大于0,表示物理內(nèi)存不夠用或者內(nèi)存泄露了,要查找耗內(nèi)存進(jìn)程解決掉。我的機(jī)器內(nèi)存充裕,一切正常。
so 每秒虛擬內(nèi)存寫入磁盤的大小,如果這個(gè)值大于0,同上。
bi 塊設(shè)備每秒接收的塊數(shù)量,這里的塊設(shè)備是指系統(tǒng)上所有的磁盤和其他塊設(shè)備,默認(rèn)塊大小是1024byte,我本機(jī)上沒(méi)什么IO操作,所以一直是0,但是我曾在處理拷貝大量數(shù)據(jù)(2-3T)的機(jī)器上看過(guò)可以達(dá)到140000/s,磁盤寫入速度差不多140M每秒
bo 塊設(shè)備每秒發(fā)送的塊數(shù)量,例如我們讀取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO過(guò)于頻繁,需要調(diào)整。
in 每秒CPU的中斷次數(shù),包括時(shí)間中斷
cs 每秒上下文切換次數(shù),例如我們調(diào)用系統(tǒng)函數(shù),就要進(jìn)行上下文切換,線程的切換,也要進(jìn)程上下文切換,這個(gè)值要越小越好,太大了,要考慮調(diào)低線程或者進(jìn)程的數(shù)目,例如在apache和nginx這種
web服務(wù)器中,我們一般做
性能測(cè)試時(shí)會(huì)進(jìn)行幾千并發(fā)甚至幾萬(wàn)并發(fā)的測(cè)試,選擇web服務(wù)器的進(jìn)程可以由進(jìn)程或者線程的峰值一直下調(diào),壓測(cè),直到cs到一個(gè)比較小的值,這個(gè)進(jìn)程和線程數(shù)就是比較合適的值了。系統(tǒng)調(diào)用也是,每次調(diào)用系統(tǒng)函數(shù),我們的代碼就會(huì)進(jìn)入內(nèi)核空間,導(dǎo)致上下文切換,這個(gè)是很耗資源,也要盡量避免頻繁調(diào)用系統(tǒng)函數(shù)。上下文切換次數(shù)過(guò)多表示你的CPU大部分浪費(fèi)在上下文切換,導(dǎo)致CPU干正經(jīng)事的時(shí)間少了,CPU沒(méi)有充分利用,是不可取的。
us 用戶CPU時(shí)間,我曾經(jīng)在一個(gè)做加密解密很頻繁的服務(wù)器上,可以看到us接近100,r運(yùn)行隊(duì)列達(dá)到80(機(jī)器在做壓力測(cè)試,性能表現(xiàn)不佳)。
sy 系統(tǒng)CPU時(shí)間,如果太高,表示系統(tǒng)調(diào)用時(shí)間長(zhǎng),例如是IO操作頻繁。
id 空閑 CPU時(shí)間,一般來(lái)說(shuō),id + us + sy = 100,一般我認(rèn)為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統(tǒng)CPU使用率。
wt 等待IO CPU時(shí)間。
下午內(nèi)網(wǎng)
測(cè)試庫(kù)同事反應(yīng)查詢更新數(shù)據(jù)很慢,有時(shí)甚至表都打不開,后來(lái)通過(guò)服務(wù)器【linux】的top命令查看了下,cpu和mem占用正常,但wait高達(dá)80%多(下面兩圖顯示的就是問(wèn)題前后觀察EM對(duì)比的截圖,版本是oracle10gR2,EM的效果比oracle11gR2遜色不少哈):
-------------------------------------->>
---------------------------->>
接著通過(guò)sqldevelpdev客戶端查詢有沒(méi)有鎖等待之類會(huì)話事件,果然有,而且是兩個(gè)session持有TX鎖,然后通過(guò)下面的sql查詢從oracle和linux級(jí)別kill掉了相應(yīng)session,以為風(fēng)波就此平靜,結(jié)果過(guò)了不到一分鐘查詢又出現(xiàn),只不過(guò)這次只有一個(gè)session持有TX鎖,于是就去查找對(duì)應(yīng)的sql_txt,找到后發(fā)現(xiàn)是個(gè)同事寫的存儲(chǔ)過(guò)程,定時(shí)任務(wù),當(dāng)時(shí)正在運(yùn)行,讓其確認(rèn)下是不是任務(wù)執(zhí)行出問(wèn)題了,結(jié)果一查,是程序問(wèn)題,造成的死循環(huán),它會(huì)批量發(fā)起會(huì)話,kill一個(gè)后接著又鎖,循環(huán)反復(fù),后來(lái)他改了下程序后重新運(yùn)行,一切恢復(fù)通暢.

--查詢死鎖 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao,v$session sess where ao.object_id = lo.object_id and lo.session_id = sess.sid; --oracle級(jí)別kill session alter system kill session '1627,1'; alter system kill session '1564,64740'; --查詢當(dāng)前連接會(huì)話 select s.value,s.sid,a.username,a.MACHINE from v$sesstat S,v$statname N,v$session A where n.statistic#=s.statistic# and name='session pga memory' and s.sid=a.sid and a.sid=1626 order by s.value; --查詢?cè)斐伤梨i的sql語(yǔ)句 SELECT a.SID, a.username, s.sql_text FROM v$session a, v$sqltext s WHERE a.sql_address = s.address AND a.sql_hash_value = s.hash_value and a.SID=1626 ORDER BY a.username, a.SID, s.piece; --造成鎖等待的操作內(nèi)容 begin flt_com.p_line_relation_change(:A0,:B0,:C0,:D0,:E0,:ret_errorcode,:ret_errorname); end; --通過(guò)sid查找pid,進(jìn)而通過(guò)系統(tǒng)級(jí)別kill select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=1605; --服務(wù)器級(jí)別kill kill -9 spid --------------------------------over game |
java中環(huán)境變量的設(shè)置,主要是設(shè)置設(shè)置JAVA_HOME,CLASSPATH,在path變量中增加java的bin目錄。當(dāng)然現(xiàn)在都是用工具開發(fā),可以不設(shè)置CLASSPATH,可能會(huì)有問(wèn)題,所以還是盡量設(shè)置、
JAVA_HOME
C:\Java\jdk1.6.0_30(java的安裝目錄,)
PATH
C:\Java\jdk1.6.0_30\bin(%JAVA_HOME%\lib)(不要新建path在原來(lái)的path路徑上新加java到bin的路徑就可以了,)
CLASSPATH
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(注前面的點(diǎn)號(hào)和分號(hào)一定不能丟,還有中間的,后面的分號(hào)也不要丟了)
說(shuō)明:CLASSPATH可以再增加一些第三方的jar文件,方便手工編譯和運(yùn)行程序。
***********************************************************
在windows中查看環(huán)境變量,用set,要查看某一個(gè)環(huán)境變量的值,可以用set后面跟要查看的值,比如:set classpath ,查看path變量的話,可以直接輸入path就可以了。
設(shè)置環(huán)境變量,可以用set ,比如 set classpath=“新的路徑”; 這樣就可以了,但只是臨時(shí)的,doc窗口關(guān)閉的時(shí)候,設(shè)置的臨時(shí)環(huán)境變量就不存在了。
下午內(nèi)網(wǎng)
測(cè)試庫(kù)同事反應(yīng)查詢更新數(shù)據(jù)很慢,有時(shí)甚至表都打不開,后來(lái)通過(guò)服務(wù)器【linux】的top命令查看了下,cpu和mem占用正常,但wait高達(dá)80%多(下面兩圖顯示的就是問(wèn)題前后觀察EM對(duì)比的截圖,版本是oracle10gR2,EM的效果比oracle11gR2遜色不少哈):
-------------------------------------->>
---------------------------->>
接著通過(guò)sqldevelpdev客戶端查詢有沒(méi)有鎖等待之類會(huì)話事件,果然有,而且是兩個(gè)session持有TX鎖,然后通過(guò)下面的sql查詢從oracle和linux級(jí)別kill掉了相應(yīng)session,以為風(fēng)波就此平靜,結(jié)果過(guò)了不到一分鐘查詢又出現(xiàn),只不過(guò)這次只有一個(gè)session持有TX鎖,于是就去查找對(duì)應(yīng)的sql_txt,找到后發(fā)現(xiàn)是個(gè)同事寫的存儲(chǔ)過(guò)程,定時(shí)任務(wù),當(dāng)時(shí)正在運(yùn)行,讓其確認(rèn)下是不是任務(wù)執(zhí)行出問(wèn)題了,結(jié)果一查,是程序問(wèn)題,造成的死循環(huán),它會(huì)批量發(fā)起會(huì)話,kill一個(gè)后接著又鎖,循環(huán)反復(fù),后來(lái)他改了下程序后重新運(yùn)行,一切恢復(fù)通暢.

--查詢死鎖 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao,v$session sess where ao.object_id = lo.object_id and lo.session_id = sess.sid; --oracle級(jí)別kill session alter system kill session '1627,1'; alter system kill session '1564,64740'; --查詢當(dāng)前連接會(huì)話 select s.value,s.sid,a.username,a.MACHINE from v$sesstat S,v$statname N,v$session A where n.statistic#=s.statistic# and name='session pga memory' and s.sid=a.sid and a.sid=1626 order by s.value; --查詢?cè)斐伤梨i的sql語(yǔ)句 SELECT a.SID, a.username, s.sql_text FROM v$session a, v$sqltext s WHERE a.sql_address = s.address AND a.sql_hash_value = s.hash_value and a.SID=1626 ORDER BY a.username, a.SID, s.piece; --造成鎖等待的操作內(nèi)容 begin flt_com.p_line_relation_change(:A0,:B0,:C0,:D0,:E0,:ret_errorcode,:ret_errorname); end; --通過(guò)sid查找pid,進(jìn)而通過(guò)系統(tǒng)級(jí)別kill select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=1605; --服務(wù)器級(jí)別kill kill -9 spid --------------------------------over game |
用CURL命令行測(cè)試
REST API 無(wú)疑是低效率的,這里把最近使用的兩款 Chrome 插件總結(jié)下
POSTMAN
簡(jiǎn)單易用
REST Console
功能強(qiáng)大
使用的話用POSTMAN就夠用了,但是我更喜歡 REST Console ,因?yàn)樗墓δ芊浅?qiáng)大和全面,一下子就能讓你搞清楚你在做的事情,你用不到的功能也可以幫助你更加了解 REST, http請(qǐng)求的過(guò)程。
下面是兩個(gè)的截圖界面
1. Authorization
Basic Auth
Digest Auth
OAuth 1.0
2. REQUEST METHOD
GET, PUT, POST, PATCH, DELETE, LINK, UNLINK, COPY, HEAD, OPTIONS, PURGE
3. Request Headers
Content-Type: form-data x-www-form-urlencoded raw Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryVQuD0ghtRqDehBQH Request Payload: ------WebKitFormBoundaryVQuD0ghtRqDehBQH Content-Disposition: form-data; name="image" dddddd ------WebKitFormBoundaryVQuD0ghtRqDehBQH-- Content-Type:application/x-www-form-urlencoded Form Data: image:bbbbbbb Content-Type:text/plain;charset=UTF-8 Request Payload: image=aaaaaaaaaaaaaa |
這3種方法其中 form-data 是不支持 PUT 方法的。而用REST Console中的 Content-Type:multpart/form-data 是支持 PUT 方法的。不知道是不是bug
4. Response Body
支持3種展示方式, 以及常用的XML和JSON格式。
Pretty
Raw
Preview
JSON/XML
5. Response Header
Connection → Connection Options that are desired for the connection Keep-Alive Content-Length →93 Content-Type →application/json; charset=UTF-8 Date →Fri, 01 Aug 2014 05:41:56 GMT Keep-Alive →timeout=5, max=100 Server →Apache/2.2.9 (Win32) PHP/5.4.30 mod_fcgid/2.3.6 X-Powered-By →PHP/5.4.30 |
2. REST Console 測(cè)試工具
1. Options
軟件相關(guān)設(shè)置,配色,主題,高亮設(shè)置等(說(shuō)明這個(gè)東東功能比較全面)
特別說(shuō)下一個(gè)選項(xiàng)就是 Help Lines, 開啟這個(gè)選項(xiàng),對(duì)著 REST Console的每一個(gè)選項(xiàng),就很容易搞清楚 http 的 請(qǐng)求和響應(yīng)中的每一個(gè)項(xiàng)目是怎么回事
原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明 : http://www.cnblogs.com/ganiks/
2. Target
設(shè)置下面內(nèi)容:
Target Request URI : 這個(gè)是請(qǐng)求的 URI Request Method : PUT POST ... Request Timeout Accept Accept: (注意區(qū)分這個(gè)type和后面的content-type) */*(一般都是這個(gè)選項(xiàng)) application/atom+xml test/plain application/javascript application/json application/http application/pdf application/rar ... ... Acceptable Language |
3. Body
Content Headers
Content-Type: mime type of the request body(跟PUT和POST方法配合使用)
application/x-www-form-urlencoded
text/plain
multipart/form-data
這3種是在 POSTMAN中支持的3種,但其實(shí)有很多很多種,在 REST Console 中的輸入框中輸入幾個(gè)字母,會(huì)自動(dòng)匹配庫(kù)中的很多選項(xiàng)
Acceptable Encoding: 比如 utf-8(參考 HTTP compression)
Content-MD5: 比如 Q2hlY2sgSW50ZWdyaXR5IQ==
Request Payload
RAW BODY: image=ccccccccc
Request Params: key=>value
Attachements: upload files
Custom Headers
Request Parameters
對(duì)照個(gè)例子:
Accept:*/* Accept-Encoding:gzip,deflate,sdch Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4 Authorization:Basic MTAwLXRva2VuOg== Cache-Control:no-cache Connection:keep-alive Content-Length:20 Content-Type:text/plain;charset=UTF-8 Host:192.168.4.126 Origin:chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 |
4. Authorization
Basic Auth
Setup oAuth
Refresh oAuth
5. Headers
Headers
Max-Forwards: 10 (限制消息可以穿破 的代理和網(wǎng)關(guān)的層數(shù))
Range
From: (發(fā)送消息者的郵件地址)
Warning
Pragma
...
Cache (內(nèi)容太多了)
Common non-standard request headers
6. Response
Response Body: 支持 JSON XML HTML CSS 等高亮格式 { "id": "162", "image": "cccccccc", "link": "dd2", "show_date": "0000-00-00", "state": 1, "show_order": 0 } RAW Body {"id":"162","image":"cccccccc","link":"dd2","show_date":"0000-00-00","state":1,"show_order":0} Response Headers Status Code: 200 Date: Fri, 01 Aug 2014 06:39:00 GMT Server: Apache/2.2.9 (Win32) PHP/5.4.30 mod_fcgid/2.3.6 Connection: Keep-Alive X-Powered-By: PHP/5.4.30 Content-Length: 94 Keep-Alive: timeout=5, max=100 Content-Type: application/json; charset=UTF-8 Response Preview Request Body Request Url: http://192.168.4.126/news/162 Request Method: PUT Status Code: 200 Params: {} Request Headers Content-Type: multipart/form-data Authorization: Basic MTAwLXRva2VuOg== Accept: */* Connection: keep-alive Origin: chrome-extension: //rest-console-id User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 |
3. http請(qǐng)求的Accept參數(shù)
上面提到了一個(gè)設(shè)置的地方, Accept 和 Content-Type
這兩個(gè)參數(shù)很重要
前者一般如果不設(shè)置默認(rèn)的是 */*, POSTMAN 和 RESTConsole 工具中默認(rèn)的是 application/json,因此在不設(shè)置 Headers:Accept 參數(shù)的情況下返回的按照 json格式;
而普通的瀏覽器中返回的則默認(rèn)是 application/xml 格式。
后者這個(gè) type 指的是head body 內(nèi)容的 類型
這就是為什么這兩個(gè)參數(shù)分別被 REST Console 工具分別放在了 2. Target 3. Body 中。
在 yii 中默認(rèn)支持的 rest api 格式有 xml 和 JSON, yii 會(huì)根據(jù) 請(qǐng)求的 head 的 Accept 參數(shù)來(lái)返回對(duì)應(yīng)格式的數(shù)據(jù)。
這個(gè)參數(shù) 在chrome 中可以修改默認(rèn)值嗎?
Eclipse自帶Junit插件,不用安裝就能在項(xiàng)目中編寫
測(cè)試用例,非常方便。
在項(xiàng)目中添加Junit庫(kù)
在編寫測(cè)試用例之前,需要先引入Junit。對(duì)項(xiàng)目根目錄右鍵,選擇Properties,Java Build Path,Libraries,如圖:
Add Library,選擇Junit:
點(diǎn)Next選擇Junit版本,然后Finish就完成了引入。
編寫測(cè)試用例
假設(shè)有如下類:
package choon.test;
public class Calculate {
public int Add(int x,int y) {
return x + y;
}
}
可以編寫測(cè)試用例如下:
package choon.test; import static org.junit.Assert.*; import org.junit.Test; public class Test1 { @Test Calculate calculate = new Calculate(); assertEquals(8, calculate.Add(3, 5)); } } |
對(duì)test方法右鍵Run As Junit Test即可運(yùn)行該測(cè)試用例:
如圖,綠色狀態(tài)條表示測(cè)試通過(guò),如果是紅色,則表示沒(méi)有通過(guò)。
before和after標(biāo)簽
被before標(biāo)記的方法在每個(gè)測(cè)試用例執(zhí)行之前執(zhí)行,被after標(biāo)記的方法在每個(gè)測(cè)試用例執(zhí)行后執(zhí)行。
假如編寫如下測(cè)試用例:
package choon.test; import static org.junit.Assert.*; import org.junit.After; import org.junit.Before; import org.junit.Test; public class Test1 { @Before public void setUp() { System.out.println("---begin test---"); } @Test public void test() { Calculate calculate = new Calculate(); assertEquals(8, calculate.Add(3, 5)); System.out.println("test case"); } @After public void tearDown() { System.out.println("---end test---"); } } |
則會(huì)有下面的執(zhí)行結(jié)果:
測(cè)試用例的編寫很重要,一個(gè)不好的測(cè)試用例既起不到測(cè)試作用又浪費(fèi)時(shí)間,而一個(gè)好的測(cè)試用例可以很好的指出代碼中的問(wèn)題,避免更大的麻煩。
skipfish是
Google的工程師MIchal Zalewski開發(fā)的另一款網(wǎng)站安全檢測(cè)工具,它完全實(shí)現(xiàn)了全自動(dòng)化操作,所以不需要人工干預(yù),這一點(diǎn)上比RatProxy要好用一些,當(dāng)然在功能上也強(qiáng)大更多了。
可以從http://code.google.com/p/skipfish/下載它。
安裝Cygwin
與ratproxy一樣,在windows下需要安裝cygwin才能編譯它。
下載Cygwin(http://www.cygwin.com/),一路默認(rèn)下一步直到選擇下載站點(diǎn),考慮到國(guó)外的源速度比較慢,所以選擇從ntu.edu.tw(速度還是不錯(cuò)的)下載;然后下一步Select Packages,找到以下幾個(gè)包,并安裝它們:
gcc
make
libidn-devel
zlib-devel
openssl-devel
繼續(xù)下一步直至安裝完成。
生成skipfish
1、下載skipfish
2、運(yùn)行cygwin.bat,并切換到skipfish所在目錄(cd “c:\skipfish”)
3、運(yùn)行make,等它編譯完成
使用skipfish
在命令行輸入以下命令:
skipfish –o log –W “dictionaries/complete.wl” http://lwme.cnblogs.com
-o參數(shù)是輸出目錄,-W是選擇字典,然后就等著它掃描完看報(bào)告吧。
使用它的默認(rèn)參數(shù)掃描起來(lái)是相當(dāng)慢的,所以如果有需要的話,可以通過(guò)-h參數(shù)或者它的在線文檔:http://code.google.com/p/skipfish/wiki/SkipfishDoc去研究它。
在
測(cè)試領(lǐng)域,很多的測(cè)試從業(yè)人員都在討論或者曾經(jīng)討論過(guò)
自動(dòng)化測(cè)試。支持者認(rèn)為自動(dòng)化能夠提高測(cè)試效率,減少枯燥繁瑣的用例執(zhí)行。持反對(duì)意見人的當(dāng)心自動(dòng)化測(cè)試的引入成本太大,反而沒(méi)有手工測(cè)試來(lái)的高效。更有人當(dāng)心自動(dòng)化測(cè)試無(wú)法保證軟件的質(zhì)量,其實(shí)能否保證軟件的質(zhì)量,不是由自動(dòng)化測(cè)試決定,而是取決于你的用例的設(shè)計(jì)。對(duì)于新的事物,在沒(méi)有任何實(shí)踐的基礎(chǔ)上不能輕易地下結(jié)論,因?yàn)槊總€(gè)人都有慣性的思維,有時(shí)候很難跳出固有的思維去考慮新的事物。
自動(dòng)化測(cè)試本身作為一種測(cè)試的手段不存在任何的問(wèn)題。它的好與壞,本質(zhì)是由其最終結(jié)果來(lái)決定的。如果自動(dòng)化測(cè)試帶來(lái)收益大于我們投入的成本,那么自動(dòng)化測(cè)試就是成功的。我們要做的就是在自動(dòng)化測(cè)試實(shí)施過(guò)程中去提高我們的收益,去降低我們的成本。
何為自動(dòng)化測(cè)試?自動(dòng)化測(cè)試是希望能夠通過(guò)自動(dòng)化測(cè)試工具或其他手段,按照測(cè)試工程師的預(yù)定計(jì)劃進(jìn)行自動(dòng)的測(cè)試。目的是減輕手工測(cè)試的勞動(dòng)量,騰出更多的時(shí)間和精力去測(cè)試重要模塊,同時(shí)又保證已有覆蓋自動(dòng)化測(cè)試的模塊的質(zhì)量,從而達(dá)到提高軟件質(zhì)量的目的。自動(dòng)化測(cè)試的目的在于發(fā)現(xiàn)原有模塊引入的新缺陷,保證已有功能的質(zhì)量。
自動(dòng)化測(cè)試開展的前提
首先部門或者公司要從管理層次上支持你,其次要有專門的測(cè)試團(tuán)隊(duì)去建立適合自動(dòng)化測(cè)試的測(cè)試流程、測(cè)試體系,排除上面的因數(shù)之外我總結(jié)了自動(dòng)化測(cè)試一些前提條件。
1. 長(zhǎng)期性
指的是被測(cè)產(chǎn)品(或功能)是否需要一個(gè)長(zhǎng)期的維護(hù),因?yàn)槎唐诘捻?xiàng)目是沒(méi)有實(shí)現(xiàn)自動(dòng)化測(cè)試的必要的,短期的項(xiàng)目很明顯他的投入成本肯定大于其收益。
2. 穩(wěn)定性
被測(cè)產(chǎn)品(或功能)是否有一個(gè)相對(duì)穩(wěn)定的產(chǎn)品。如果功能和界面都處于不穩(wěn)定階段而且經(jīng)常發(fā)生變化的,那腳本和用例的維護(hù)成本是非常高的,
所以也是不具備實(shí)施自動(dòng)化的前提條件。
3. 合適測(cè)試工具
(工欲善其事,必先利其器)
假如被測(cè)產(chǎn)品(或功能)難以通過(guò)工具識(shí)別其控件的話
假如使用腳本語(yǔ)言難懂難學(xué),而且擴(kuò)展性差。
4. 人員
你的產(chǎn)品組內(nèi)是否具備合適人員去開展自動(dòng)化,是否具備一定合適的人去做自動(dòng)化腳本開發(fā)。自動(dòng)化測(cè)試實(shí)施的好與壞,很大程度上取決于該測(cè)試工程師,因?yàn)橐行?shí)施自動(dòng)化測(cè)試,單一的測(cè)試工具的熟練是遠(yuǎn)遠(yuǎn)不夠的,他需要其它一些輔助的測(cè)試手段,所以同時(shí)也就需要該測(cè)試工程師具備一定的方案解決能力,能夠找到較優(yōu)的方案來(lái)解決現(xiàn)實(shí)中碰到的問(wèn)題。
5. 用例
自動(dòng)化測(cè)試需要好的
測(cè)試用例的輔助,這個(gè)應(yīng)該是大家的共識(shí),所以不展開來(lái)講。所以這里希望我們的自動(dòng)化測(cè)試工程師需要與
用例設(shè)計(jì)者進(jìn)行密切的合作。
整體來(lái)說(shuō)自動(dòng)化測(cè)試能否有效開展,能否有效的實(shí)施,不是單一取決于某一個(gè)人或者某自動(dòng)化測(cè)試工程師的能力,他是整個(gè)團(tuán)隊(duì)合作的結(jié)果。
自動(dòng)化測(cè)試成本
這是領(lǐng)導(dǎo)們最關(guān)心的問(wèn)題。因?yàn)樗麄兌枷M詣?dòng)化測(cè)試帶來(lái)的收益要遠(yuǎn)大于所投入的成本。不然怎么體現(xiàn)自動(dòng)化測(cè)試價(jià)值?如果沒(méi)有價(jià)值還不如直接手工測(cè)試來(lái)的干脆。
那么自動(dòng)化成本有哪些?
1、調(diào)研成本
2、腳本開發(fā)維護(hù)成本
3、自動(dòng)化用例設(shè)計(jì)與維護(hù)成本
4、資源投入成本
如何有效的降低自動(dòng)化測(cè)試成本呢?
一、 提高調(diào)研成本,減少人為因數(shù)成本
調(diào)研成本省不了,而且要加大投入,如果投入成本不大,選擇的工具和框架都不適合自動(dòng)化的開展,那么自動(dòng)化測(cè)試肯定以失敗告終。一旦給自動(dòng)化測(cè)試選好了型,后期的轉(zhuǎn)化成本非常的高,所以一開始就要選擇合適的工具和框架。
當(dāng)然為了盡量減少調(diào)研成本,需要選擇合適人,需要整個(gè)團(tuán)隊(duì)的配合。
二、 選擇好的測(cè)試工具
選擇好的測(cè)試工具,首先要看其所使用的語(yǔ)言是否容易普及,是否功能強(qiáng)大,在自動(dòng)化測(cè)試工具當(dāng)中,我認(rèn)為最重要的是GUI對(duì)象的識(shí)別能力,第三方接口的處理能力。
三、 構(gòu)建合適的測(cè)試框架
有了好的測(cè)試工具之后,我們需要一個(gè)合適的測(cè)試框架,測(cè)試框架應(yīng)該是一個(gè)企業(yè)級(jí)的應(yīng)用,而不是單一的產(chǎn)品和功能。它至少可以減少重復(fù)代碼編寫,包含常用的操作,簡(jiǎn)單的配置或自動(dòng)配置,運(yùn)行結(jié)果自動(dòng)收集,運(yùn)行結(jié)果簡(jiǎn)潔且容易分析。
四、 選擇合適的人,減少研究,實(shí)施投入成本
這里我主要講是選擇合適的人,做正確的事上。那么什么樣的人適合做自動(dòng)化測(cè)試呢,首先的一點(diǎn)肯定要有一定的代碼編寫能力。其次我覺(jué)得需要一定軟件工程的思想。沒(méi)有好的思想,是很難組織起清晰架構(gòu)的代碼來(lái)的。
合適人,做正確的事。這里就充分體現(xiàn)管理者能力了,尤其是測(cè)試框架上的研究,往往不是靠單一的人所能夠做到,因?yàn)闀?huì)受到知識(shí)體系,思維,能力等相關(guān)的束縛。所以我的意見是這些應(yīng)該是交給一個(gè)組織,該組織內(nèi)集合測(cè)試負(fù)責(zé)人,測(cè)試工程師,自動(dòng)化測(cè)試工程師,來(lái)依靠團(tuán)隊(duì)的力量來(lái)打造合適的測(cè)試框架。當(dāng)然框架的實(shí)現(xiàn)上應(yīng)該交給自動(dòng)化測(cè)試工程師。
那么什么樣的人才是合適的呢
1、需要有一定的手工測(cè)試經(jīng)驗(yàn)和自動(dòng)化測(cè)試經(jīng)驗(yàn),能知道測(cè)試框架為誰(shuí)而做,需要做什么?
2、能夠?qū)?fù)雜的設(shè)計(jì)簡(jiǎn)單化,能夠充分理解軟件工程的思想,將最簡(jiǎn)單的應(yīng)用提供給測(cè)試工程師
五、 減少用例的設(shè)計(jì)維護(hù)成本
如果有好的框架支撐的話,那么用例的設(shè)計(jì)維護(hù)成本完全是可以減少的。
六、 保持腳本整體架構(gòu)清晰易懂,易維護(hù)
七、 合適的加大資源投入成本
我覺(jué)得資源投入成本是值得的,資源投入如果能夠減少人力的投入的話。我想是所有管理者都愿意看到的。
自動(dòng)化測(cè)試收益
在如何評(píng)價(jià)自動(dòng)化測(cè)試收益方面,每個(gè)人的角度不通過(guò),得出結(jié)果可能也不相同。我想從以下幾個(gè)方面來(lái)看自動(dòng)化收益:
1、快速測(cè)試
測(cè)試人員手工測(cè)試多個(gè)功能,測(cè)試執(zhí)行的并行度總有個(gè)上限。而多個(gè)并行執(zhí)行的自動(dòng)化測(cè)試腳本可以更快速地驗(yàn)證版本,一次性地報(bào)告問(wèn)題
2、降低手工測(cè)試投入成本
將功能測(cè)試人員從繁瑣重復(fù)的測(cè)試中解脫出來(lái),有更多的時(shí)間和精力去進(jìn)行一些探索性的測(cè)試。
3、提供了軟件的質(zhì)量
自動(dòng)化測(cè)試能夠幫助我們減少生產(chǎn)環(huán)境中某種特定類型的缺陷。這些缺陷包括環(huán)境或者配置相關(guān)的缺陷、在主流程上本來(lái)正常但因?yàn)楹笃谛薷挠绊懙降墓δ堋⒁约叭菀妆缓雎缘牡胤降?/div>
4、提高了我們對(duì)軟件質(zhì)量的信心
5、自動(dòng)化測(cè)試可以喚起更高的工作熱情
這一方面來(lái)自于可以部分地將測(cè)試人員從大量重復(fù)的測(cè)試執(zhí)行中解放出來(lái),另一方面來(lái)自于新技術(shù)、新工具帶來(lái)的新鮮感
如何有效地提高自動(dòng)化測(cè)試收益?
要有效的開展自動(dòng)化,一定程度上來(lái)說(shuō),成本是很難降低的,只有將收益最大化。增加收益的方式有很多種:
一、提高自動(dòng)化測(cè)試迭代次數(shù),提高自動(dòng)化的使用頻率
要提高自動(dòng)化的使用頻率,就需要將原有觀念自動(dòng)化測(cè)試收益往往來(lái)源于回歸階段進(jìn)行更正,實(shí)際證明自動(dòng)化同樣可以在日常測(cè)試中發(fā)揮作用。自動(dòng)化的使用用例的重復(fù)性使用頻率越高,其價(jià)值也就越大,其收益也會(huì)越大。
二、腳本復(fù)用,提高腳本對(duì)應(yīng)功能點(diǎn)的用例覆蓋率
提高該腳本所覆蓋功能點(diǎn)的用例覆蓋,也就是我們不但要考慮減少了自動(dòng)化腳本開發(fā)成本以及降低維護(hù)成本,同時(shí)也要考慮該腳本帶來(lái)的收益已盡量去最大化。
三、提高自動(dòng)化用例的覆蓋率,最大程度上減少手工重復(fù)的勞動(dòng)
盡可能的提高用例的覆蓋率,并通過(guò)自動(dòng)化來(lái)代替我們的手工測(cè)試,這樣不但能在保證軟件質(zhì)量的同時(shí)減少手工重復(fù)的勞動(dòng),
四、建立并維護(hù)好測(cè)試用例庫(kù),幫助我們節(jié)省資源并快速培養(yǎng)測(cè)試人員
五、推廣成功案例到其它產(chǎn)品
從入行一開始就決定了不走技術(shù)路線,因?yàn)橛螒蛑允怯螒蚴且驗(yàn)槠溆螒蛐远皇羌夹g(shù)性,我愛的是游戲,而不是技術(shù)。
1:剛?cè)胄械臅r(shí)候:找嚴(yán)重bug,或者操作步驟很多的bug,很有成就感,因?yàn)檎业絼e人找不到的bug
2:后來(lái)意識(shí)到,基礎(chǔ)的簡(jiǎn)單的bug價(jià)值不見得比嚴(yán)重的難找的bug價(jià)值低,開始轉(zhuǎn)向追求覆蓋、不漏基礎(chǔ)簡(jiǎn)單的bug
3:開始關(guān)注流程,流程可以減少人為失誤導(dǎo)致的bug,開始關(guān)注預(yù)防bug,特別是通過(guò)流程來(lái)預(yù)防人為bug
4:認(rèn)為流程最重要,幾乎所有的bug都可以通過(guò)流程來(lái)預(yù)防和解決
5:認(rèn)為
測(cè)試最重要,要掌控流程和版本發(fā)布的決定權(quán)
6:開始認(rèn)識(shí)到信息的重要性,認(rèn)為測(cè)試的職責(zé)是提供產(chǎn)品信息,而不是自己掌控決定權(quán)
7:開始認(rèn)識(shí)到,測(cè)試要做的太多,不可能全部做到,要做取舍
8:測(cè)試是輔助,不僅僅輔助產(chǎn)品,而且要輔助團(tuán)隊(duì);團(tuán)隊(duì)重要性高于項(xiàng)目
9:測(cè)試不僅僅要提供產(chǎn)品的信息,也要提供人的信息,團(tuán)隊(duì)的信息
推送并不是什么新技術(shù),這種技術(shù)在
互聯(lián)網(wǎng)時(shí)代就已經(jīng)很流行了。只是隨著進(jìn)入
移動(dòng)互聯(lián)網(wǎng)時(shí)代,推送技術(shù)顯得更加重要。因?yàn)樵谥悄?a target="_self" style="word-break: break-all; color: #202859; line-height: normal !important;">
手機(jī)中,推送從某種程度上,可以取代使用多年的短信,而且與短信相比,還可以向用戶展示更多的信息(如圖像、表格、聲音等)。
推送技術(shù)的實(shí)現(xiàn)通常會(huì)使用服務(wù)端向客戶端推送消息的方式。也就是說(shuō)客戶端通過(guò)用戶名、Key等ID注冊(cè)到服務(wù)端后,在服務(wù)端就可以將消息向所有活動(dòng)的客戶端發(fā)送。
實(shí)際上,在很多移動(dòng)
操作系統(tǒng)中,官方都為其提供了推送方案,例如,
Google的云推送、IOS、
Windows Phone7/8也都提供了類似的推送方案。不過(guò)這些推送方案的服務(wù)器都在國(guó)外,有一些推送服務(wù)(如Google的云推送)在國(guó)內(nèi)由于某些原因不太穩(wěn)定,所以國(guó)內(nèi)近幾年涌現(xiàn)出了很多專門為國(guó)人打造的推送服務(wù)。
本文將從各種流行移動(dòng)操作系統(tǒng)入手介紹推送技術(shù)的各種實(shí)現(xiàn)方式。當(dāng)然,我們的主要目的是討論
Android的推送技術(shù)。
一、iOS的推送技術(shù)
Apple為IOS提供了很完美的推送方案,其基本原理是Apple提供了自己的推送服務(wù)器,叫APNS(Apple Push Notification Service,
蘋果推送通知服務(wù)器)。而客戶端設(shè)備(IPhone、IPad等)直接與APNS建立長(zhǎng)連接。不過(guò)向客戶端設(shè)備發(fā)送的消息并不是由APNS產(chǎn)生的,而是在需要發(fā)送消息的用戶自己提供的服務(wù)器(稱為Provider)中產(chǎn)生的,然后Provider將消息傳送給APNS,最后由APNS將消息傳送給客戶端設(shè)備。也就是說(shuō),消息最開始由Provider產(chǎn)生,然后Provider將消息傳送給APNS,最后再由APNS傳送給客戶端設(shè)備。消息傳遞的過(guò)程如圖1所示。

在發(fā)送消息到客戶端設(shè)備接收到消息的過(guò)程中,始終伴隨這一個(gè)令牌的傳送(device token)。要想使用APNS提供消息服務(wù),應(yīng)用程序需要先向IOS注冊(cè)需要提供的一個(gè)必要的信息就是與當(dāng)前設(shè)備有關(guān)的device token,IOS在接收到devicetoken后,會(huì)向APNS查詢這個(gè)device token是否在APNS上注冊(cè)了(所有的IOS設(shè)備在第一次使用時(shí)都需要向蘋果服務(wù)器注冊(cè)一個(gè)賬號(hào),否則無(wú)法從AppleStore下載應(yīng)用,當(dāng)然更無(wú)法使用推送服務(wù)了),如果已經(jīng)注冊(cè),APNS會(huì)直接向應(yīng)用程序返回這個(gè)devicetoken。應(yīng)用程序獲得這個(gè)devicetoken后,表示APNS已經(jīng)允許向自己推送消息了,接著還需要將該device token發(fā)送給推送服務(wù)器(Provider)。到這里應(yīng)用程序已經(jīng)成功將自己注冊(cè)到APNS中了。現(xiàn)在就可以通過(guò)Provider產(chǎn)生要推送的消息,然后Provider會(huì)將消息發(fā)送給APNS服務(wù)器,最后APNS服務(wù)器會(huì)直接向應(yīng)用程序發(fā)送消息。這個(gè)過(guò)程比較復(fù)雜,不過(guò)看一下圖2的描述就會(huì)對(duì)這一過(guò)程更加了解了。每一個(gè)流程描述前面的數(shù)字表示發(fā)送的時(shí)間先后順序。
二、Windows Phone的推送技術(shù)
微軟為Window Phone提供的推送方案與IOS類似,也需要自己準(zhǔn)備推送服務(wù)器(可以稱為Cloud Service)。只是表示設(shè)備的ID變成了Uri。在Window Phone中有一個(gè)Push Client Service(PCS)。所有需要推送服務(wù)的應(yīng)用程序都需要與Push Client Service通信。下面是Window Phone推送的基本步驟,讀者可以與圖3對(duì)照來(lái)看這一過(guò)程。
第1步:應(yīng)用程序會(huì)向Push Client Service請(qǐng)求一個(gè)Push Notification URI(①)。
第2步:如果當(dāng)前Window Phone設(shè)備已經(jīng)在微軟服務(wù)器注冊(cè)了,Push Client Service會(huì)從MPNS(Microsoft Push Notification Service ,微軟推送通知服務(wù))獲取Push Notification URI,并返回給應(yīng)用程序,表示推送服務(wù)可用(②和③)。
第3步:應(yīng)用程序需要將Push Notification URI發(fā)送給自己的推送服務(wù)器(Cloud Service)(④)。
第4步:如果需要推送消息,Cloud Service會(huì)將消息發(fā)送到MPNS,然后MPNS會(huì)將消息發(fā)送給Push Client Service,最后由Push Client Service將消息傳送給應(yīng)用程序(⑤、⑥和③)。
主站蜘蛛池模板:
A级毛片高清免费视频在线播放|
成人免费网站视频www|
国产美女a做受大片免费|
国产在线19禁免费观看|
亚洲国产精品国自产电影|
久久精品a亚洲国产v高清不卡|
亚洲一级毛片在线播放|
亚洲av日韩专区在线观看|
国产高潮流白浆喷水免费A片 |
日韩精品无码免费一区二区三区
|
亚洲一区二区成人|
成人在线免费视频|
四虎影视www四虎免费|
亚洲裸男gv网站|
亚洲精品成人片在线播放
|
亚洲视频在线免费看|
亚洲AV成人无码网天堂|
四虎最新永久免费视频|
国产极品美女高潮抽搐免费网站|
亚洲福利视频网站|
中美日韩在线网免费毛片视频
|
一区在线免费观看|
日本黄色免费观看|
五月天网站亚洲小说|
国产青草亚洲香蕉精品久久|
免费无码又爽又刺激一高潮|
亚洲AV永久无码精品一区二区国产|
亚洲国产综合精品中文第一|
久久久久无码精品亚洲日韩|
国产91色综合久久免费分享|
亚洲精品二区国产综合野狼|
国产高潮久久免费观看|
亚洲国产精品第一区二区三区|
亚洲色大网站WWW永久网站|
好吊色永久免费视频大全
|
亚洲人成777在线播放|
亚欧乱色国产精品免费视频|
四虎永久免费观看|
亚洲一本之道高清乱码|
91九色老熟女免费资源站|
久久亚洲精品国产精品|