西安軟件測試培訓
達內西安省體中心

400-876-5661

熱門課程

為什么要給軟件做測試?如何測試呢?

  • 時間:2017-10-16 18:00
  • 發布:伯樂在線
  • 來源:伯樂在線

你為什么應該測試你的軟件?你應該如何測試軟件?有些人對這些問題有非常簡單的回答。

及時享樂型的程序員根本懶得去測試,快樂地活在當下。更嚴肅的程序員會告訴你軟件測試是為了開發出高質量的產品。為了可以開發出高質量的產品,必須始終編寫單元測試和集成測試,并做 QA 測試。忽略這些,你的代碼將會掉入 bug 為患的深淵。

盡管我更贊同第二種觀點,但我認為這不是一個完美的答案??紤]到不同的軟件項目的差異,一套答案似乎不可能適合每個人。

  • 移動游戲、醫療設備和在線商店三者各不相同。

  • 每個組織也不盡同的,初創公司和大型跨國企業所擁有的資源是無法相提并論的,和 NASA 也是完全不一樣的。

  • 每個項目都會經歷不同的階段,沒有用戶的產品和有成千上萬交易的產品有非常不同的地位

你需要的不僅僅是一個答案,而是如何去選擇適合你情況和需要的答案。我們首先會考慮適合你的測試方法。然后我們會考慮為什么要測試你的軟件。最后,我們將結合方法和目標,來看一下你可以選擇什么方式去測試你的軟件。

你可以用什么樣的測試方法?

首先,我們考慮下可以使用的不同測試方法。下面的代碼是測試嗎?

def test_add():

    assert add(2, 2) == 5

我會說,是的,那就是一個測試。從函數名上可以看出來。這個測試證明了函數add() 做了什么:對兩個數字做加法,然后將結果返回給我們。

你一定注意到了,這個測試是錯誤的。幸運的是,我們的開發過程有另一步驟:代碼審查。親愛的讀者,你可以作為一個代碼審查者并告訴我,我的代碼是錯誤的,2加2是4,不是5。

代碼審查是一種測試方法嗎?如果你試圖驗證你的代碼符合規范,那么這就是一種測試。你大腦中有算術規范(”2 + 2 = 4″),你就會檢查你的代碼是否符合這個規范。

讓我們把代碼審查和自動化單元測試都做分別作為一種測試方法。盡管他們都是測試,他們也非常不同。他們之間的主要區別是什么?

測試的一種方法是自動化的,另一種是由人類完成的。

自動化測試是連續的和可重復的,你可以這么寫:

def test_add_twice():

    for i in range(10000000):

        assert add(i, i) == 2 * i

計算機將會每次運行完全相同的代碼,該代碼將會確保函數 add() 對于這些特定的輸入返回特定的輸出。人在手動驗證一千萬種不同的計算時會遇到一些困難:無聊、分心、錯誤、遲緩。

另一方面,人類在閱讀這個代碼時,會告訴你這是bug:

def add(a, b):

    return a + b + 1

計算機所做的事情,無論是好是壞,人類都能明白他的意義。只有人類才知道軟件的意義是什么。

現在我們可以按照使用的方法來對測試進行分類:人類測試意義,自動化測試確保一致性。

你為什么要測試軟件?

接下來,讓我們考慮測試目標。

測試軟件的第一個可能的目標就是確保它符合規范。這個目標是大多數程序員在討論測試時想到的:它涵蓋了單元測試和手工測試,它也包括代碼審查。你的軟件具有某些必須的功能、規范,你想確保它在現在和未來也確實是這樣的。

一些需求是高層次的:一個在線商店想要顧客可以訂購他們添加到購物車的產品。其他需求是低層次的實現細節,只有程序員感興趣。你可能想要函數 verify_creditcard() 接收信用卡號碼作為字符串,然后如果信用卡是無效的,拋出一個 InvalidCreditCard 異常。

所有的這些需求都是規范,他可以被寫的非常詳細,也可以是頭腦中的一個概念(如 2 + 2 等于 4 )。無論如何,你測試你的軟件是為了確保它做了它應該做的事。

然而,有時測試也可以有不同的目標。在 Eric Ries 的書《精益創業》中, 他提到編寫軟件后卻發現沒有人真正想用它的問題。如果沒有人使用你的軟件,花費了大量的時間去測試,確保你的軟件滿足規范就是浪費時間。

Ries 認為你首先應該搞清楚一個產品是否會成功,通過測試他稱為的“最低可行產品”是否擁有潛在的用戶和客戶。這是一個與眾不同的測試形式:它不是驗證你的軟件是否滿足規范,而是學習你以前不知道的東西。

軟件測試第二個可能的目標就是為了獲得知識。讓我隨著這個目標看一下另一種測試形式?!癆/B測試”就是你使用兩個變量,然后看哪個變量產生更好的結果?;蛟S你正在測試重新設計的網站:你給 90% 的訪客展現你目前的設計,10% 的訪客展現你的新設計,然后看哪種會讓你的產品有更多的用戶注冊。

注意,你有兩套規范,并且已經實現了他們。測試的要點就是找到哪種規范更好,學習一些新的東西,而不是驗證實現是否符合規范。

現在我們已經知道為什么你需要做測試:要么驗證你的實現符合規范,要么獲得新的知識。

你應該如何測試軟件?

結合我們提出的那兩個目標(獲得新知識和滿足規范)和兩種測試方法(手工測試和自動化測試),你會得到四種不同的測試形式,每種都會有更詳細的測試目標。

