qileilove

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

          如何保持在QA這條路上, 而不會想轉換到RD去呢?

          這個問題, 我想是大多數公司或是QA manager的夢靨. 一方面找不到好人才, 一方面人才也不易留住. 很容易地, QA不是離職就是換跑道到RD去. 讓我們來看看Microsoft資深的QA manager如何看待這個問題.
            在某一場合, 作者被問到一個問題: 你如何保持在QA這條路上, 而不會想轉換到RD去呢?
            他說他已經聽過很多次這樣的問題. 許多人把QA視為是RD的一個跳板, 一個先期訓練中心. 他說如果是這樣也不錯, 因為那將會有許多RD知道QA在做什么, 會比較注重質量, 也會比較容易和QA溝通.
            作者也認為并不是因為RD要寫code, 所以QA想過去. 其實QA自己也是需要寫code, 去做automation或是幫助測試更方面. 他認為QA會想離開是因為太多QA manager無法求新, 只考慮shipment和 schedule, 缺乏有求新求變的環境和心態.
            而至于愿意留下來的QA, 則是因為在team里面, 他們有機會去做invent, investigate and discover, 使得他們有成就感.
            所以如何讓你的QA愿意留下來呢? 讓他們有機會去創新. 如果他們都只是focus 在test cases execution和ship schedule, 那大家都會想跑的
            以下是一些讀者的響應
            ===============================
            calkelpdiver said:
            他提到QA會想換工作的原因
            (1)  lack of credibility & respect, lack of pay, lack of support, insane work schedules, finger pointing
            (2) getting the opportunity to do new and innovate things in this line of work doesn't come often for the average tester in the average company (Microsoft, and other large shops may be different).
            (3) Want to earn more money (RD's pay is higher)
            ===============================
            swn1 said:
            他提出一個可能的改善方法: rotation
            Assign testers to development teams, assign developers to test rotations.
            Developers became very conscious of the need for documentable designs, meaningful messages, and such. And customers were shocked to have the phone answered by someone who understood and could actually fix their problem.  Good for everyone.
            ===============================
            ru_altom said:
            他認為rotation不太可行, 原因如下
            (1) 你需要假設RD是一個好的QA, QA 也是一個好的RD
            (2) RD 和QA的mindset不同, A tester will write code to break someone else's code, while a developer will aim to write unbreakable code.
            所以他贊同JW的作法:
            Innovation is the best way to keep your testers (and developers as well) content and at their best. Give them a chance to invent, to find new ways, to try their ideas - and they won't leave, not for another department and not for another company.

          posted @ 2014-09-15 09:33 順其自然EVO 閱讀(196) | 評論 (0)編輯 收藏

          自動化測試—想說愛你不容易

            正如許多事情都有其兩面性一樣,測試方法也是這樣。要保證測試方法正確,最簡單、最直觀地想法就是多寫些測試用例,從更多地角度去測試,但這必然增加我們的測試成本。小步快跑要求我們頻繁進行測試,假如我們重構的周期是20分鐘,但測試卻要花掉10分鐘,那么這樣的成本就實在太大了。假如這種測試還是開發人員手工測試,每天都有對同樣的測試反復執行數十遍,那么開發人員估計就要瘋掉了。
            你可能立即就想到自動化測試了。是的,在許多重構的書籍中,大師們都建議我們在重構開始前,首先建立自動化測試機制。但遺憾的是,我經過多年的實踐總結出來的經驗是,這幾乎不可能實現。每次重構,我們面臨的都是一個個遺留系統。大多數遺留系統都有一些共同的特征:代碼凌亂,沒有清晰的接口;代碼間耦合度高,相互依賴嚴重;web層、業務層、數據訪問層往往沒有清晰的界限,代碼相互參雜其中。在這樣的情況下,編寫自動化測試代碼是幾乎不可完成的任務。當然,這里所說的自動化測試代碼,是指那些基于JUnit編寫的自動化測試程序
            舉一個簡單的例子:假如你現在要測試一個開票類,想編寫它的測試代碼。本來這個開票類并不復雜,業務也很清晰。但是在函數傳遞參數時,其中一個參數是Web容器中的Request、Response或Session。這下麻煩了,為了測試一個簡單的函數,我們必須啟動整個Web應用,這是我們不可接受的。
            隨后你可能會說了,我們為什么非要傳遞一個真正地Request、Response或Session呢?我們Mock一個假的嘛!想法不錯,但你真正去嘗試Mock時你會發現這也是一個不可完成的任務。Request、Response或Session有許多的狀態,屬性變量中又有對象,又有屬性變量。除此還有大量集合變量,集合變量里都有什么對象,天才知道。因此,即使你費盡千辛萬苦Mock出來,也可能因某些屬性不對而使得測試失敗。
            另一個寫自動化測試程序比較忌諱的就是訪問數據庫。比如你這次執行的插入操作成功了,并不意味著下次執行就可以成功。下次執行會報“主鍵沖突”錯誤,出現這個錯誤并不是被測程序錯了,而是測試程序錯了。上次執行一個查詢產生的結果集,不一定就是下一次執行同樣一個查詢產生的結果。查詢結果變了,并不意味著被測程序錯了,而是測試程序不對。自動化測試程序之所以能夠自動化執行,必須要保證測試過程是可以反復執行的,并且不論什么時候執行都有一個確定的結果。
            總之,自動化測試不是銀彈,并不是所有代碼都適合自動化測試。與Web容器或其它設備驅動相關的代碼是不適合自動化測試的,因為我們在測試的時候不希望去啟動Web容器或其它設備。因此,我們在做自動化測試程序前,首先應當確保要測試的程序已經與Web容器或其它設備驅動相關的代碼充分解耦。一個比較好的辦法就是分離出Web層與BUS層,Web層負責從Web容器中獲取數據,并打包傳遞給BUS層,而BUS層則完成真正需要測試的業務邏輯。
            另一個不適合自動化測試的就是要訪問數據庫的程序,因為它們執行的結果總是與數據庫狀態有關,無法獲得穩定而可以不斷復現的結果。所以,我們解決它的最好辦法就是將訪問數據庫的部分Mock掉。如何Mock呢?你不能Mock一個JDBC,也不能Mock一個Hibernate,因為那都過于復雜了,你唯一可以做的就是將DAO層Mock掉。這就要求我們對系統重構的時候,要將數據庫訪問的代碼從業務代碼中脫離出來,寫入到DAO層。最后,被Mock的DAO層代碼并不真正去訪問數據庫。每當客戶程序傳入一個參數時,它首先作為測試程序去驗證這個參數是否與預期一致,然后返回一個確定的結果。

          posted @ 2014-09-15 09:32 順其自然EVO 閱讀(332) | 評論 (0)編輯 收藏

          MariaDB和MySQL性能測試比較

           現在選擇繼續使用MySQL或拋棄它切換到MariaDB有足夠的理由。
            現在把目光移到benchmark上面來,它其實也是由MariaDB團隊開發的,并加了一下額外的說明。這篇博客提到了一個有趣的地方:把MYSQL5.6的線程數一直增加到16,性能都很好,但是超過了16的話,盡管性能也有提升一點點,但比較發現,遠不如其他版本(包括MairaDB-5.5.28a和MairaDB-10.0.1;參考文章頂部的性能測試圖)。這在單核計算機里面試圖達到多核多線程的效果的并行程序時,都會有此類的通病。如果算法設計得當,隨著CPU核心數的增加,性能也會跟著提升。當然問題是,你必須在并行程序中處理好2個方面:(1)跨多核的多線程問題(2)矢量化。這也是當前面向多核編程的兩個方向,你編寫的必須能很好的控制這兩個方面。
            如果沒有正確的編寫代碼將會得到一個共同的結果,即在用8到16個線程的開始你就想看到好的結果,但在這些線程運行之后你不會看到你期望的結果。你將會看到這個問題,這意味這可能是算法問題。(這也不是超線程或是硬件線程造成的)這就是我們在這里看到MySQL 基準的問題。對于我來說,這就是MySQL規模化產生問題的跡象,這也是令人擔心的原因之一。MariaDB在同樣的基準中也有一些小問題,但是比MySQL要輕微的多,只能說是勉強吧;我推測這個問題在并行計算中可能不會出現。
            我也不知道在測試中怎樣才能很好的根據不同機器指定不同的編譯器來與之匹配。當你為Intel編譯代碼時,你需要為目標機器編譯生成合適的SIMD代碼;如果不匹配,你將不會得到你所期望執行的矢量代碼。為了能正確處理,你需要在代碼中插入正確的編譯指示代碼,然后要寫下正確的矢量算法,最后在選擇合適的編譯器。我知道這樣看起來很愚笨,但我看過一個發行產品用錯誤的編譯器所造成的結果是你無法想象的。好歹,很明顯,MySQL代碼在多核和矢量化中的優化沒有MariaDB好。
            (我真正想看到的是,MySQL或MariaDB的一個分支為Intel Xeon Phi處理器核心做一個特別的編譯,使代碼轉移到61 核心協處理器,并且有人能嘗試加速所有244個線程。可惜我沒有接觸過這樣的機器。同樣的,如果你想學習更多關于向量化和并行方式編寫代碼方面的知識,檢索最近Intel公司 James Jeffers 與 James Reinders寫的文章“Intel Xeon Phi 協處理器高性能編程”。)
            很明顯,MariaDB的新特性并不是都這么好——你可能需要連接 Cassandra 來獲取一些數據,但是我很懷疑你會使用 MySQL 去做這件事情。關于這個平臺上提供的其他引擎也有類似的爭議。MariaDB的性能看起來在多核環境下表現不錯,但是我強烈懷疑其實通過調優,MySQL 也可以做到。
            所以你還應該轉移到 MariaDB 嗎?
            首先,考慮潛在的風險(高層管理者都喜歡聽風險和利益)。如果你遷移到 MariaDB,你可能會使用特定于 MariaDB 的特性(但目前似乎還不可能),然后發現很難再用很小的資源切換回 MySQL 。但是我想說的是,這個并不真的是一個風險,下面從更大的范圍里討論一些問題。
            考慮一下關于 Oracle 以及 Oracle 對 MySQL 授權的問題。免費以及開源的 MySQL 要與 Oracle 極具競爭力的專有軟件競爭。那么,Oracle 會做什么事情阻止 MySQL 的開發呢?(一些人可能會說,這樣的事情已經發生了)
            那么,MySQL 和 MariaDB 的兼容性如何呢?MariaDB 團隊正盡力去保持對 MySQL 的全面兼容,他們繼續向源碼中提交 bug 修復。但那些新特性(以及版本方案)表明,盡管盡了最大的努力,這兩個平臺還是會繼續分裂。
            如果 Oracle 向 MySQL 添加 MariaDB 不采納的新特性,這些特性明顯不會對你可用。如果你正在使用 MySQL 不具備的 MariaDB 特性,你將不能輕易地切換到 MySQL 。 MariaDB 表示這樣的情況很可能存在一段時間,然而你也不能說相同的情況不會在 MySQL 中出現。就是說,即使 MariaDB 的新特性并不那么有用,但是(在我看來)已經有足夠的理由從 MySQL 遷移到 MariaDB 了。
            (在結束這篇文章前說一件事:即在 blogosphere 的作者提出過的一個關鍵問題——服務協議。如果在你的公司總經理瘋狂到向 Oracle 購買了服務協議來幫助你開發管理 MySQL 數據庫,那么你可能愿意停留在MySQL 以避免因為違反協議而造成的財務和法律上的問題。但除此以外,我看不到什么理由繼續使用 MySQL 數據庫)

          posted @ 2014-09-15 09:32 順其自然EVO 閱讀(330) | 評論 (0)編輯 收藏

          測試用例的關鍵的認知

           無論缺陷預防工作貫徹落實地多好,軟件組件總有缺陷。這很明顯,因為開發商無法阻止/消除軟件開發周期的所有缺陷。因此,軟件必須進行徹底的測試,然后才交付給最終用戶。測試人員的責任是:設計既可以(ⅰ)找軟件缺陷,又能(ii )評估該軟件的性能,可用性和可靠性等方面的測試。
            現在,為了實現這些目標,測試人員必須(往往是從一個非常大的執行域中)選擇和/或制定測試用例的有限數量。不幸的是,完整的測試通常不是在這個范圍,預算和時間的約束內實現和/或執行的。重要的是,當測試開始失控且不按計劃地運行時,由于預期無法實際,測試人員往往承受了來自管理層和利益相關者的巨大壓力。
            因此,測試人員必須有效地計劃測試并制定正確的測試用例,選擇并執行合適的用例,監控過程,以確保有效利用工作資源和時間。所以,要列出這些無疑是一項艱巨的任務;要有效地實施,測試人員需要受過適當的教育和培訓并擁有贏得管理層支持的能力。
            一般情況下,測試人員會用兩種不同的測試方法,其中,使用常規方法,測試人員主要是嘗試用所有可能的輸入去測試一個模塊或組件,用所有可能的軟件結構去實踐。盡管這種做法仍在使用,測試人員卻在慢慢灌輸推理軟件的一切的價值,最終使他們能夠檢測出所有可能存在的缺陷。但見多識廣且有學問的測試員們都明白,這在現實或經濟上是不可行,不可實現的目標。
            現在,另一種方法可能就是讓測試員們隨機選擇測試輸入,希望這些測試能將大的缺陷找出來。不過,測試專家認為,隨機生成的測試輸入在評估系統的質量屬性方面表現紀錄欠佳。所以,從測試的角度來看,這是一個無休止的爭論和懸而未決的問題。盡管如此,我們還是認為,測試員的最終目標是了解測試的功能、輸入/輸出域和使用環境,等等。
            同樣,對于某些特定類型的測試,測試人員也需要詳細地了解代碼是如何構造的。此外,測試人員也需要利用關于常在軟件開發或維護過程中生成的特定缺陷的知識。有了這些信息,測試者就必須明智地選擇測試輸入的子集,以及被認為最有可能找測試過程中條件和限制內的缺陷的測試輸入組合。然而,這個過程需要時間和精力。所以,測試人員知道且贊同:只有開發出基于執行的測試的有效測試用例,才能最大化和/或優化對時間和資源的利用。
            “有效測試用例”我們是指:“一個很可能找出缺陷的測試用例” 。因此,制定有效測試用例的能力對于一個組織邁向一個更高質量的測試過程來說是非常重要的;反過來,一個組織邁向一個更高質量的測試過程對制定有效測試用例的能力也有許多積極影響。
            例如,如果測試用例是有效的,那么:
            檢測缺陷的概率更大。
            更有效地利用組織資源。
            測試再用的可能性更高。
            更符合測試、項目進度、預算,更重要地,提供更高質量的軟件產品的可能性。
            測試用例設計方法 - 概念化
            上面介紹了有效測試用例的種種好處,但縝密考慮測試人員用來設計這些有效測試用例的方法也同樣重要。為了回答這個問題,有必要把軟件作為一個精心設計的產品來查看和/或檢查。現在,有了這個觀念,就有兩個基本方法可以用來設計測試用例:
            黑盒(有時也稱為功能或規格)測試方法。
            白盒(有時也稱為clear或透明盒 )測試方法。
            使用黑盒測試方法,測試人員把SUT (測試中的軟件)當作一個不知道其內部結構(即如何運作)的不透明盒子,測試人員只知道它的作用。使用這種方法的SUT的大小可以是一個簡單的模塊、成員函數、對象群、一個子系統、或一個完整的軟件系統。此外, SUT的基礎行為或功能的描述可以由正式規格,輸入/處理/輸出圖( IPO),或一套定義明確的先決、后置條件來提供;重要的是,另一個值得一提的信息來源是:需求規格說明文檔,通常描述SUT的功能,輸入及預期輸出。現在,鑒于上述來源,測試員提供指定輸入到SUT,進行測試運行,然后確定所產生的輸出是否與說明文檔中提供的一致。因為黑盒測試方法只考慮了軟件的行為和功能,它通常被稱為功能測試,或基于規范的測試。這種方法特別有用,極有助于找到要求和規格中的缺陷。
            與此相反,白盒測試方法關注將被測試的軟件的內部結構。因此,使用白盒測試方法來設計測試用例,測試人員應該先了解結構,且為了實現這一目標,必須可隨時參考和理解代碼或適當的類偽代碼的要求。一旦對結構有了必要的了解,測試者就可以選擇合適的測試用例去實踐特定的內部結構要素,并確定它們是否正常工作。例如,測試用例通常被設計來實踐所有語句或發生在一個模塊或成員函數中的真/假分支。但是,由于白盒測試的設計,執行和結果分析非常耗時,這種方法被限制和/或通常只適用于軟件的小部分,如模塊或成員函數。然而,白盒測試方法對于找出設計和基于代碼的控件的邏輯缺陷和順序缺陷,初始化缺陷和數據流缺陷等特別有用。
            然而,從測試員的角度來看,要實現向用戶提供低缺陷高質量的軟件的目標,必須把這兩種方法都用來設計測試用例。另外,這兩種方法都支持測試員選擇有限數量的將被用于測試的測試用例。這兩種方法可以相互補充,因為每個都或許有助于找到某些特定類型的缺陷。重要的是,有了使用這兩種方法設計出的一組測試用例,測試員找到SUT中各種不同類型缺陷的機會就增加了。
            測試員還有一套有效的可再用的用來進行回歸測試(更改后的重新測試),以及軟件測試的新版本。
            上面是一份概要:使用任一設計方法制定測試用例的各種可用方法。
            但是,在使用任一設計方法準備測試用例前有一些因素需要考慮清楚。它們分別是:
            測試相關風險。
            預期缺陷類型。
            測試員的知識和經驗。
            測試水平和必須進行分組和管理的小組活動。
            用于執行測試用例的工具。
            應用程序,軟件和問題域的類型。
            客戶要求,等等。
          現在除了上述因素,以下幾個要點和/或問題在選擇正確的測試用例設計技術中發揮了至關重要的作用:
            基于“經驗”的測試用例設計
            在基于經驗的技術中,是人們的知識,技能和專業知識(關于域,技術等)構成了測試條件和測試用例的基礎,且對制定測試條件和測試用例很重要。
            在這兒,人們技術和業務兩方面的經驗都是絕對必需的,必要的,因為這給測試分析和設計過程提供了不同的角度。
            重要的是,有了他們使用類似系統工作的豐富(前)的經驗,他們或許對什么會出錯,什么有助于測試有了想法和/或深入的理解。
            因此,基于經驗的技術與基于規范既與基于結構的技術偕行,又可用于沒有規格,或者規格不足或過時的時候。
            這可能是用于設計測試低風險系統的測試用例的唯一技術,但是這種方法可能在非常緊急的情況下特別有用,事實上,這是導致探索性測試的一個因素。
            “隨機”方式—考慮了嗎?
            通常,任何軟件模塊或系統都有輸入域,從這個域里選擇并使用測試輸入數據建和/或執行測試用例。
            現在,如果一個測試人員從必要輸入域中隨機選擇輸入,準備測試用例,并用它們來測試應用程序,這種方法被稱為“隨機測試”。
            例如,如果一個模塊的有效輸入域是1到100之間所有的正整數,然后用這種方法測試人員會隨機或胡亂地從該領域內選擇值,如,選15 , 27和33。
            但是,使用這種方法,也有一些一直無解的問題:
            值(上面的例子中三個值)足以表明,執行測試用或運行例測試時,模塊符合其規格嗎?
            是否有其他輸入值,比那些(在本例中)被選中的值,更能找缺陷?
            抑或有效輸入域外的任何值應該作為執行測試用例的測試輸入?
            這就是說,測試數據應包括大于100的浮點值,負值或整數值?
            因此,上述問題可以立即通過更加結構化的黑盒測試設計方法解決,盡管使用隨機測試輸入可以節省一些時間和精力,其他測試輸入選擇方法要求。
            但是,根據許多測試專家,隨機選擇測試輸入會產生一個有效的用于執行測試用例的測試數據集的機會非常小,并且對于一個更結構化的方法,隨機方法生成測試輸入的相對有效性總成為自省和/或研究的課題。

          posted @ 2014-09-15 09:22 順其自然EVO 閱讀(169) | 評論 (0)編輯 收藏

          使用Siege測試Web服務器

           好處是可以對一組url進行測試
            參見 http://www.aygfsteel.com/crespochen/archive/2009/06/02/279573.html 和 http://baike.baidu.com/link?url=Uv0KtwM83hvFTjudQsP37FIfeUDJxMW4Kvodfk6oSTJ4B4ctpr1R6P4CGXdyMExyU7rGL2bold_aGJHwKaV2l_
            郭揚提供了1.73上的應用,拷貝到/guodian/uap2,部署上Weblogic的Server-0(端口號是7010)。uap2依賴于uap_server。通過http訪問是
            查詢
            http://192.168.1.73:7010/sguap-client/SmallCase/rest/smallCase/
            增加:
            http://192.168.1.73:7010/sguap-client/SmallCase/rest/smallCase/insert?uuid=XXX&name=XXX
            修改:
            http://192.168.1.73:7010/sguap-client/SmallCase/rest/smallCase/update?uuid=XXX&name=XXX
            刪除
            http://192.168.1.73:7010/sguap-client/SmallCase/rest/smallCase/delete?uuid=XXX
            我們在1.74上做測試。
            yum -y install siege #安裝siege,安裝不上的話,就從前面提供的URL上下載siege,再安裝。
            據此,寫了個shell生成url
          #!/bin/bashfunction get_random_name(){MATRIX="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"LENGTH=8while[${n:=1}-le$LENGTH]; doPASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"let n+=1doneecho$PASS}function make_link(){act=$1#echo $actfor i in$seqc; do#echo $i
          linkarr[$i]="\$link/$act?uuid=${idarr[$i]}&name=$(get_random_name)"echo${linkarr[$i]}>>$outdone}num=$1out=$2[ x$num = x ]&&num=10[ x$out = x ]&&out=link.out
          link=http://192.168.1.73:7010/sguap-client/SmallCase/rest/smallCase
          declare-a idarr
          seqc=`seq$num`for i in$seqc; do
          idarr[$i]=$[$RANDOM%1000]doneecholink=$link>$outecho${idarr[@]}declare-a linkarr
          $(make_link insert);
          echo \$link/>>$outecho>>$out
          $(make_link update);
          echo \$link/>>$outecho>>$out
          $(make_link delete);
          echo \$link/>>$outecho>>$out
            測試命令
            siege -c20 -r2 -f link.out
            參數說明:
            -c20 并發20個用戶
            -r2 重復循環2次
            -f link.out 任務列表:URL列表
            測試結果:
          ** SIEGE 3.0.0
          ** Preparing 20 concurrent users for battle.
          The server is now under siege...
          HTTP/1.1 200   0.37 secs:     340 bytes ==> GET  /sguap-client/SmallCase/rest/smallCase/insert
          HTTP/1.1 200   0.38 secs:     340 bytes ==> GET  /sguap-client/SmallCase/rest/smallCase/insert
          ...............................................  #代替很多條HTTP/1.1 ...
          Transactions:          40 hits
          Availability:      100.00 %
          Elapsed time:        2.14 secs
          Data transferred:        0.01 MB
          Response time:        0.21 secs
          Transaction rate:       18.69 trans/sec
          Throughput:        0.01 MB/sec
          Concurrency:        3.87
          Successful transactions:          40
          Failed transactions:           0
          Longest transaction:        0.58
          Shortest transaction:        0.00
            Concurrency是并發數
            siege還包含了一些輔助工具:bombardment,是一個輔助工具:用于按照增量用戶壓力測試。
            bombardment link.out 5 5 10 1
            這樣測試,效果也良好,就是費時間。

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

          搭建LVS負載均衡測試環境

           實現負載均衡有很多種方式
            土豪直接F5,性能最好,價格最貴
            沒錢也可以使用Apache,Nginx 工作在網絡的第四層,雖然性能一般,但是很靈活,比如可以將80端口映射到真實服務器的8080端口.
            還有一種選擇LVS ,它工作在網絡的第三層,性能較好,非常穩定.
            但是它不能實現端口的重新映射.因為在網絡的第三層,并不清楚端口的信息。
            下面的實驗搭建了一個LVS負載均衡測試環境,采用DR的方式。
            客戶端訪問LVS前置機
            這個請求如下
            源MAC(client mac) 目標MAC(DR mac) 源IP(client IP) 目標IP(DR IP,VIP)
            LVS前置機會將報文改寫之后轉發真實的服務器
            改寫如下
            源MAC(client mac) 目標MAX(真實服務器MAC) 源IP(client IP) 目標IP(DR IP,VIP)
            因為真實的服務器將VIP綁定到了環回地址,所以會處理這個請求,并返回響應的報文.
            網絡層的源目對掉
            源MAC(真實服務器MAC) 目標MAC(client mac) 源IP(DR IP,VIP) 目標IP(client IP)
            所以LVS DR的本質就是網絡層的欺騙。
            實驗采用VirtualBox虛擬機,并且配置內部網絡,關閉SELinux和防火墻
            首先,在LVS DR前置機上安裝ipvsadm命令
            yum install ipvsadm -y
            然后配置兩臺真實服務器(RealServer)的Http服務
            yum install httpd -y
            service httpd start
            chkconfig httpd on
            并分別改寫/var/www/html/index.html的內容為"real server 1"和"real server 2"
            然后在兩臺真實服務器上執行如下的腳本
          vim lvs_real.sh
          #!/bin/bash
          # description: Config realserver lo and apply noarp
          SNS_VIP=192.168.16.199
          source /etc/rc.d/init.d/functions
          case "$1" in
          start)
          ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
          /sbin/route add -host $SNS_VIP dev lo:0
          echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
          echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
          echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
          echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
          sysctl -p >/dev/null 2>&1
          echo "RealServer Start OK"
          ;;
          stop)
          ifconfig lo:0 down
          route del $SNS_VIP >/dev/null 2>&1
          echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
          echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
          echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
          echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
          echo "RealServer Stoped"
          ;;
          *)
          echo "Usage: $0 {start|stop}"
          exit 1
          esac
          exit 0
           最后,在DR前置機上執行如下腳本
          vim lvs_dr.sh
          #!/bin/bash
          VIP1=192.168.16.199
          RIP1=192.168.16.3
          RIP2=192.168.16.4
          case "$1" in
          start)
          echo " start LVS of DirectorServer"
          /sbin/ifconfig eth1:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 broadcast $VIP1 up
          /sbin/route add -host $VIP1 dev eth1:0
          echo "1" >/proc/sys/net/ipv4/ip_forward
          /sbin/ipvsadm -C
          /sbin/ipvsadm -A -t $VIP1:80 -s rr
          /sbin/ipvsadm -a -t $VIP1:80 -r $RIP1:80 -g -w 1
          /sbin/ipvsadm -a -t $VIP1:80 -r $RIP2:80 -g -w 1
          /sbin/ipvsadm
          ;;
          stop)
          echo "close LVS Directorserver"
          echo "0" >/proc/sys/net/ipv4/ip_forward
          /sbin/ipvsadm -C
          /sbin/ifconfig eth1:0 down
          ;;
          *)
          echo "Usage: $0 {start|stop}"
          exit 1
          esac
            通過client訪問LVS前置服務器,可以看到已經實現了負載均衡的效果。
            關于LVS的調度算法,轉載自張逸群的博客
            http://www.zhangyiqun.net/56.html
            1. 大鍋飯調度(Round-Robin Scheduling RR)
            rr – 純輪詢方式,比較垃圾。把每項請求按順序在真正服務器中分派。
            2. 帶權重的大鍋飯調度(Weighted Round-Robin Scheduling WRR)
            wrr -帶權重輪詢方式。把每項請求按順序在真正服務器中循環分派,但是給能力較大的服務器分派較多的作業。
            3. 誰不干活就給誰分配(Least-Connection LC)
            lc – 根據最小連接數分派
            4. 帶權重的誰不干活就給誰分配(Weighted Least-Connections WLC 默認)
            wlc – 帶權重的。機器配置好的權重高。
            5. 基于地區的最少連接調度(Locality-Based Least-Connection
            Scheduling LBLC)
            lblc – 緩存服務器集群。基于本地的最小連接。把請求傳遞到負載小的服務器上。
            6. 帶有復制調度的基于地區的最少連接調度(Locality-Based Least-Connection Scheduling with Replication Scheduling LBLCR)
            lblcr – 帶復制調度的緩存服務器集群。某頁面緩存在服務器A上,被訪問次數極高,而其他緩存服務器負載較低,監視是否訪問同一頁面,如果是訪問同一頁面則把請求分到其他服務器。
            7. 目標散列調度(Destination Hash Scheduling DH)
            realserver中綁定兩個ip。ld判斷來者的ISP商,將其轉到相應的IP。
            8. 源散列調度(Source Hash Scheduling SH)
            源地址散列。基于client地址的來源區分。(用的很少)
            9. 最短的期望的延遲(Shortest Expected Delay Scheduling SED)
            基于wlc算法。這個必須舉例來說了
            ABC三臺機器分別權重123 ,連接數也分別是123。那么如果使用WLC算法的話一個新請求進入時它可能會分給ABC中的任意一個。使用sed算法后會進行這樣一個運算
            A:(1+1)/1
            B:(1+2)/2
            C:(1+3)/3
            根據運算結果,把連接交給C 。
            10.最少隊列調度(Never Queue Scheduling NQ)
            無需隊列。如果有臺realserver的連接數=0就直接分配過去,不需要在進行sed運算。
            遇到的問題..
            這個實驗看著簡單,做了足足半個月,但是還有一些不明白的問題,可能和網絡知識的匱乏有關系。
            在DR前置機上不能通過VIP訪問真實的服務器
            在DR前置機上執行命令,報錯如下
            查看ipvsadm,連接狀態是SYN_RECV
            一開始我使用了三臺虛擬機,卡在這個地方很長時間。
            后來偶然發現,用第四臺虛擬機就可以正常訪問了..

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

          Oracle靜態監聽注冊詳解

           網上有很多關于oracle 監聽靜態注冊的文章,但大多都是簡單說說,并沒有詳細的例子,這里,將結合linux as4 下的oracle 10gR2.0.1 舉一個具體的例子
            1、在 $ORACLE_HOME/network/admin/listener.ora 文件中加入一個靜態注冊的節點
          [oracle@prudent oracle]$ cd $ORACLE_HOME/network/admin
          [oracle@prudent admin]$ vi listener.ora
          # listener.ora Network Configuration File: /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/listener.ora
          # Generated by Oracle configuration tools.
          SID_LIST_LISTENER =
          (SID_LIST =
          (SID_DESC =
          (SID_NAME = PLSExtProc)
          (ORACLE_HOME = /mydatafile2/app/oracle/oracle/product/11.2.0/db_1)
          (PROGRAM = extproc)
          )
          (SID_DESC =
          (SID_NAME = ORCL)
          (ORACLE_HOME = /mydatafile2/app/oracle/oracle/product/11.2.0/db_1)
          (GLOBAL_DBNAME=WOO.COM)
          )
          )
          LISTENER =
          (DESCRIPTION_LIST =
          (DESCRIPTION =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
          (ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521))
          )
          )
            注意這里的GLOBAL_DBNAME=WOO.COM
            SID_NAME=ORCL
            這個SID_NAME 應與你對外提供服務的 $ORACLE_SID 一致
            [oracle@prudent admin]$ echo $ORACLE_SID
            ORCL
            2、配置對應的tnsnames.ora 中的節點
          [oracle@prudent admin]$ vi tnsnames.ora
          # tnsnames.ora Network Configuration File: /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
          # Generated by Oracle configuration tools.
          ORCL=
          (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521))
          (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = ORCL)
          )
          )
          WOOORCL=
          (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521))
          (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = WOO.COM)
          )
          )
          [oracle@prudent admin]$ vi tnsnames.ora
          # tnsnames.ora Network Configuration File: /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
          # Generated by Oracle configuration tools.
          ORCL=
          (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521))
          (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = ORCL)
          )
          )
          WOOORCL=
          (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521))
          (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = WOO.COM)
          )
          )
          tnsname WOOORCL 中的 SERVICE_NAME=WOO.COM
            這里的服務名為 WOO.COM 而不是通常的 ORCL,因為在 listener.ora 中已經注冊了 WOO.COM,lsnrctl 啟動時會監聽 WOO.COM ,并對應到 SID_NAME=ORCL 上。3、啟動監聽和服務
          [oracle@prudent oracle]$ cat dbstart
          lsnrctl start
          sqlplus /nolog <<EOF
          connect /as sysdba
          startup
          EOF
          [oracle@prudent oracle]$ ./dbstart
          LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 13-FEB-2011 20:11:15
          Copyright (c) 1991, 2005, Oracle.  All rights reserved.
          Starting /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/bin/tnslsnr: please wait...
          TNSLSNR for Linux: Version 11.2.0.1.0 - Production
          System parameter file is /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/listener.ora
          Log messages written to /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/log/listener.log
          Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
          Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=prudent)(PORT=1521)))
          Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
          STATUS of the LISTENER
          ------------------------
          Alias                     LISTENER
          Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
          Start Date                13-FEB-2011 20:11:15
          Uptime                    0 days 0 hr. 0 min. 0 sec
          Trace Level               off
          Security                  ON: Local OS Authentication
          SNMP                      OFF
          Listener Parameter File   /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/listener.ora
          Listener Log File         /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/log/listener.log
          Listening Endpoints Summary...
          (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
          (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=prudent)(PORT=1521)))
          Services Summary...
          Service "WOO.COM" has 1 instance(s).
          Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...
          Service "ORCL" has 1 instance(s).
          Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...
          Service "PLSExtProc" has 1 instance(s).
          Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
          The command completed successfully
          SQL*Plus: Release 11.2.0.1.0 - Production on Sun Feb 13 20:11:16 2011
          Copyright (c) 1982, 2005, Oracle.  All rights reserved.
          SQL> Connected to an idle instance.
          SQL> ORA-32004: obsolete and/or deprecated parameter(s) specified
          ORACLE instance started.
          Total System Global Area  461373440 bytes
          Fixed Size                  1220000 bytes
          Variable Size              75498080 bytes
          Database Buffers          381681664 bytes
          Redo Buffers                2973696 bytes
          Database mounted.
          Database opened.
          SQL> Disconnected from Oracle Database 10g Enterprise Edition Release 11.2.0.1.0 - Production
          With the Partitioning, OLAP and Data Mining options
            可以看到
            Service "WOO.COM" has 1 instance(s).
            Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...
            正在被監聽。
            4、驗證該服務可以到達
          [oracle@prudent oracle]$ tnsping WOOORCL
          TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 13-FEB-2011 20:14:59
          Copyright (c) 1997, 2005, Oracle.  All rights reserved.
          Used parameter files:
          /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/sqlnet.ora
          Used TNSNAMES adapter to resolve the alias
          Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = WOO.COM)))
          OK (10 msec)
            5、利用靜態注冊的服務登入oracle
          [oracle@prudent oracle]$ sqlplus system@oracleWOOORCL
          SQL*Plus: Release 11.2.0.1.0 - Production on Sun Feb 13 20:17:27 2011
          Copyright (c) 1982, 2005, Oracle.  All rights reserved.
          Connected to:
          Oracle Database 10g Enterprise Edition Release 11.2.0.1.0 - Production
          With the Partitioning, OLAP and Data Mining options
          SQL> select count(*) from date_log;
          COUNT(*)
          ----------
          SQL>
            至此:已驗證該靜態注冊可以成功的被解析,監聽,連接。

          posted @ 2014-09-12 10:04 順其自然EVO 閱讀(3048) | 評論 (0)編輯 收藏

          Java學習之反射機制

          java語言區別于C,C++等準靜態語言的最大特點就是java的反射機制。靜態語言的最直接定義就是不能在運行時改變程序結構或變量的類型.按照這樣的定義,python,ruby是動態語言,C,C++,Java不是動態語言。雖然在這樣的定義下java不是動態語言,但java的反射機制(Reflection)卻是可實現動態的相關機制。java反射機制的作用有
            1、在運行時判斷任意一個類所具有的成員變量和方法
            2、在運行時構造任意一個類的對象
            3、在運行時判斷任意一個對象所屬的類
            4、在運行時調用任意一個對象的方法
            在java的jdk中,有java.lang.reflect包,在該包中有5個比較重要的類,
            1、Class類:代表一個類。
            2、Constructor類:表示類的構造方法,通過該類來操作構造方法
            3、Field類:代表類的成員變量(屬性)。
            4、Method類:代表類的方法。通過該類可操作方法。
            5、Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法。
            Class 類十分特殊。它和一般類一樣繼承自Object,當一個class被加載,或當加載器(class loader)的defineClass()被JVM調用,JVM 便自動產生一個Class 對象。Class并沒有構造方法,不能人為生成。
            要想使用java的反射,首先要獲得類的Class,而獲得的方法有以下幾種
            String str = "CIACs";
            1、Class c1 = str.getClass();
            2、Class c2 = Class.forName("java.lang.String");//調用Class的靜態方法
            3、Class c3 = String.class;//每個包裝類都有自身的class
            獲得Class后,就可以生成對象了,對象的構造方法有帶參數的和不帶參數的,當通過不帶參數的構造方法來生成對象時有以下兩種方式
            1、通過newInstance()方法生成
            Class<?> classType = str.getClass();
            Object obj = classType.newInstance();
            2、通過構造方法實現
            Class<?> classType = str.getClass();
            Constructor con = classType.getConstructor(new Class[]{});
            Object obj = con.newInstance(new Object[]{});
            若要通過帶參數的構造方法生成對象實例,就只能使用如下方法
            Class<?> classType = str.getClass();
            Constructor con = classType.getConstructor(new Class[]{String.class});
            Object obj = con.newInstance(new Object[]{"CIACs"});
           獲得類的對象實例后就可以操作對象的方法和屬性了。以下是一個例子
          1packagereflection;
          2
          3importjava.lang.reflect.InvocationTargetException;
          4importjava.lang.reflect.Method;
          5
          6publicclassTestClass{
          7
          8publicintadd(inta,intb)
          9{
          10returna+b;
          11}
          12
          13publicStringecho(Stringstr)
          14{
          15returnstr;
          16}
          17
          18publicstaticvoidmain(String[]args)throwsException{
          19Class<?>classType=TestClass.class;//獲得Class
          20
          21ObjectTest=classType.newInstance();//通過classType獲得對象實例
          22
          23MethodaddMethod=classType.getMethod("add",newClass[]{int.class,int.class});//運行中獲得add方法
          24
          25Objectresult=addMethod.invoke(Test,newObject[]{1,2});//傳入參數調用add方法
          26
          27System.out.println((Integer)result);
          28
          29MethodechoMethod=classType.getMethod("echo",newClass[]{String.class});
          30
          31Objectresult2=echoMethod.invoke(Test,newObject[]{"http://www.cnblogs.com/zhi-hao/"});
          32
          33System.out.println(result2);
          34
          35}
          36
          37}
            運行結果:
            java學習中反射機制跟動態代理相關,動態代理也是java中的重要知識。

          posted @ 2014-09-12 09:56 順其自然EVO 閱讀(187) | 評論 (0)編輯 收藏

          關于線上與線下性能測試結果的差異

           有幾個學員經常會對線上與線下測試結果不一樣的問題產生糾結...所以還是統一寫一篇這樣的文章
            其實這個問題本身不用糾結,就好比再牛逼的雙胞胎還是有他們不一樣的地方。本身性能測試就是一個預估風險、排查瓶頸、了解系統現有性能的一個手段。就好比小時候你是個好孩子,但不意味這你長大了也是一個好孩子,也許你會像海波兄那樣的...so,性能測試只是一種手段,減小風險的方法而已。
            再者,本身線上和線下的測試結果就不太具有可比性,原因為:
            1、線下與線上機器環境配置的差異
            2、線下和線上業務數據的差異,雖然我們線下要最大可能的模擬用戶行為,但你不能拿保證100%的模擬啊,那么多用戶你都能兼顧到?
            3、線下和線上產生壓力時間的差異,線下是模擬高壓力大并發的情況,而線上通常壓力不大,大并發主要集中在某幾個特殊時段。
            說道這里,又會有童鞋繼續糾結了,那為毛還做測試啊,都不準確,做個毛毛?好吧,那我想反問你一句,一輛汽車開的人不同,開車的習慣不同,會對車造成不同程度的影響,既然我們沒法100%測試模擬,那我們干脆就產出汽車后直接賣給你好了,做個什么測試和路測,多tmd費勁。對吧?這時候你不干了,你說那多危險,萬一有大問題呢,不就要了我的命了嗎?呃...這時候你明白了?那換到性能測試中就不明白了?
            我們做性能測試的意義其實很簡單:
            1、預防、評估風險,如果有大問題可以早點發現,減小風險。這里理解極其簡單,你程序存在內存泄漏的問題,難道線下2g和線上4g這個內存差異就不會有內存泄漏了?這就好比,你不會騎永久牌自行車,難道給你換個小強牌(瞎編的...)自行車你就瞬間會騎了?
            2、前端性能測試。可以通過前端性能測試保證頁面性能,給用戶帶來較好的用戶體驗。
            3、單接口性能調優。主要目的是優化接口性能,排查接口性能問題,及應用內存隱患。
            比如,我們會準備幾種業務場景,比如全走DB和全走緩存,分別得到這幾種場景下,應用最佳處理能力情況下,在測試中排查是否存在性能提升的地方,及代碼問題導致的內存泄露等。
            4、容量評估。可以根據線上機器比例,線下模擬配比來估算。

          posted @ 2014-09-12 09:55 順其自然EVO 閱讀(210) | 評論 (0)編輯 收藏

          軟件測試面試題答案整理

            1、你的測試職業發展是什么?
            測試經驗越多,測試能力越高。所以我的職業發展是需要時間積累的,一步步向著高級測試工程師奔去。而且我也有初步的職業規劃,前3年積累測試經驗,按如何做好測試工程師的要點去要求自己,不斷更新自己改正自己,做好測試任務。
            2、你認為測試人員需要具備哪些素質
            做測試應該要有一定的協調能力,因為測試人員經常要與開發接觸處理一些問題,如果處理不好的話會引起一些沖突,這樣的話工作上就會不好做。還有測試人員要有一定的耐心,有的時候做測試很枯燥乏味。除了耐心,測試人員不能放過每一個可能的錯誤。
            3、你為什么能夠做測試這一行
            雖然我的測試技術還不是很成熟,但是我覺得我還是可以勝任軟件測試這個工作的,因為做軟件測試不僅是要求技術好,還有有一定的溝通能力,耐心、細心等外在因素。綜合起來看我認為我是勝任這個工作的。
            4、測試的目的是什么?
            測試的目的是找出軟件產品中的錯誤,是軟件盡可能的符合用戶的要求。當然軟件測試是不可能找出全部錯誤的。
            5、測試分為哪幾個階段?
            一般來說分為5個階段:單元測試、集成測試、確認測試、系統測試、驗收測試
            6、單元測試的測試對象、目的、測試依據、測試方法?
            測試對象是模塊內部的程序錯誤,目的是消除局部模塊邏輯和功能上的錯誤和缺陷。測試依據是模塊的詳細設計,測試方法是采用白盒測試
            7、怎樣看待加班問題
            加班的話我沒有太多意見,但是我還是覺得如果能夠合理安排時間的話,不會有太多時候加班的。
            8、結合你以前的學習和工作經驗,你認為如何做好測試。
            根據我以前的工作和學習經驗,我認為做好工作首先要有一個良好的溝通,只有溝通無障礙了,才會有好的協作,才會有更好的效率,再一個就是技術一定要過關,做測試要有足夠的耐心,和一個良好的工作習慣,不懂的就要問,實時與同事溝通這樣的話才能做好測試工作。
            9、你為什么選擇軟件測試行業
            因為之前了解軟件測試這個行業,覺得他的發展前景很好。
            10、根據你以前的工作或學習經驗描述一下軟件開發、測試過程,由哪些角色負責,你做什么
            要有架構師、開發經理、測試經理、程序員、測試員。我在里面主要是負責所分到的模塊執行測試用例
            11、根據你的經驗說說你對軟件測試/質量保證的理解
            軟件質量保證與測試是根據軟件開發階段的規格說明和程序的內部結構而精心設計的一批測試用例(即輸入數據和預期的輸出結果),并根據這些測試用例去運行程序,以發現錯誤的過程。它是對應用程序的各個方面進行測試以檢查其功能、語言有效性及其外觀排布。
            12、軟件測試的流程是什么?
            需求調查:全面了解系統概況、應用領域、軟件開發周期、軟件開發環境、開發組織、時間安排、功能需求、性能需求、質量需求及測試要求等。根據系統概況進行項目所需的人員、時間和工作量估計以及項目報價。
            制定初步的項目計劃。
            測試準備:組織測試團隊、培訓、建立測試和管理環境等。
            測試設計:按照測試要求進行每個測試項的測試設計,包括測試用例的設計和測試腳本的開發等。
            測試實施:按照測試計劃實施測試。
            測試評估:根據測試的結果,出具測試評估報告。
            13、你對SQA的職責和工作活動(如軟件度量)的理解?
            SQA就是獨立于軟件開發的項目組,通過對軟件開發過程的監控,來保證軟件的開發流程按照指定的CMM規程(如果有相應的CMM規程),對于不符合項及時提出建議和改進方案,必要時可以向高層經理匯報以求問題的解決。通過這樣的途徑來預防缺陷的引入,從而減少后期軟件的維護成本。SQA主要的工作活動包括制定SQA工作計劃,參與階段產物的評審,進行過程質量、功能配置及物理配置的審計等;對項目開發過程中產生的數據進行度量等等。
            14、說說你對軟件配置管理的理解
            項目在開發過程中要用相應的配置管理工具對配置項(包括各個階段的產物)進行變更控制,配置管理的使用取決于項目規模和復雜性及風險的水平。軟件的規模越大,配置管理就越顯得重要。還有在配置管理中,有一個很重要的概念,那就是基線,是在一定階段各個配置項的組合,一個基線就提供了一個正式的標準,隨后的工作便基于此標準,并只有經過授權后才能變更這個標準。配置管理工具主要有CC,VSS,CVS,SVN等,我只用過SVN,對其他的工具不是很熟悉。
            15、怎樣寫測試計劃和測試用例
            簡單點,測試計劃里應有詳細的測試策略和測試方法,合理詳盡的資源安排等,至于測試用例,那是依賴于需求(包括功能與非功能需求)是否細化到功能點,是否可測試等。
            16、說說主流的軟件工程思想(如CMM、CMMI、RUP,XP,PSP,TSP等)的大致情況及對他們的理解
            CMM:SW Capability Maturity Model軟件能力成熟度模型,其作用是軟件過程的改進、評估及軟件能力的評鑒。
            CMMI:Capability Maturity Model Integration能力成熟度模型集成 CMMI融入了大部分最新的軟件管理實踐,同時彌補了SW-CMM模型中的缺陷。
            RUP:rational unified process是軟件工程話過程。
            XP:extreme program,即極限編程的意思,適用于小型團隊的軟件開發,像上面第三個問題就可以結合原型法采用這樣的開發流程。要明白測試對于xp開發的重要性,強調測試(重點是單元測試)先行的理念。編程可以明顯提高代碼的質量,持續集成對于快速定位問題有好處。
            PSP,TSP分別是個體軟件過程和群體軟件過程。大家都知道,CMM只是告訴你做什么但并沒有告訴你如何做,所以PSP/TSP就是告訴你企業在實施CMM的過程中如何做,PSP強調建立個人技能(如何制定計劃、控制質量及如何與其他人相互協作等等)。而TSP著重于生產并交付高質量的軟件產品(如何有效的規劃和管理所面臨的項目開發任務等等)。總之,實施CMM,永遠不能真正做到能力成熟度的提升,只有將實施CMM與實施PSP和TSP有機結合起來,才能發揮最大的效力。因此,軟件過程框架應該是CMM/PSP/TSP的有機集成。
            17、你是怎樣保證軟件質量的,也就是說你覺得怎樣才能最大限度的保證軟件的質量?
            測試并不能夠最大限度的保證軟件的質量,軟件的高質量是開發和設計出來的,而不是測試出來的,它不僅要通過對軟件開發流程的監控,使得軟件開發的各個階段都要按照指定的規程進行,通過對各個階段產物的評審,QA對流程的監控,對功能及配置的審計來達到開發的最優化。當然測試也是保證軟件質量的一個重要方式,是軟件質量保證工程的一個重要組成部分。
            18、基于目前中國的國情,大多數公司的項目進度緊張、人員較少、需求文檔根本沒有或者很不規范,你認為在這種情況下怎樣保證軟件的質量?(大多數公司最想知道的就是在這種困難面前你該怎么保證軟件的質量,因為這些公司一般就是這種情況--既不想投入過多又想保證質量)
            出現以上的情況,如果僅僅想通過測試來提高軟件質量,那幾乎是不可能的,原因是沒有足夠的時間讓你去測試,少而不規范的文檔導致測試需求無法細化到足夠且有針對行的測試。所以,作為公司質量保證的因該和項目經理確定符合項目本身是和的軟件生命周期模型(比如RUP的建材,原型法),明確項目的開發流程并督促項目組按照此流程開展工作,所有項目組成員(項目經理更加重要)都要制定出合理的工作計劃,加強代碼的單元測試,在客戶既定的產品交付日期范圍內,進行產品的持續集成等等,如果時間允許可以再配合客戶進行必要的系統功能測試。
            19、一個測試工程師應該具備哪些素質和技能?
            1-掌握基本的測試基礎理論
            2-本著找出軟件存在的問題的態度進行測試,不要以挑刺的形象出現
            3-可熟練閱讀需求規格說明書等文檔
            4-以用戶的觀點看問題
            5-有強烈的質量意識
            6-細心和責任心
            7-良好的有效的溝通方式(與開發人員及客戶)
            8-具有以往的測試經驗能夠及時準確的判斷出高危險區在何處
            20、做好軟件測試的一些關鍵點
            1-測試人員必須經過測試基礎知識和理論的相關培訓
            2-測試人員必須熟悉系統功能和業務
            3-測試要有計劃,而且測試方案要和整個項目計劃協調好
            4-必須實現編寫測試用例,測試執行階段必須根據測試用例進行
            5-易用性,功能,分支,邊界,性能等功能行和非功能性需求都要進行測試
            6-對于復雜的流程一定要進行流程分支,組合條件分析,再進行等價類劃分準備相關測試數據
            7-測試設計的一個重要內容是要準備好具體的測試數據,清楚這個測試數據是測試那個場景或分支的。
            8-個人任務平均每三個測試用例至少應該發現一個BUG,否則只能說明測試用例質量不好
            9-除了每天構建的重復測試可以考慮測試自動化外,其他暫時都不要考慮去自動話
            21、軟件測試員自身素質培養
            1-首先,應對軟件測試感興趣和對自己有自信,如果具備了這兩點,那么在開發過程中不管遇到什么樣的困難,相信一定能克服
            2-善于懷疑,實際上沒有絕對正確的,總有錯誤的地方,具有叛逆心理,別人認為不可能發生的事情,我卻認為可能發生,別人認為是對的,我卻認為不是對的。
            3-打破沙鍋問到底的精神,對于只出現過一次的BUG一定要找出原因,不解決誓不罷休。
            4-保持一個良好的心情,否則可能無法把測試做好。不要把生活中的不愉快的情緒帶到工作中來。
            5-做測試時要細心,不是所有的BUG都能很容易找出,一定要細心才能找到這些BUG。
            6-靈活一些,聰明一點,多造一些容易產生BUG的例子。
            7-在有條件的情況下,多和客戶溝通,他們身上有你所需要的。
            8-設身處地為客戶著想,從他們的角度去測試系統。
            9-不要讓程序員,以“這種情況不可能發生”這句話說服你,相反,你應該去說服他,告訴他在客戶心理,并不是這樣的
            10-考慮問題要全面,結合客戶的需求,業務流程和系統的架構等多方面考慮問題。
            11-提出問題不要復雜化,這點和前面矛盾,如果你是一個新手,暫時不要管這點,因為最終將有你的小組成員討論解決。
            12-追求完美,對于新測試員來說,努力追求完美,這對你很好,盡管有些事情無法做到,但你應該嘗試。
            13-幽默感,能和開發小組很好的溝通是關鍵,試著給你的開發小組找一個BUG殺手,或對他們說“我簡直不敢相信,你寫的程序居然到現在沒有找到BUG”。
            22、為什要在一個團隊中開展測試工作?
            因為沒有經過測試的軟件很難在發布之前知道該軟件的質量,就好比ISO質量認證一樣,測試同樣也需要質量認證,這個時候就需要在團隊中開展軟件測試的工作。在測試的過程中發現軟件中存在的問題,及時讓開發人員得知并修改問題,在即將發布時,從測試報告中得出軟件的質量情況。
            23、你所熟悉的軟件測試類型有哪些?
            測試類型有:功能測試、性能測試、界面測試
            功能測試在測試工作中占有比例最大,功能測試也叫黑盒測試。
            性能測試是通過自動化的測試工具模擬多種正常、峰值以及異常負載條件來對系統的各項性能指標進行測試。負載測試和壓力測試都屬于性能測試,兩者可以結合進行。
            界面測試,界面是軟件與用戶交互的最直接的層,界面的好壞決定用戶對軟件的第一印象。
            區別在于,功能測試關注產品的所有功能,要考慮到每個細節功能,每個可能存在的功能問題。性能測試主要關注產品整體的多用戶并發下的穩定性和健壯性。界面測試則關注與用戶體驗相關內容,用戶使用該產品的時候是否已用,是否易懂,是否規范(用戶無意輸入無效的數據,當然考慮到體驗性,不能太粗魯的彈出警告)。做某個性能測試的時候,首先它可能是個功能點,首先要保證她的功能是沒有問題的,然后再考慮性能的問題。
            24、你認為做好測試用例設計工作的關鍵是什么
            白盒測試用例設計的關鍵是以較少的用例覆蓋盡可能多的內部程序邏輯結構。黑盒測試用例設計的關鍵同樣也是以較少的用例覆蓋模塊輸出和輸入接口。不可能做到完全測試,以最少的用例在合理的時間內發現最多的問題。軟件的黑盒測試意味著測試要在軟件的接口處進行,這種方法是把測試對象看作是一個黑盒子,測試人員完全不考慮程序內部的邏輯結構和內部特性,只依據程序的需求規格說明書,檢查程序的功能是否符合它的功能說明。因此黑盒測試又叫功能測試或者數據驅動測試。黑盒測試主要是為了發現以下幾類錯誤:、
            1-是否有不正確或遺漏的功能
            2-在接口上,輸入是否能正確的接受?能否輸出正確的結果。
            3-是否有數據結構錯誤或外部信息(例如數據文件)訪問錯誤
            4-性能上是否能夠滿足要求
            5-是否有初始化或終止性錯誤
            軟件的白盒測試是對軟件的過程性細節做細致的檢查。這種方法是把測試對象看作一個打開的盒子,它允許測試人員利用程序內部的邏輯結構和有關信息,設計或者選擇測試用例,對程序所有邏輯路徑進行測試。通過在不同點檢查程序狀態,確定實際狀態是否與預期的狀態一直。因此白盒測試又稱為結合測試或邏輯驅動測試。白盒測試主要是想對程序模塊進行如下檢查:
            1-對程序模塊的所有獨立的執行路徑至少測試一遍。
            2-對所有的邏輯判定,取“真”與取“假”的兩種情況都能至少測一遍。
            3-在循環的邊界和運行的界限內執行循環體。
            4-測試內部數據結構的有效性,等等。
            25、請詳細介紹一下各種測試類型的含義
            1-單元測試(模塊測試)是開發者編寫的一小段代碼,用于檢驗被測試代碼的一個很小的、很明確的功能是否正確。通常而言,一個單元測試是用于判斷某個特定條件(或者場景)下某個特定函數的行為。單元測試是由程序員自己來完成,最終受益的也是程序員自己。可以這么說,程序員有責任編寫功能代碼,同時也就有責任為自己的代碼編寫單元測試。執行單元測試,就是為了證明這段代碼的行為和我們期望的一致。
            2-集成測試(也叫組裝測試、聯合測試)是單元測試的邏輯擴展。它最簡單的形式是:兩個已經經過測試的單元組合成一個組件,并且測試它們之間的接口。從這一層上講,組件是指多個單元的集成聚合。在現實方案中,許多單元組合成組件,而這些組件又聚合成程序的更大部分。方法是測試片段的組合,并最終擴展進程,將您的模塊與其他組的模塊一起測試。最后,將構成進程的所有模塊一起測試。
            3-系統測試是將經過測試的子系統裝配成一個完整系統來測試。它是檢驗系統是否確實能提供系統方案說明書中制定功能的有效方法。(常見的聯調測試)。系統測試的目的是對最終軟件系統進行全面的測試,確保最終軟件系統滿足產品需求而遵循系統設計。
            4-驗收測試是部署軟件之前的最后一個測試操作。驗收測試的目的是確保軟件準備就緒,并且可以讓用戶將其執行軟件的既定功能和任務。驗收測試是向未來的用戶表明系統能夠像預訂要求那樣工作。經集成測試后,已經按照設計把所有的模塊組裝成一個完整的軟件系統,接口錯誤也已經基本排除了,接著就應該進一步驗證軟件的有效性,這就是驗收測試的任務,即軟件的功能和性能如同用戶所合理期待的那樣。
            26、測試計劃工作的目的是什么?測試計劃工作的內容都包括什么?其中哪些是最重要的?
            軟件測試計劃是知道測試過程的綱領性文件,包含了產品概述、測試策略、測試方法、測試區域、測試配置、測試周期、測試資源、測試交流、風險分析等內容。借助軟件測試計劃,參與測試的項目成員,尤其是測試管理人員,可以明確測試任務和測試方法,保持測試實施過程的順暢溝通,跟蹤和控制測試進度,應對測試過程中的各種變更。
            測試計劃和測試詳細規格、測試用例之間是戰略和戰術的關系,測試計劃主要從宏觀上規劃測試活動的范圍、方法和資源配置,而測試詳細規格、測試用例是完成測試任務的具體戰術。所以其中最重要的是測試策略和測試方法(最好能先評審)。
           27、您認為做好測試計劃工作的關鍵是什么?
            1-明確測試的目標,增強測試計劃的實用性
            編寫軟件測試計劃的重要目的就是使測試過程能夠發現更多的軟件缺陷,因此軟件測試計劃的價值取決于它對幫助管理測試項目,并且找出軟件潛在的缺陷。因此,軟件測試計劃中的測試范圍必須高度覆蓋功能需求,測試方法必須切實可行,測試工具并且具有較高的實用性,便于使用,生成的測試結果準確
            2-堅持“5W”規則,明確內容與過程
            “5W”規則指的是“WHAT(做什么)”、“WHY(為什么做)”、"WHEN(何時做)"、"WHERE(在哪里)"、"HOW(如何做)"。利用“5W"規則創建軟件測試計劃,可以幫助測試團隊理解測試的目的(WHY),明確測試的范圍和內容(WHAT),確定測試的開始和結束日期(WHEN),指出測試的方法和工具(HOW),給出測試文檔和軟件存放的位置(WHERE)。
            3-采用評審和更新機制,保證測試計劃滿足實際需求
            測試計劃完成后,如果沒有經過評審,直接發送給測試團隊,測試計劃內容的可能不準確或遺漏測試內容,或者軟件需求變更引起測試范圍的增減,而測試計劃的內容沒有及時更新,誤導測試執行人員。
            4-分別創建測試計劃與測試詳細規格、測試用例
            應把詳細的測試技術指標包含到獨立創建的測試詳細規格文檔,把用于指導測試小組執行過程的測試用例放到獨立創建的測試用例文檔或測試用例管理數據庫中。測試計劃和測試詳細規格、測試用例之間是戰略和戰術的關系,測試計劃主要從宏觀上規劃測試活動的范圍、方法和資源配置,而測試詳細規格、測試用例是完成測試任務的具體戰術。
            28、當開發人員說不是BUG時,你如何應付?
            開發人員說不是BUG,有2種情況,一是需求沒有確定,所以我可以這么做,這個時候可以找來產品經理進行確認,需不需要改動。3方商量確定好后再看要不要改。二是這種情況不可能發生,所以不需要修改,這個時候,我可以先盡可能的說出是BUG的一句是什么?如果被用戶發現或出了問題,會有什么不良結果?程序員可能會給你很多理由,你可以對他的解釋進行反駁。如果還是不行,那我可以給這個問題提出來,跟開發經理和測試經理進行確認,如果要修改就改,如果不要修改就不改。其實有些真的不是BUG,我也只是建議的方式寫進測試文檔中,如果開發人員不修改也沒有大問題。如果不是BUG的話,一定要堅持自己的立場,讓問題得到最后的確認。
            29、你自認為測試的優勢在哪里?
            優勢在于我對測試堅定不移的信心和熱情,雖然經驗還不足,但測試需要的基本技能我有信心在工作中得以發揮。
            30、什么是系統瓶頸?
            瓶頸主要是指整個軟硬件構成的軟件系統某一方面或者幾個方面能力不能滿足用戶的特定業務要求,“特定”是指瓶頸會在某些條件下會出現,因為畢竟大多數系統在投入前。
            嚴格的從技術角度講,所有的系統都會有瓶頸,因為大多數系統的資源配置不是協調的,例如CPU使用率剛好達到100%時,內存也正好耗盡的系統不是很多見。因此我們討論系統瓶頸要從應用的角度討論:關鍵是看系統能否滿足用戶需求。在用戶極限使用系統的情況下,系統的響應仍然正常,我們可以認為改系統沒有瓶頸或者瓶頸不會影響用戶工作。
            因此我們測試系統瓶頸主要是實現下面兩個目的:
            -發現“表面”的瓶頸。主要是模擬用戶的操作,找出用戶極限使用系統時的瓶頸,然后解決瓶頸,這是性能測試的基本目標。
            -發現潛在的瓶頸并解決,保證系統的長期穩定性。主要是考慮用戶在將來擴展系統或者業務發生變化時,系統能夠適應變化。滿足用戶目前需求的系統不是最好的,我們設計系統的目標是在保證系統整個軟件生命周期能夠不斷適應用戶的變化,或者通過簡單擴展系統就可以適應新的變化。
            31、文檔測試主要包含什么內容?
            在國內軟件開發管理中,文檔管理幾乎是最弱的一項,因而在測試工作中特別容易忽略文檔測試也就不足為奇了。要想給用戶提供完整的產品,文檔測試是必不可少的。文檔測試一般注重下面幾個方面:
            文檔的完整性:主要是測試文檔內容的全面性與完整性,從總體上把握文檔的質量。例如用戶手冊應該包括軟件的所有功能模塊。
            描述與軟件實際情況的一致性:主要測試軟件文檔與軟件實際的一致程度。例如用戶手冊基本完整后,我們還要注意用戶手冊與實際功能描述是否一致。因為文檔往往跟不上軟件版本的更新速度。
            易理解性:主要是檢查文檔對關鍵、重要的操作有無圖文說明,文字、圖表是否易于理解。對于關鍵、重要的操作僅僅只有文字說明肯定是不夠的,應該附有圖表使說明更為直觀和明了。
            文檔中提供操作的實例:這項檢查內容主要針對用戶手冊。對主要功能和關鍵操作提供的應用實例是否豐富,提供的實例描述是否詳細。只有簡單的圖文說明,而無實例的用戶手冊看起來就像是軟件界面的簡單拷貝,對于用戶來說,實際上沒有什么幫助。
            印刷與包裝質量:主要是檢查軟件文檔的商品化程度。有些用戶手冊是簡單打印、裝訂而成,過于粗糙,不易于用戶保存。優秀的文檔例如用戶手冊和技術白皮書,應提供商品化包裝,并且印刷精美。
            32、功能測試用例需要詳細到什么程度才是合格的?
            這個問題也是測試工程師經常問的問題。有人主張測試用例詳細到每個步驟執行什么都要寫出來,目的是即使一個不了解系統的新手都可以按照測試用例來執行工作。主張這類寫法的人還可以舉出例子:歐美、日本等軟件外包文檔都是這樣做的。
            另外一種觀點就是主張寫的粗些,類似于編寫測試大綱。主張這種觀點的人是因為軟件開發需求管理不規范,變動十分頻繁,因而不能按照歐美的高標準來編寫測試用例。這樣的測試用例容易維護,可以讓測試執行人員有更大的發揮空間。
            實際上,軟件測試用例的詳細程度首先要以覆蓋到測試點為基本要求。舉個例子:“用戶登陸系統”的測試用例可以不寫出具體的執行數據,但是至少要寫出五種以上情況(),如果只用一句話覆蓋了這個功能是不合格的測試用例。覆蓋功能點不是指列出功能點,而是要寫出功能點的各個方面(如果組合情況較多時可以采用等價劃分)。
            另一個影響測試用例的就是組織的開發能力和測試對象特點。如果開發力量比較落后,編寫較詳細的測試用例是不現實的,因為根本沒有那么大的資源投入,當然這種情況很隨著團隊的發展而逐漸有所改善。測試對象特點重點是指測試對象在進度、成本等方面的要求,如果進度較緊張的情況下,是根本沒有時間寫出高質量的測試用例的,甚至有些時候測試工作只是一種輔助工作,因而不編寫測試用例。
            因此,測試用例的編寫要根據測試對象特點、團隊的執行能力等各個方面綜合起來決定編寫策略。最后要注意的是測試人員一定不能抱怨,力爭在不斷提高測試用例編寫水平的同時,不斷地提高自身能力。
            33、配置和兼容性測試的區別是什么?
            配置測試的目的是保證軟件在其相關的硬件上能夠正常運行,而兼容性測試主要是測試軟件能否與不同的軟件正確協作。
            配置測試的核心內容就是使用各種硬件來測試軟件的運行情況,一般包括:
            (1)軟件在不同的主機上的運行情況,例如Dell和Apple;
            (2)軟件在不同的組件上的運行情況,例如開發的撥號程序要測試在不同廠商生產的Modem上的運行情況;
            (3)不同的外設;
            (4)不同的接口;
            (5)不同的可選項,例如不同的內存大小;
            兼容性測試的核心內容:
            (1)測試軟件是否能在不同的操作系統平臺上兼容;
            (2)測試軟件是否能在同一操作系統平臺的不同版本上兼容;
            (3)軟件本身能否向前或者向后兼容;
            (4)測試軟件能否與其它相關的軟件兼容;
            (5)數據兼容性測試,主要是指數據能否共享;
            配置和兼容性測試通稱對開發系統類軟件比較重要,例如驅動程序、操作系統、數據庫管理系統等。具體進行時仍然按照測試用例來執行。
            34、軟件文檔測試主要包含什么?
            隨著軟件文檔系統日益龐大,文檔測試已經成為軟件測試的重要內容。文檔測試對象主要如下:
            -包裝文字和圖形;
            -市場宣傳材料、廣告以及其它插頁;
            -授權、注冊登記表;
            -最終用戶許可協議;
            -安裝和設置向導;
            -用戶手冊;
            -聯機幫助;
            -樣例、示范例子和模板;
            -……
            文檔測試的目的是提高易用性和可靠性,降低支持費用,因為用戶通過文檔就可以自己解決問題。因文檔測試的檢查內容主要如下:
            -讀者對象——主要是文檔的內容是否能讓該級別的讀者理解;
            -術語——主要是檢查術語是否適合讀者;
            -內容和主題——檢查主題是否合適、是否丟失、格式是否規范等;
            -圖標和屏幕抓圖——檢查圖表的準確度和精確度;
            -樣例和示例——是否與軟件功能一致;
            -拼寫和語法;
            -文檔的關聯性——是否與其它相關文檔的內容一致,例如與廣告信息是否一致;
            文檔測試是相當重要的一項測試工作,不但要給予充分的重視,更要要認真的完成,象做功能測試一樣來對待文檔測試。
            35、沒有產品說明書和需求文檔地情況下能夠進行黑盒測試嗎?
            這個問題是國內測試工程師經常遇到的問題,根源就是國內軟件開發文檔管理不規范,對變更的管理方法就更不合理了。實際上沒有任何文檔的時候,測試人員是能夠進行黑盒測試的,這種測試方式我們可以稱之為探索測試,具體做法就是測試工程師根據自己的專業技能、領域知識等不斷的深入了解測試對象、理解軟件功能,進而發現缺陷。
            在這種做法基本上把軟件當成了產品說明書,測試過程中要和開發人員不斷的進行交流。尤其在作項目的時候,進度壓力比較大,可以作為加急測試方案。最大的風險是不知道有些特性是否被遺漏。
            36、測試中的“殺蟲劑怪事”是指什么?
            “殺蟲劑怪事”一詞由BorisBeizer在其編著的《軟件測試技術》第二版中提出。用于描述測試人員對同一測試對象進行的測試次數越多,發現的缺陷就會越來越少的現象。就像老用一種農藥,害蟲就會有免疫力,農藥發揮不了效力。這種現象的根本原因就是測試人員對測試軟件過于熟悉,形成思維定勢。
            為了克服這種現象,測試人員需要不斷編寫新的測試程序或者測試用例,對程序的不同部分進行測試,以發現更多的缺陷。也可以引用新人來測試軟件,剛剛進來的新手往往能發現一些意想不到的問題。
            37、在配置測試中,如何判斷發現的缺陷是普通問題還是特定的配置問題?
            在進行配置測試時,測試工程師仍然會發現一些普通的缺陷,也就是與配置環境無關的缺陷。因此判斷新發現的問題,需要在不同的配置中重新執行發現軟件缺陷的步驟,如果軟件缺陷不出現了,就可能是配置缺陷;如果在所有的配置中都出現,就可能是普通缺陷。
            需要注意的是,配置問題可以在一大類配置中出現。例如,撥號程序可能在所有的外置Modem中都存在問題,而內置的Modem不會有任何問題。
            38、為什么盡量不要讓時間有富裕的員工去做一些測試?
            表面上看這體現了管理的效率和靈活性,但實際上也體現了管理者對測試的輕視。測試和測試的人有很大關系。測試工作人員應該是勤奮并富有耐心,善于學習、思考和發現問題,細心有條理,總結問題,如果具備這樣的優點,做其它工作同樣也會很出色,因此這里還有一個要求,就是要喜歡測試這項工作。如果他是專職的,那么肯定更有經驗和信心。國內的小伙子好象都喜歡做程序員,兩者工作性質不同,待遇不同,地位不同,對自我實現的價值的認識也不同,這是行業的一個需要改善的問題。如果只是為了完成任務而完成任務,或者發現了幾個問題就覺得滿意了,這在任何其它工作中都是不行的。
            39、完全測試程序是可能的嗎?
            軟件測試初學者可能認為拿到軟件后需要進行完全測試,找到全部的軟件缺陷,使軟件“零缺陷”發布。實際上完全測試是不可能的。主要有以下一個原因:
            -完全測試比較耗時,時間上不允許;
            -完全測試通常意味著較多資源投入,這在現實中往往是行不通的;
            -輸入量太大,不能一一進行測試;
            -輸出結果太多,只能分類進行驗證;
            -軟件實現途徑太多;
            -軟件產品說明書沒有客觀標準,從不同的角度看,軟件缺陷的標準不同;
            因此測試的程度要根據實際情況確定。
            40、軟件測試的風險主要體現在哪里?
            我們沒有對軟件進行完全測試,實際就是選擇了風險,因為缺陷極有可能存在沒有進行測試的部分。舉個例子,程序員為了方便,在調試程序時會彈出一些提示信息框,而這些提示只在某種條件下會彈出,碰巧程序發布前這些代碼中的一些沒有被注釋掉。在測試時測試工程師又沒有對其進行測試。如果客戶碰到它,這將是代價昂貴的缺陷,因為交付后才被客戶發現。
            因此,我們要盡可能的選擇最合適的測試量,把風險降低到最小。

          posted @ 2014-09-12 09:48 順其自然EVO 閱讀(810) | 評論 (0)編輯 收藏

          僅列出標題
          共394頁: First 上一頁 48 49 50 51 52 53 54 55 56 下一頁 Last 
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 上栗县| 新安县| 霍州市| 花莲市| 黄梅县| 井冈山市| 锦屏县| 枝江市| 崇信县| 怀来县| 海口市| 宁蒗| 鹤岗市| 古丈县| 乐都县| 新余市| 仙桃市| 那坡县| 清涧县| 永昌县| 马公市| 塘沽区| 滦南县| 长白| 宽城| 黎平县| 诏安县| 新化县| 灵璧县| 邢台县| 罗城| 龙州县| 满城县| 海原县| 唐河县| 高碑店市| 孝感市| 黔西| 禹州市| 吴堡县| 佛学|