qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          做“準確”的性能測試

           昨天看了測試大俠pent翻譯的一篇文章基于用戶體驗的性能測試》,原文名稱為《User Experience, Not Metrics》,直譯為《用戶體驗,而不是度量》,大俠翻譯的很準確,不愧為前輩。這篇文章的觀點很好,最近我正好也想談談類似的話題。

            看壇子里多數網友都在談壓力測試,討論LoadRunner的使用,氣氛熱烈而又和諧,但我今天可能要給很多人潑一盆冷水了,“你做的壓力測試“準確”嗎?”,這里我說的

            “準確”有兩層含義:

            符合現實:你模擬的負載測試真的能反映實際運行的負載嗎?

            精確:你模擬測試中采集的度量數據足夠詳細、粒度夠小嗎?

            當然,借助于專業的壓力測試工具,只要添加足夠多的monitor,“精確”應該不難,但“符合現實”嗎?以我作為過來人的經驗,大多數的壓力測試并不準確。為什么這么說,請往下看這張圖。

            上圖是大多數人得到的一個典型的測試結果,看上去很美,但它不符合現實情況。你的計算機、測試腳本有足夠的耐心等待,但實際用戶沒有。在這個講究效率、信息爆炸、社會高速運轉的現實世界是什么樣呢?

            另外用戶對網站的熟悉程度、網絡速度,甚至用戶的計算機水平,都會影響用戶的操作速度,進而對實際的負載形成不同的影響。



            一個不準確的壓力測試會得出不準確的測試結果,對于一個重要的網站來講,這樣是非常危險的,會對決策層形成誤導。

            ×對網站容量評估過高:當實際的負載上來時,會出現問題(響應過慢甚至崩潰)

            ×對網站容量評估過低:會導致不必要的浪費,包括不必要的硬件開支和資源浪費。

            因此,不準確的壓力測試“后果很嚴重”。

            由此可以得到,做準確的壓力測試是非常重要的,但如何才能做準確的壓力測試呢?

            本文開始即提出,“準確”有兩層含義,目前主要的問題還是“符合現實”,所以問題的關鍵是如何讓你的壓力測試符合現實情況。

            解決這個問題,主要還是站在業務的角度,在壓力測試計劃階段考慮,具體來說,就是要回答幾個問題,完成幾個圖形,詳細請看本站的另外一篇文章:《LoadRunner前傳:壓力測試前的分析準備工作》。

            當然這里的幾個問題其實不是那么好回答,要做很多分析統計工作,這里只是簡單描述一下。如果被測系統是以前系統的升級,最好的方法就是從舊系統的運行日志中捕獲以前的運行信息,比如原來系統使用的Web Server是IIS的話,IIS日志記錄了用戶訪問系統的所有信息。借助于專門的分析工具(WebTrends等工具),導出分析IIS日志,可以建立WUS(Web Site Usage Signature)

            × Page Distribution

            —Home page 26%、Search 12%、Product Info 32%、Order 4%

            × 平均和標準偏差統計情況

            —Page size、Hit per Page、Session Duration ......

            有了以上的分析,你才知道如何設置腳本中think time、如何對腳本進行角色劃分、如何分配用戶執行對應的交易等等諸多細節。

            通過這種方法建立的測試腳本和測試場景,最符合實際負載的運行情況,從而可以得出有用的結論,否則你就是在浪費時間,浪費金錢。

            借用2004年看過的sunshinelius版主的一篇文章《讓LoadRunner走下神壇》中的一句話:

            “我們無論在loadrunner前面加多少個“強大”、“智能”的形容詞,別忘了其最終修飾的只是一個名詞-“工具”。《大話西游》中相當精辟的論斷:官兵?最多也只是個長了痔瘡的官兵!”

            如果你沒有把它用好,那它就是長了痔瘡的官兵。哈哈!!

          posted @ 2011-12-09 16:40 順其自然EVO 閱讀(167) | 評論 (0)編輯 收藏

          單元測試實踐的主要問題與解決(1)

           本文是我在“第十屆中國系統與軟件過程改進年會廣東會場”所作演講的整理稿,主要分享單元測試的一些要點、單元測試實踐的主要問題,以及如何來解決這些問題。

            一、單元測試概述

            1.1 什么是單元測試

            單元測試,就是針對代碼單元的獨立測試。為什么需要單元測試呢?這是代碼的基本特性決定了的。代碼有一個基本特性,就是對數據分類處理。

            代碼通常會有很多的判定。一個判定,就是一次分類。嵌套的判定,會使分類次數的翻倍。

            如果我們在寫代碼的時候,有一個分類漏掉了,就會產生一個Bug;如果一個分類,雖然寫了代碼,但是處理不正確,也會產生一個Bug。一個函數要沒有錯誤,必須做到兩點:1,對數據的分類必須完整;2,每一個分類的處理必須正確。做到了這兩點,就可以說,代碼的功能邏輯是正確的。

            那么,如何檢測代碼的功能邏輯是否正確呢?

            調試,是臨時的,且不完整的,例如,一個函數有十種輸入,調試能覆蓋五六種就不錯了。而系統測試,并不針對某個具體的函數,不關注某個函數的功能邏輯是否正確。

            要檢測某個函數的功能邏輯,就必須要依照分類列出數據,檢測代碼是否對每一個分類都做了處理,而且每一個分類的處理是否正確。

            ——這就是單元測試。

            1.2 單元測試的基本方法

            由上面的分析可以看出,單元測試的基本方法就是:依數據的分類列出輸入,執行被測試程序,然后,判斷輸出是否符合預期。

            單元測試能達到什么樣的效果呢?那就是:無論別人怎么樣,我總是對的!

           這里的“別人”,是指關聯代碼。“我”,是指當前正在編寫或測試的代碼。單元測試要做到的是,無論關聯代碼是否有錯,都要保證我是對的。具體來說,我要考慮關聯代碼會產生什么樣的數據,這些數據要如何分類處理,只要我的分類和處理是正確的,那么,無論別人怎么樣,我總是對的。

            1.3 單元測試的效益

            單元測試的效益可以說是立竿見影,并且會推動整個開發過程的改進。

            首先,單元測試可以保證代碼的質量。因為只有單元測試,能夠全面檢測代碼單元的功能邏輯,排除代碼中大量的、細小的錯誤。

            其次,排錯成本最小。如果在編碼階段同時進行單元測試,排錯成本可以忽略不計。但若到了后期,排錯成本可能會增長上百倍,要是產品已經到了用戶手里,那造成的損失就更難說了。


           第三,提升開發效率。單元測試可以讓程序行為一目了然,也就是程序行為可視化。什么叫程序行為呢?就是什么輸入下,會執行哪些代碼,會產生什么輸出。如下圖,黑色的代碼是當前輸入下所執行代碼。

            如果我們寫幾行代碼,就可以看到程序的行為,相當于寫文章時上下文可見,這可以促進我們的開發思維。如果我們的思維有了偏差,也可以及時發現。如果代碼中有了錯誤,也可以隨時排除。

            那么,是不是整個項目的所有代碼都做了單元測試,才能得到這些效益呢?不是的。80:20規則,在軟件開發過程中也存在。也就是說,80%的代碼錯誤,可能存在于20%的代碼中;80%的編碼、調試成本,可能會消耗在20%的代碼上。這20%,就是算法密集度高的代碼,也就是功能邏輯復雜的代碼。

            這些代碼可能只有20%,但是卻可能包含了80%的錯誤,消耗了80%的編碼、調試時間,即使只對這部分代碼進行單元測試,在提升產品的質量和開發效率方面,也會產生立竿見影的效果。

           第四,自動回歸。如果沒有單元測試,系統測試發現了錯誤,當然要修改代碼,而修改代碼可能引入新的錯誤,又要進行全面的系統測試,這樣就可能陷入循環,這通常也是項目延期的主要原因。

            如果有了單元測試,修改代碼時可以通過回歸測試馬上檢測是否引入了新的錯誤。所謂回歸,就是回復到原來正確的狀態。

            正是回歸測試,使單元測試對整個開發過程的改進都產生積極影響,使項目適應頻繁變化的需求。單元測試是敏捷開發的基礎和核心,反過來說,有了單元測試,開發過程會自動趨于敏捷。單元測試也降低了后期測試的壓力。

          \



          posted @ 2011-12-09 16:37 順其自然EVO 閱讀(146) | 評論 (0)編輯 收藏

          CS安裝卸載測試總結

          最近在執行C/S控制客戶端安裝卸載的測試,通過自己的測試經歷和網上的資料,總結以下安裝卸載測試點:

            安裝測試

            1、GUI測試:安裝過程中所有的界面顯示,提示信息等是否正確

            2、兼容性測試:在不同的操作系統,不同配置的主機上能否正常安裝

            3、安裝路徑測試(軟件不能自動安裝的情況下):

            軟件默認路徑安裝(一般是當前系統盤);

            自定義路徑安裝:缺省路徑安裝;手動輸入路徑(包括存在的和不存在的路徑)安裝;  包含特殊字符的路徑安裝;中文路徑或者中英文路徑安裝;包含空格、下劃線等合法路徑安裝;不同硬盤格式分區(FAT16,FAT32,NTFS)路徑上安裝;網絡路徑,移動設備,虛擬機等安裝路徑安裝;小于軟件安裝所需的磁盤空間路徑上安裝等

            4、不同安裝環境下測試:包括沒安裝過的系統;已安裝過老版本(系統正在使用,系統未使用);已安裝最新版本;卸載后重新安裝;重復安裝;多次安裝;修改安裝;修復安裝(完好軟件和有部分文件受損的軟件);在未達到最低硬件配置下安裝等

            5、測試各種不同的安裝組合,并驗證各種不同組合的正確性(包括參數組合,控件執行順序組合,產品安裝組件組合,產品組件安裝順序組合)等)。如在安裝CS客戶端前先安裝服務器與CS客戶端安裝后再安裝服務器,這兩種組合,對CS客戶端的安裝是否有影響。

            6、異常情況下安裝測試:安裝過程中取消;安裝過程中關機/斷電;系統進入待機,休眠等狀態;數據庫終止;網絡終止等

            7、至少要在一臺筆記本上進行安裝/卸載測試,因為有很多產品在筆記本中會出現問題,尤其是系統級的產品;

            8、安裝后測試項:安裝后是否能產生正確的目錄結構和文件,文件屬性正確;安裝后動態庫是否正確;安裝后有沒有生成多余的目錄結構,文件,注冊表信息,快捷方式等;桌面是否有快捷方式,【程序】列表是否有啟動和卸載選項,安裝目錄是否為安裝時設置的路徑,安裝后的程序能否正常啟動;安裝成功后是否會對其他常用軟件有影響等。

            卸載測試:

            1、GUI測試:卸載過程中界面顯示,提示信息是否正常等

            2、兼容性測試:在不同的操作系統,不同配置的主機上能否正常卸載等

            3、通過不同方式能否正常卸載:控制面板中卸載;安裝包卸載;程序自帶程序卸載;第三 方卸載工具卸載(360,優化大師,RevoUninstaller等)

            4、異常情況下卸載測試:卸載過程中取消;卸載過程中關機/斷電系統進入待機,休眠等狀態;數據庫終止;網絡終止;程序在運行/暫停/終止等狀態時的卸載;多次卸載等

            5、在可以選擇組件卸載的情況下,測試各種不同的卸載組合,并驗證各種不同組合的正確性(包括參數組合,控件執行順序組合,產品卸載組件組合,產品組件卸載順序組合等)

            注:CS客戶端不可以選擇組件卸載

            6、卸載后測試項:是否刪除了全部的文件:安裝目錄里的文件及文件夾,非安裝目錄(向系統其它地方添加的文件及文件夾),包括exe,dll,配置文件等;是否同步去除了快捷方式——桌面,菜單,任務欄,系統欄,控件面板,系統服務列表等;復原方面-卸載后,系統能否恢復到軟件安裝前的狀態(包含目錄結構、動態庫,注冊表,系統配置文件,驅動程序,關聯情況等)(專門的測試工具regsnap);卸載后是否對其他的應用程序造成不正常影響(如操作系統,常用應用軟件等)等

            有什么遺漏的,望各位同仁指出。

          posted @ 2011-12-09 16:34 順其自然EVO 閱讀(217) | 評論 (0)編輯 收藏

          接口測試從零開始系列_mock技術使用

           1、什么情況下會使用mock技術

            (1)需要將當前被測單元和其依賴模塊獨立開來,構造一個獨立的測試環境,不關注被測單元的依賴對象,只關注被測單元的功能邏輯

            ----------比如被測代碼中需要依賴第三方接口返回值進行邏輯處理,可能因為網絡或者其他環境因素,調用第三方經常會中斷或者失敗,無法對被測單元進行測試,這個時候就可以使用mock技術來將被測單元和依賴模塊獨立開來,使得測試可以進行下去。

            (2)被測單元依賴的模塊尚未開發完成,而被測單元需要依賴模塊的返回值進行后續處理

            ----------比如service層的代碼中,包含對Dao層的調用,但是,DAO層代碼尚未實現

            (3)被測單元依賴的對象較難模擬或者構造比較復雜

            ----------比如,支付寶支付的異常條件有很多,但是模擬這種異常條件很復雜或者無法模擬,比如,查詢聚劃算的訂單結果,無法在測試環境進行模擬

            2、Mock技術分類

            (1)手動構造mock對象

            ---------------比如,可以自己寫某個接口方法的實現,根據需要編寫返回值,測試代碼中使用該實現類對象

            缺點:會增加代碼量,在寫mock對象代碼時,有可能引入錯誤

            (2)使用開源代碼提供的構造mock方法

            --------------比如easyMock,提供了對接口類的模擬,能夠通過錄制、回放、檢查三步來完成大體的測試過程,可以驗證方法的調用種類、次數、順序,可以令Mock對象返回指定的值或拋出指定異常

            3、EasyMock使用

            (1)引入easyMock

            ------------在maven工程中,通過pom配置依賴關系

          <dependency>
              <groupId>org.easymock</groupId>
              <artifactId>easymock</artifactId>
              <version>3.0</version>
              <scope>test</scope>
          </dependency>

            ------------在普通java工程中,通過添加外部包的方式

            (2)使用easyMock過程

            1)使用EasyMock生成Mock對象;
            pingJiaDao = mockControl.createMock(IPingJiaDao.class);

            2)設定Mock對象的預期行為和輸出;
            EasyMock.expect(pingJiaDao.getGoodPingJiaRate(storeId)).andReturn(0.11);

            3)將Mock對象切換到Replay狀態;
            EasyMock.replay(pingJiaDao);

            4)調用Mock對象方法進行單元測試
            storeService.setStoredao(pingJiaDao);
            double rate = storeService.getStoreGoodRate(storeId);

            5)對Mock對象的行為進行驗證。
            EasyMock.verify(pingJiaDao);

            4、其他easyMock功能

            (1)特殊的mock對象:niceMock
            (2)參數匹配器
            (3)重置mock對象
            (4)模擬異常拋出
            (5)設置調用次數

          posted @ 2011-12-09 16:32 順其自然EVO 閱讀(1162) | 評論 (0)編輯 收藏

           測試用例顆粒度常規應用場景的枚舉:

           上面分析了很多測試用例顆粒度粗、細的特點,那么,常規的測試來講,如何大致定位測試用例顆粒度的粗細呢?

            下面以單一的應用環境來體現。

            還是要強調那句話:相同的機構也可能有不同測試目的,可能是測試不同區域或是對同一區域的不同層次的測試。

            單一條件:

            1、時間因素:

            時間短、項目緊、編寫用例評審時間較短時,適合粗顆粒度用例。

            項目周期較長時,適合細顆粒度用例。

            比如規劃六個月的項目,計劃階段和設計階段有一個半月,測試前期進入,有足夠的時間來進行人員培訓、測試用例編寫,需要細顆粒度。如果項目是一個月,測試準備時間只有五個工作日,那么可能在第三天就要完成第一輪的測試用例評審,建議以粗顆粒度為主,覆蓋功能和體現思路。

            2、項目人員:

            測試人員中熟手多,思路和基礎技能扎實,或測試人員構成責任心高時,可以采用粗顆粒度用例。

            測試人員新手多,需要再指導下進行基礎測試工作,或責任心一般時,需采用細顆粒度用例。

            測試人員熟手和新手的區別,大家一目了然。在這里,特意把責任心作為測試用例編寫粗細的一個判別標準。實際上,測試人員的職業素質中,就有責任心一項,這種品質方面的要求因人而異——而且每個人都肯定對自己的責任心還自我感覺良好。

            舉個例子,比如安裝測試:

            粗的寫法:在微軟的各種操作系統下進行遍歷安裝,確認setup安裝成功。——那么責任心好的人,可能會去翻閱規格書,確認setup支持的操作系統,再依次安裝測試。責任心一般的人,可能就想當然的認為visia這種過渡版本很少人用/server 2000 不是個人用戶的菜,就直接跳過這兩種系統。

            所以面對責任心一般的人,就必須寫成細的用例:安裝測試:A、在window XP 的 SP2 環境下安裝;B、在xp的SP3 環境下安裝;C、在win server 2000 下安裝;……。

            3、項目質量性質

            項目質量要求一般,或項目為過渡項目,生命周期短;項目為臨時項目時,可采用粗顆粒度用例。

            項目質量要求高,客戶或公司對質量的定位為第一位,品牌工程項目,采用細顆粒度用例。

            難道不是所有的項目都是高質量高要求的么?當然不是。

            不同國家和民族的人對質量的要求是不一樣的:美國是夠用就好,德國是精益求精,中國是當場不掛就行。

            不同產業鏈位置的公司對質量要求是不一樣的:頂級公司做完美的產品,中級公司做性價比高的產品,底層公司做廉價的產品。

            不同定位的公司對質量的要求是不一樣的:在火車站門口的飯店吃的是客流量,在市區偏遠地方的飯店吃的是回頭客。

            不同目的的單子對質量的要求是不一樣的:做賬拉回扣的虛項目,中標后無人使用,三年后設備升級,質量就沒有要求。做重點項目,質量要求苛刻等。

            所以,肯定會有不同的項目質量性質。也自然有不同的測試策略和測試目的,順序導出的就是不同顆粒度的測試用例。

          字體:        | 上一篇 下一篇 | 打印  | 我要投稿 

            4、資源配置:

            資源配置較少,無法實現測試用例的細化時,可以采用粗顆粒度的測試用例。

            資源配置較多,可滿足用例編寫、評審、修訂的交叉進行時,可采用細顆粒度。

            舉例:如果測試人員配置較少,一共就三五個人,每人負責一個項目,彼此沒有時間去做評審,甚至項目都存在臨時增多的現象,就無從談起測試用例的細化,甚至粗顆粒度都較難實現,只能拉一個測試大綱出來。

            或者測試團隊有十多個人,但是項目是流水式過來的。需求、開發、測試是流水線模式處理大批量的項目,無法做到一個項目的全流程參與時,也很難展開測試用例評審、修訂以致細化事宜。

            5、需求變更:

            需求變更較多時,建議采用粗顆粒度的用例,可較靈活的覆蓋需求。經過一輪輪的評審,等需求基線化之后,在實際的滾動測試中,在逐步細化用例——根據項目實際情況。

            需求變更較少時,或需求變更波及較小,不是系統設計框架的頻繁改動——具體的標準需要不同行業產品的評估,可對應較大的細化測試用例變更量。

            舉例:一個需求,粗顆粒度的用例為100條,細顆粒度的用例為10000條。此需求變更,如果要修改粗顆粒度的用例,只需要修改10條;修改細顆粒度的用例,牽扯到細化的交叉邏輯,需要審閱2000條用例并可能修改1200條。

            如果測試用例修改人非測試用例編寫人,則修改時間還可能延長1.3倍。

            6、項目對象:

            如果項目/產品最終面對的客戶是特定人員、專業人員、技術人員、培訓后的操作員,可以采用粗顆粒度的用例。

            如果項目/產品最終面對的客戶是廣義的使用群體、人民大眾消費者,要采用細顆粒度的用例。

            面向專業人員的項目/產品,測試傾向于正向測試,一些問題或使用方式在規定、需求之外,可以在培訓或規范中指定操作模式,或憑借技術人員的功底來避免問題。

            面向非專業人員的項目/產品,無法做到培訓和操作約定,各種稀奇古怪的使用方法,操作習慣,所以更傾向于細顆粒度,覆蓋負向和隨機操作的測試用例。

            7、測試團隊素質:

            團隊個體素質較高,可適應粗獷、敏捷的風格時,可以采用粗顆粒度的用例。

            團隊處于成立初期或磨合期,需要細化的規則約定來指導時,采用細顆粒度的用例。

           8、公司決策投入:

            公司對測試工作的投入,對產品質量的要求,對行業節奏的把握。具體分析,可參考項目質量性質部分的論述。

            測試用例粗細的另外一個概念:用例的文字描述粗細。

            (舊文貼成)

            文檔分為好多種,在后面寫測試用例的時候你們會遇到類似的顆粒度的問題。

            第一類是寫給自己,以及懂這個技術的,差不多水平的同事看的。這樣只需要大致的描述核心關鍵點就可以。

            第二類是給技術一般的員工,但是有一定底子的人看的,這樣基本的概念就不用描述,整體步驟描述清楚就可以。

            第三類是給不懂技術,只會看圖一步步操作的外行看的,這樣就要詳細細致的描述基本概念,步步都截圖,傻瓜式的對比參照的搞過去。

            舉個例子,使用ping 命令

            第一類寫法:如果網絡不通,使用ping命令測試一下網絡是否通暢。

            第二類寫法:如果網絡不通,在cmd模式下,使用ping X.X.X.X 的命令格式,測試一下網絡是否通暢。

            第三類寫法:如果網絡不通,點擊開始,選擇運行,然后在運行框里輸入cmd,然后在彈出框里面,使用ping X.X.X.X 的命令格式,如果顯示Reply from X.x.x.x bytes=32 time=3ms TTL=64,就是通暢,其他顯示就是不通暢。

            那么?你這份文檔是寫給誰看的?

          ———————————————————————————————————————————————

            上述都是針對單一的外部環境給出的建議。如果外部環境參數較多,并且互相矛盾,比如團隊新手多,但測試項目對質量要求很高,并且項目周期短時,如何構建測試用例的顆粒度,就更需要測試管理人員的平衡。

            測試用例的粗細:掌握質量與效率之間的平衡。

          相關鏈接:

          測試用例之度——系列之顆粒度(上)

          posted @ 2011-12-09 16:30 順其自然EVO 閱讀(258) | 評論 (0)編輯 收藏

          如何有效實現軟件的需求管理(6)

          如何有效實現軟件的需求管理(6)

           在我們公司,獲取了一個需求以后,

            首先,相關人員會先在DevSpec建立一個條目,添加相應的一些屬性信息,比如標題,內容描述,狀態,對應文檔,優先級,緊急程度,負責人,對應版本,對應瀏覽器,對應數據庫等等。。。

            提交完了條目以后,由于這個條目設置了一個負責人,所以那個負責人登錄系統就可以馬上看到自己名下有這個條目,他就會馬上去處理這個需求。(可能有些人沒登錄系統去看,我們也可以設置Email或者手機短信的自動提醒功能)

            這里提到的“負責人”,在不同的過程里,負責人都是不同的,比如“評審”階段就有專門的評審負責人,普通人無法成為評審負責人,哪些人在哪些過程里能成為負責人是可以在流程中設置的。而上面提到的提交完條目后,一般情況第一個過程就是要審核剛獲取的需求,負責人審核通過后就可以把這個需求從“審核”狀態改到“需求分析”階段了,當然負責人也會改變,“需求分析”過程的負責人就會馬上知道自己有事情干了。

            就這樣,經過一個一個的過程,經手了一個一個的負責人,這個需求就逐漸從一個只有一個思想,到有了輪廓,再設計出里面的框架,然后最后被實現。

            其實,大家都是這么來處理需求的,不同的是,我們通過一個工具來管理這個過程,而有些公司只是就人工來做一下。我們這么做,好處和壞處其實都有,正如之前有個客戶問,你們這么做的話,是不是每一個需求的處理效率會降低?對,的確會降低,我們承認,因為這些都是嚴格的流程,而且是在一個系統中管理,肯定沒有他們口頭直接說一下快。但是,我們考慮的是我們是在賣產品,犧牲一部分的效率來確保產品的質量,我們覺得劃得來,畢竟質量才是最重要。人家雖然速度快,但是問題也來得多,需求多的時候,這個忘做了,那個做錯了,或者相互責任推來推去的事情多著了,最終導致產品質量出問題的事情比比皆是。但是我們用了系統以后,就避免了這些事情,實踐也證明了我們這么做以后,產品質量是得到保證了的。

            當然,產品的質量也不是簡簡單單像我說上面說的“經過一個一個的過程,經手了一個一個的負責人”就能馬上實現了,這里還會涉及到很多細節注意點了,待我一一道來。

          我之前說過需求管理有幾個嚴格的要求,流程化和審核機制大家其實已經看到了,其實在某種程度上,審核是流程化的一部分,因為審核過程本身就是需求處理過程中一個過程而已,我們只要在流程中設置了這種過程,安排負責人去負責就行了,當需求進入這個過程,就自然有人會去審核了。

            如果把上面兩個要求看成是需求管理的基礎的話,那其他幾個嚴格的要求:歡迎變更、版本控制、可跟蹤性,就可以看成是確保產品質量成功的關鍵點了。有了基礎才有可能成功,有了關鍵點才能保證成功!

            歡迎變更:

            歡迎變更的重要性大家應該知道了,變更其實也就是需求經常變,從某種程度上也就意味著產品的質量下降,因為這個需求你不斷變化,今天剛寫好這段代碼,明天要改成那樣,后天又要大改,誰都知道有潛在風險,而且還有與之有關聯的功能呢?你突然改了個接口參數,人家可能還不知道了。靠測試?測試人員也沒法很好解決這個問題,因為今天剛測完這個功能,明天卻大改了,但是那個測試人員雖然看到這個功能需要測試,但是他卻可能認為昨天已經測好了,是不是忘記關閉了,所以就去測其他功能了。

            那怎么解決呢?也很簡單,當有變更的時候,

            首先,盡量讓相關的人知道,讓開發知道,讓測試知道,讓需要我們接口的人知道,這樣子大家就都會同步就完成自己要做的事情,不會出現需要做的人卻不知道他要去做這個事的情況。在DevSpec中,我們可以采用變更自動通知功能來實現,因為在DevSpec中一個需求總是和它的開發任務和測試任務關聯在一起的,所以當需求有了變更以后,只要發送一個通知,開發人員和測試人員就能馬上看到變更,就能及時去做他們的工作了。

            第二點就是,盡量把影響的范圍搞得清楚點,讓開發知道哪些地方可能會影響到,做的時候小心點;讓測試知道這個改動會造成哪些地方有潛在的Bug,需要重點測一下。在DevSpec中,我們會有專門的功能讓設計人員和開發人員注明影響到的地方,需要重點測的地方,而且這個功能可以設置成強制,只要有變更,設計人員和開發人員就必須注明,甚至可以要求測試人員也注明測了哪些點,可以讓設計與開發人員檢查是否有遺漏。

            第三點就是,針對任何變更(特別對于瀑布模式那種公司),因為關系到了可能會影響質量、進度及成本,風險很大,所以對于變更的內容需要專門的評審流程,評審通過后才能開始開發。在DevSpec中,我們針對這種情況,就會經常啟用變更管理視圖,在這個視圖中,會有特別的流程對變更做評審,在次期間,這個需求是沒辦法被任何人轉到開發環節的,也避免了有些人不清楚情況,直接就把沒審核的需求直接讓開發去做了。(當然,我們現在很多產品已經是用敏捷開發的模式了,所以這個功能就用得比較少了)

            這樣子做的話,我們還是能把質量掌握在自己的手中,也就是把公司的前途掌握在自己手中。

            (未完待續)

          posted @ 2011-12-09 16:28 順其自然EVO 閱讀(158) | 評論 (0)編輯 收藏

          項目質量管理在民航業中的應用

            一、民航與軟件

            隨著全球經濟一體化的發展,民航業務將會以更加多樣化的形式出現,企業間的各種業務將會更加復雜和頻繁,民航業的競爭也越來越多地體現在運用新的科技手段之上。怎樣能將民航機構原有的計算設備和網絡系統進行改造和更新,并建立一套更加先進、穩定而又具有較大的業務擴展空間的民航業務處理系統來滿足當前及未來很長一段時期內的業務需求,提高工作效率是很多民航機構需要解決的當務之急。

            因為民航的企業性質,決定了民航業對軟件的依賴。民航業的軟件素來以高安全、高質量、高可靠、高效率著稱。依賴于質量、成本和進度的客戶滿意度,質量則是重點支撐之一,因此軟件質量是民航業最為關心的問題之一。

            二、軟件質量管理的重要性

            我們都知道pmbok把項目管理劃分為9個知識領域,即范圍管理、時間管理、成本管理、質量管理、人力資源管理、溝通管理、采購管理、風險管理和綜合管理。質量管理作為9大知識領域之一,可見其重要性。

            質量管理包括:質量計劃編制、質量保證和質量控制三個過程域。質量計劃是質量管理的第一過程域,它主要結合各個公司的質量方針,產品描述以及質量標準和規則通過收益、成本分析和流程設計等工具制定出來實施方略,其內容全面反應用戶的要求,為質量小組成員有效工作提供了指南,為項目小組成員以及項目相關人員了解在項目進行中如何實施質量保證和控制提供依據,為確保項目質量得到保障提供堅實的基礎。質量保證則是貫穿整個項目全生命周期的有計劃和有系統的活動,經常性地針對整個項目質量計劃的執行情況進行評估、檢查與改進等工作,向管理者、顧客或其他方提供信任,確保項目質量與計劃保持一致。質量控制是對階段性的成果進行檢測、驗證,為質量保證提供參考依據,它是一個PDCA循環過程。

            通常的情況是:軟件組織的最高管理層根據組織所面臨的形勢和社會需要,制定出一定時期內組織經營活動所要達到的質量目標,然后層層落實,要求下屬各部門管理者以至每個員工根據上級制定的質量目標制定出自己工作的質量目標和相應的保證措施,形成一個質量目標體系,并把質量目標完成的情況作為各部門或個人工作績效評定的依據。然而,企業的質量目的和任務必須轉化成質量目標,各級管理者必須通過質量目標對下級進行領導并以此來保證企業質量目標的實現。簡言之,軟件質量目標管理就是通過組織的管理者和員工親自參與質量目標的制定,并在工作中實行“自我控制”以完成工作目標的一種管理制度或方法。

            三、軟件行業質量標準

            目前業界認同的軟件質量標準主要有兩個:CMM和ISO 9001標準。

            CMM:

            1986年美國卡內基?梅隆大學軟件工程研究院(SEI)應聯邦政府的要求,著手研究一種對軟件承包商過程能力進行評估的方法。1987年9月SEI發布了軟件過程能力成熟框架的大綱,在大綱中定義了軟件過程評估、軟件能力評價兩種方法及相應的問卷調查表。經過4年的實踐,SEI將其發展成軟件能力成熟模型SW-CMM (Capability Maturity Model for Software)。

            SW-CMM描述了一個軟件組織進行軟件過程定義、項目實施與測試、過程控制與改善時必須經歷的5個漸進的成熟等級及每一成熟等級相應的關鍵過程域(key process area)和關鍵實踐(key practice)。軟件組織可以依據SW-CMM標識現有軟件過程中存在的關鍵問題,制定相應的軟件過程改善策略,使軟件組織的過程能力不斷成熟,從而提高一個軟件組織始終如一地、可預見性地生產高質量軟件產品的能力。

            六西格瑪(Six Sigma)   又稱:6σ,6Sigma,6Σ

            6σ管理法是一種統計評估法,核心是追求零缺陷生產,防范產品責任風險,降低成本,提高生產率和市場占有率,提高顧客滿意度和忠誠度。6σ管理既著眼于產品、服務質量,又關注過程的改進。“σ”是希臘文的一個字母,在統計學上用來表示標準偏差值,用以描述總體中的個體離均值的偏離程度,測量出的σ表征著諸如單位缺陷、百萬缺陷或錯誤的概率性,σ值越大,缺陷或錯誤就越少。6σ是一個目標,這個質量水平意味的是所有的過程和結果中,99.99966% 是無缺陷的,也就是說,做100萬件事情,其中只有3.4件是有缺陷的,這幾乎趨近到人類能夠達到的最為完美的境界(詳見右圖)。6σ管理關注過程,特別是企業為市場和顧客提供價值的核心過程。因為過程能力用σ來度量后,σ越大,過程的波動越小,過程以最低的成本損失、最短的時間周期、滿足顧客要求的能力就越強。6σ理論認為,大多數企業在3σ~4σ間運轉,也就是說每百萬次操作失誤在6210~66800之間,這些缺陷要求經營者以銷售額在15%~30%的資金進行事后的彌補或修正,而如果做到6σ,事后彌補的資金將降低到約為銷售額的5%。

            為了達到6σ,首先要制定標準,在管理中隨時跟蹤考核操作與標準的偏差,不斷改進,最終達到6σ。現己形成一套使每個環節不斷改進的簡單的流程模式:界定、測量、分析、改進、控制。

            真正流行并發展起來,是在通用電氣公司的實踐,即20世紀90年代發展起來的6σ(西格瑪)管理是在總結了全面質量管理的成功經驗,提煉了其中流程管理技巧的精華和最行之有效的方法,成為一種提高企業業績與競爭力的管理模式。該管理法在摩托羅拉、通用電氣、戴爾、惠普、西門子、索尼、東芝行眾多跨國企業的實踐證明是卓有成效的。為此,國內一些部門和機構在國內企業大力推6σ管理工作,引導企業開展6σ管理。


           ISO:

            2008年11月14日,國際標準化組織(ISO)正式發布了在世界上運用廣泛的質量管理體系標準的最新版本ISO9001:2008。與ISO9001:2000版標準相比,新版標準沒有引入額外的要求,僅對之前的標準做出了技術修正,對標準中容易發生誤解或含糊的內容做出了進一步的澄清或說明,同時提高了與ISO14001:2004標準的兼容性。ISO9001:2008是ISO9000族相關標準的第四版,第一版標準于1987年出版,2000年,第三版標準ISO9001:2000的內容徹底改變并提出了新的要求,關注以顧客為中心,反映了質量管理的發展,同時也汲取了第一版標準發布以來在實踐工作中所取得的經驗。ISO9001:2000標準對質量管理體系提出要求,組織利用這個質量管理體系框架來控制工作過程,達到各種目標,其中包括使顧客滿意、滿足法規要求和持續改進。貫徹該標準的組織可以選擇獨立第三方認證機構進行認證,以此來提高外界對其產品和服務的信心。盡管這個認證不是強制性的,據統計,在170個國家內,已經超過一百萬家上市和私營的制造和服務組織通過了認證。

            因此上述標準已受到世界各國的重視,并開展了研究與試點。

            四、如何評價軟件質量

            軟件在民航業中的應用越來越廣泛,主要獲取軟件的途徑有四種:

            ● 自行開發

            ● 直接外購

            ● 外購再二次開發

            ● 與軟件開發商合作開發

            而其中又以合作開發最為普遍,因為這種方式更能滿足民航機構獨特的業務流程,更有針對性。合作開發的軟件是否好用?質量如何?如何制定質量評價標準?目前有一些比較好的軟件質量管理平臺,就是根據被測軟件的類型和特點,針對軟件六大質量特性,21項子特性,選擇不同的度量元素,形成的評價體系,以此為依據,對被測軟件進行定性、定量、獨立的技術測試,注重的是用數字說話,更具科學性。

            例如,全國各機場選購安檢信息管理系統,首先是要滿足安全性,其次是功能性和可靠性。軟件可靠性的依據不是軟件已經過多少周的測試、調試,而是在可靠性預測模型中,定量的估計出軟件中每千行代碼尚存在多少個錯誤沒有被消除,即KLOC的大小。更進一步,通過軟件質量測量,用戶知道該管理軟件在今后使用中的平均失效前工作時間(MTTF)和平均失效間隔時間(MTBF),這樣,評價一套軟件,就有據可依了。

            為此,有必要具體了解軟件的質量評價體系。美國的B.W.Boehm和R.Brown 先后提出了三層次的評價度量模型:軟件質量要素、準則、度量。

            第一層:軟件質量要素

            軟件質量可分解成六個要素,這六個要素是軟件的基本特征:

            1. 功能性:軟件所實現的功能滿足用戶需求的程度.功能性反映了所開發的軟件滿足用戶描述的或蘊涵的需求的程度,即用戶要求的功能是否全部實現了。

            2. 可靠性:在規定的時間和條件下,軟件所能維持其性能水平的程度。可靠性對某些軟件是重要的質量要求,它除了反映軟件滿足用戶需求正常運行的程度,且反映了在故障發生時能繼續運行的程度。

            3. 易用性:對于一個軟件,用戶學習、操作、準備輸入和理解輸出時,所做努力的程度。易使用性反映了與用戶的友善性,即用戶在使用本軟件時是否方便。

            4. 效率:在指定的條件下,用軟件實現某種功能所需的計算機資源(包括時間)的有效程度。效率反映了在完成功能要求時,有沒有浪費資源。

            5. 可維護性:在一個可運行軟件中,為了滿足用戶需求、環境改變或軟件錯誤發生時,進行相應修改所做的努力程度。可維修性反映了在用戶需求改變或軟件環境發生變更時,對軟件系統進行相應修改的容易程度。一個易于維護的軟件系統也是一個易理解、易測試和易修改的軟件,以便糾正或增加新的功能,或允許在不同軟件環境上進行操作。

            6. 可移植性:從一個計算機系統或環境轉移到另一個計算機系統或環境的容易程度。

            第二層:評價準則

            評價準則可分成22點。包括:

            ● 精確性:在計算和輸出時所需精度的軟件屬性;

            ● 健壯性:在發生意外時,能繼續執行和恢復系統的軟件屬性;

            ● 安全性:防止軟件受到意外或蓄意的存取、使用、修改、毀壞或泄密的軟件屬性;

            ● 以及通信有效性、處理有效性、設備有效性、可操作性、培訓性、完備性、一致性、可追蹤性、可見性、硬件系統無關性、軟件系統無關性、可擴充性、公用性、模塊性、清晰性、自描述性、簡單性、結構性、產品文件完備性。

            評價準則的一定組合將反映某一軟件質量要素,軟件質量要素與評價準則間的關系如下圖:

            第三層:度量

            根據軟件的需求分析、概要設計、詳細設計、代碼實現、組裝測試、聯調測試和試運行和交付使用七個階段,制定了每一個階段的度量標準,以此實現軟件開發過程的質量控制。

            對于民航機構來說,不管是定制,還是外購軟件后的二次開發,了解和監控軟件開發過程每一個環節的進展情況、產品水平都是至關重要的,因為軟件質量的高低,很大程度上取決于用戶的參與程度。

          posted @ 2011-12-09 16:27 順其自然EVO 閱讀(152) | 評論 (0)編輯 收藏

          關于Solaris的9個小技巧

           Solaris小技巧,雖然不常用,但很有用。

            1、當用telnet訪問另外一臺工作站時,回格鍵不能用,Del鍵變成了回格鍵,如何使回格鍵恢復使用?

            用如下命令:Stty erase ^H

            2、當用telnet登錄另外一臺工作站時,如何使登錄工作站的圖形界面顯示在本機上?

            使用如下方法:

            在telnet之前,先使用以下命令

            #set |grep DIS 用于查本機終端編號,如5.0

            #xhost +登錄機主機名或IP地址

            在telnet之后,使用:

            #DISPLAY=本機主機名或IP地址:本機終端編號

            #export DISPLAY

            3、當root口令忘記時,怎么辦?如何登錄到root?

            辦法如下:

            利用SOLARIS的啟動盤來啟動,然后把硬盤mount上去,修改硬盤上原etc目錄下的shadow文件, 把root下的密碼用一已知的用戶密碼代替,該密碼就成為了root用戶密碼;或者干脆刪除密碼,變成無密碼。然后重新啟動主機,用該已知的用戶密碼就可登錄root用戶。

            步驟如下:

            (1)把你的solaris光盤放進cdrom

            (2)鍵入stop+a

            (3)當出現"ok"字樣時,鍵入boot cdrom -s

            (4)cd /tmp/root

            (5)mkdir /tmp/root/xxx (xxx是什么鬼東西就無關緊要了)

            (6)mount /dev/dsk/c0t0d0s0 /tmp/root/xxx (在這里c0t0d0s0是你的root盤)

            (7)運行csh

            (8)setenv TERM vt220

            (9)cp /tmp/root/xxx/etc/shadow /tmp/root/xxx/shadow/shadow.bak

            (10)vi /tmp/root/xxx/shadow,并且將root項里的password域刪除即可。

            (11)重啟動,你就可以以無密碼的root登陸了,這時更改你的密碼。

          4、如何動態改變SWAP區的大小?

            方法是:先用mkfile建一個空文件,然后用Swap 命令即可;具體步驟,舉例說明如下:如利用/export/home磁盤片中的空間,把swap區擴大200m(當然你可以要求更大):

            (1)#mkdir /export/home/swap

            #cd /export/home/swap

            該步可以沒有,只是為了把擴充的交換區文件放在一個統一的目錄(/export/home/swap)里面。

            (2)#mkfile SIZEm swap1.file

            (SIZE大小根據你的需求,該例中是200;swap1.file是一個SIZEm的空文件,名稱可以隨便你自己定)

            (3)#swap -a /export/home/swap/swap1.file

            (把交換區擴充SIZEm)

            (4)建立/etc/rc2.d/S99swap并將第三步的內容寫入。

            (該步使系統重新啟動時,可以自動把擴充的交換空間加上;如果沒有該步,在系統重新啟動后,需要手工加上,否則交換空間不會擴充)。

            5、DOS文本文件到SOLARIS下的使用問題

            如果在DOS下編的腳本文件,在SOLARIS下使用時,需要做一下變換,方法如下:在SOLARIS下用vi編輯器打開文件,按“shift+:”鍵進入命令模式,鍵入“1,$s/^M//g”,其中 ^ 是control+V鍵,M是control+M鍵。

            6、內部網站上的Answerbook啟動

            用:/etc/init.d/ab2mgr start

            7、當修改了SUN主機的PROM配置,想恢復缺省配置時

            一個方法是直接用鍵盤敲入命令,但當輸入設備設為非鍵盤時,該方法不行,請在重新啟動機器時,按住“Stop+N”鍵,即恢復所有缺省配置。

            8、answerbook的安裝,進入……/product目錄后,用如下命令:pkg -d .

            9、SUN U60只能在單用戶模式下運行,如何恢復?

            問題描述:

            為了將工作站設為從DHCP動態分配IP,并且將主機名由"unknown"改為原名

            修改了/etc/init.d/rootusr,將dhcpinfo后面三行(不是四行)注釋掉;

        1. hostname=`/sbin/dhcpinfo Hostname`  
        2. # case $? in  
        3. # 0) [ -z "$hostname" ] && hostname="unknown" ;;  
        4. # 2) try_dhcp=no ;;  
        5. esac
        6.   重啟后,提示:

        7. /sbin/rcs:ysntax error at line 143 : "esac" unexpected  
        8. INIT:cannot creat /var/adm/utmp or /var/adm/utmpx  
        9. INIT:SINGLE USER MODE
        10.   輸入root口令后,只能運行在單用戶模式,且vi、ls等都不能用(#vi:not found)

            如何才能打開/etc/init.d/rootusr文件進行修改,恢復正常狀態。

            解決方法:

            請找一個SOLARIS的安裝啟動盤,使用以下方法可以修改rootusr文件,步驟如下:

            (1)把你的solaris光盤放進cdrom

            (2)鍵入stop+a

            (3)當出現"ok"字樣時,鍵入boot cdrom -s

            (4)cd /tmp

            (5)mkdir /tmp/xxx (xxx是什么東西無關緊要,隨便取一個名字,如test)

            (6)mount /dev/dsk/c0t0d0s0 /tmp/xxx (在這里c0t0d0s0是你的root盤)

            (7)運行csh

            (8)setenv TERM vt220

            (9)vi /tmp/xxx/etc/init.d/rootusr,把esac那行也注釋掉即可。

            (10)把solaris光盤拿出,reboot,重啟動即可。

          posted @ 2011-12-09 16:08 順其自然EVO 閱讀(273) | 評論 (0)編輯 收藏

          MDF文件在SQL Server數據庫中恢復技術

           先把要恢復的文件置于MS SQL里的DATA文件里,進入MS SQL主數據庫服務器。

            1、我們使用默認方式建立一個供恢復使用的數據庫(如MHDYF2005)。可以在SQL Server里面建立。

            2、停掉數據庫服務器。

            3、將剛才生成的數據庫的日志文件MHDYF2005_log.ldf刪除,用要恢復的數據庫mdf(yu1.mdf)文件覆蓋剛才生成的數據庫數據文件MHDYF2005_data.mdf。

            4、啟動數據庫服務器。(刷新之后)此時會看到數據庫MHDYF2005的狀態為“置疑”。這時候不要對此數據庫進行任何操作。

            5、設置數據庫允許直接操作系統表。此操作可以在SQL Server Enterprise Manager里面選擇數據庫服務器,按右鍵,選擇“屬性”,在“服務器設置”頁面中將“允許對系統目錄直接修改”一項選中。也可以使用如下語句來實現。 use mastergosp_configure ‘allow updates‘,1goreconfigure with overridego

            6、設置MHDYF2005為緊急修復模式,語句如下: update sysdatabases set status=-32768 where dbid=DB_ID(‘MHDYF2005‘)

            此時可以在SQL Server Enterprise Manager里面看到該數據庫處于“只讀置疑脫機緊急模式”可以看到數據庫里面的表,但是僅僅有系統表。

            7、下面執行真正的恢復操作,重建數據庫日志文件 dbcc rebuild_log(‘MHDYF2005‘,‘C:Program FilesMicrosoft SQL ServerMSSQLDataMHDYF2005_log.ldf‘)

            執行過程中,如果遇到下列提示信息: 服務器: 消息 5030,級別 16,狀態 1,行 1

            未能排它地鎖定數據庫以執行該操作。

            DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。

            說明您的其他程序正在使用該數據庫,如果剛才您在F步驟中使用SQL Server Enterprise Manager打開了MHDYF2005庫的系統表,那么退出SQL Server Enterprise Manager就可以了。

            正確執行完成的提示應該類似于:

            警告: 數據庫 ‘MHDYF2005‘ 的日志已重建。已失去事務的一致性。應運行 DBCC CHECKDB 以驗證物理一致性。將必須重置數據庫選項,并且可能需要刪除多余的日志文件。DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。

            此時打開在SQL Server Enterprise Manager里面會看到數據庫的狀態為“只供DBO使用”。此時可以訪問數據庫里面的用戶表了。

            8、驗證數據庫一致性(可省略),語句如下: dbcc checkdb(‘MHDYF2005‘)

            一般執行結果如下:CHECKDB 發現了 0 個分配錯誤和 0 個一致性錯誤(在數據庫 ‘MHDYF2005‘ 中)。DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。

            9、設置數據庫為正常狀態,語句如下: sp_dboption ‘MHDYF2005‘,‘dbo use only‘,‘false‘

            如果沒有出錯,那么恭喜,現在就可以正常的使用恢復后的數據庫啦。

            10、最后一步,我們要將步驟E中設置的“允許對系統目錄直接修改”一項恢復。因為平時直接操作系統表是一件比較危險的事情。當然,我們可以在SQL Server Enterprise Manager里面恢復,也可以使用如下語句完成: sp_configure ‘allow updates‘,0goreconfigure with overridego

          posted @ 2011-12-09 16:06 順其自然EVO 閱讀(166) | 評論 (0)編輯 收藏

          Java NIO類庫關系圖解

          下面這張圖給出了nio類庫的各個類之間的關系,這樣你就能知道該怎樣移動和轉換數據了。舉例來說,如果你想把byte數組寫進文件,你得先用ByteBuffer.wrap( )方法把這個byte數組wrap成buffer,再用getChannel( )在FileOutputStream上打開一個channel,然后才能用ByteBuffer把數據寫入FileChannel。

            注意,ByteBuffer是往channel里讀寫數據的唯一途徑,而且你只能創建這一種byte基本類型的緩沖器ByteBuffer,其余基本類型的緩沖器要用"as" 方法來獲取 。另外你不能把基本類型buffer轉換成ByteBuffer ,不過你可以用view buffer往ByteBuffer里讀寫基本類型數據 ,所以這實際上也不是什么限制了。

            另外,視圖是一種邏輯上的概念,通過視圖操作實質上就是對ByteBuffer的操作,就像通過Iterator操作List一樣。雖然我們可以用wrap() 直接把char數組轉換成CharBuffer,但實際上它還是一個ByteBuffer,而CharBuffer只是它的view。由此可知,我們操控的對象永遠都是ByteBuffer,因為只有它才能往channel里讀寫數據 ,其他基本類型數據緩沖器原理一樣。

          posted @ 2011-12-09 16:05 順其自然EVO 閱讀(177) | 評論 (0)編輯 收藏

          僅列出標題
          共394頁: First 上一頁 349 350 351 352 353 354 355 356 357 下一頁 Last 
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 东乡族自治县| 南城县| 上思县| 喜德县| 玉林市| 三原县| 兴国县| 伊金霍洛旗| 亳州市| 哈巴河县| 四川省| 丽水市| 黔西县| 裕民县| 兴隆县| 武城县| 来凤县| 荔波县| 潜江市| 即墨市| 建宁县| 垣曲县| 博野县| 尚义县| 延长县| 花垣县| 大连市| 乳源| 徐闻县| 泰来县| 翁牛特旗| 民丰县| 德兴市| 蒙自县| 南岸区| 吉木萨尔县| 招远市| 巴青县| 尉犁县| 朝阳县| 乐平市|