對于你特定的需求和情況,你必須選擇一種合適的測試方式。讓我們逐個介紹這四種測試類型,看看每種測試類型應該在什么情況下使用。

理解用戶

  • 用戶會購買你的產品嗎?

  • 一個設計的改變會帶來有更多的注冊嗎?

  • 用戶會理解你的軟件是如何工作的嗎?

這些問題都無法通過對比你的軟件是否滿足規范來得到回答。相反,你需要經驗知識:你需要觀察當你的軟件展現給用戶時,用戶真正做了什么操作。

相關的測試技術包括:

  • 可用性測試

  • 最低可行產品測試(《精益創業》)

  • A/B測試

理解運行時行為

  • 你的軟件在負載下的表現如何?

  • 你的軟件有資源競爭嗎?

  • 當有非法輸入時,你的軟件是否會崩潰?

這些問題不能總是通過比較你的軟件是否符合規范來回答。一旦你的軟件足夠復雜,你無法完全理解或者預測它的回應。你需要觀察它的實際運行來理解其行為。

相關的測試技術包括:

  • 壓力測試和浸泡測試

  • 從產品日志中收集異常及跟蹤信息

功能的正確性

  • 你的軟件是否真正符合規范?

  • 你的軟件是否做了它應該做的事?

很容易可以看到,自動化測試可以證明這些,但是請記住檢查2+2等于5的單元測試。在更基本的層面上,軟件可以在技術上滿足規范,但是不能達到規范的目標。只有我們理解規范背后的含義,然后才能確定軟件是否達到了目標。

相關的測試技術包括:

  • 手動用戶界面測試(如:QA人員使用您的網站)

  • 代碼審查

功能的穩定性

  • 對于同樣的輸入,你的公開接口(API)是否總能返回相同的結果?

  • 你的代碼是否提供了它應該提供的保證?

人類很不擅長測試這些情況。人類非常容易忽略小的變化:如果一個按鈕從“Send Now”改變為“Send now”,你可能根本就不會注意到。相反,如果你的接口從sendNow() 變為 send_now(),或者返回值的類型有輕微變化,你的軟件就會崩潰。

這意味著一個公開接口,尤其是其他軟件依賴的接口,為了保證正確性必須要穩定。當你不斷更新你的測試時,為改變頻繁的私有接口或者代碼編寫自動化測試,將會導致非常高的維護成本

相關的測試技術包括:

  • 單元測試、集成測試和其他類似的自動化接口測試

  • 自動化用戶界面測試(如:網站的Selenium測試)

  • 編譯器檢查和靜態檢查

模型的應用

那么這一切有什么好處呢?

選擇如何去測試

首先,我們最初的目標:基于你的目標,這個模型可以幫助選擇測試形式。

考慮一個新建立的產品,不確定什么樣的人愿意使用這個產品。自動化測試的重點在于確保代碼符合規范,因此在搞清楚用戶真正的需求之前,編寫自動化測試用例可能是浪費時間。

精益創業(Lean Startup)是一種可行的替代方法,它的目標是找到什么樣的產品可以滿足用戶的需求,它側重于實驗或者嘗試。這意味著專注理解用戶這個象限。一旦選定了產品,你就可以花費時間在確認“最低可行性”之外的地方,比如投入更多的資源保證軟件功能的正確性和穩定性。

辨別你是否選擇了錯誤的測試類型

第二,當你選擇了錯誤的測試類型時,這個模型可以幫你改變航向。比如假設編寫稅收軟件(細節源自一個真實案例),他們為他們的web界面編寫了Selenium測試,與此同時他們的web界面做了重大的改變。

即使做了測試,他們的程序依然是有bug的,每次改變界面這些測試用例就不能使用了。測試似乎沒有提升質量,但是它浪費了開發者的時間進行維護。他們做錯了什么?

這個問題就是他們的系統實際上有兩部分:

  1. 稅收引擎相當穩定,稅法每年只改變一次。對于用戶來說稅收引擎中的錯誤是一個主要問題,對于開發者來說不兼容的接口改變是一個問題。這表明需要穩定的功能測試,比如針對稅收計算引擎的單元測試。正確的功能可以通過代碼審和查稅務會計的反饋來保證。

  2. 基于web的用戶界面。UI界面頻繁的變更,這表明穩定的功能測試現在還不是目標?,F在的目標是功能的正確性,所以UI界面應該進行手工測試(比如:當程序員寫代碼時進行測試)

討論測試的基礎

最后,這個模型提供了一個共享的術語,這個術語可以幫助你在廣泛的意義和不同的目標下討論測試。

  • 可以不必再對手工測試和單元測試哪個更好進行無休止的爭論,從這個模型中可以非常清楚的展示出他們之間的差異。

  • 你還可以與公司的其他部門(如市場營銷)討論測試,這會是一個非常不同的測試視角。

總結

你為什么要測試你的軟件?要么獲得知識,要么滿足規范。

你測試軟件的方法有哪些?手工測試或者自動化測試。

你應該如何測試你的軟件?根據你特定的情況,選擇相關的測試形式,如理解用戶、理解運行時行為、功能的穩定性、功能的一致性。

上一篇:我是如何自學軟件測試的
下一篇:西安軟件測試培訓哪家好

西安軟件測試培訓機構排名

西安軟件測試培訓哪家好

為什么要給軟件做測試?如何測試呢?

我是如何自學軟件測試的

選擇城市和中心
江西省

貴州省

廣西省

海南省

中国laurenphilips