簡評三十五

白箱測試與黑箱測試(下)

  • Black box testing technique
    • 等價劃分(equivalence partitioning)
      • 每一類input㨂一個test case
    • 邊界值分析(boundary value analysis)
    • 狀態機測試(state-based testing)
    • 劇本測試 (scenario-based testing)
      • 依據Use Case或是story來測試功能是否正常

會不會太難?

  • 金句
    1. 首先,你沒有規則
    2. 接著,你學到一個規則並將它套用在所有地方
    3. 然後,你學會很多規則,這些規則經常彼此衝突,一不小心便在不對的情境中套用不合適的規則
    4. 慢慢地,時間讓你知道套用規則之間的取捨因素,經過刻意觀察與思考你具備感知force的能力
    5. 最後,你從情境(context)中直接發現答案,你已不需思考規則便可做出決策

Story與Task的估算單位為什麼不同?

  • 估算story(需求)要採用story point這種沒有單位的「相對大小」估算方法,而估算task(工作)卻是用小時為單位?
    • 用「相對大小」來估算唔同需求,因為人類對於估算相對數據比估算絕對數據來的擅長
    • 用實際時間估計估算到達「目的地」所需時間

為什麼要培養多才多藝的員工:簡單分析篇

  • 專業分工係「局部最佳化」
    • 工作調度彈性 -> 減低團隊合作 & 工作怠倦 -> 長遠減低生產力
  • 「多才多藝」不是說每個人都一樣,沒有專業可言
    • 而是團隊成員在某項(或某幾項)技能具備熟稔的專業能力之後,也不要排斥接觸新的技能,把握擴展自己專業領域的機會

除錯的態度

  • Pair debugging steps
    • Driver
      • 說明錯誤訊息與錯誤現況
        • 如果可以揾出reproduce嘅方法更好
      • 解釋可能出錯的程式邏輯
        • 系統架構(模組與模組之間的互動關係)或是一起看一下某段程式碼的內容。
      • 如有測試案例,跑一下
      • 請對方猜測可能發生錯誤的原因
    • Navigator
      • 問問題:
        • 這個API這樣子使用對嗎?它的傳回值是什麼意思?如果是null會怎樣?
        • 這個物件是由誰來負責初始化的?會不會根本就初始化失敗但是卻沒人發現?
        • 如果網路斷線,這段程式可以立刻知道嗎?還是會卡在這個method上面?
  • 如果心中有任何疑惑,千萬不要用「猜的」,或是「抱持著在公堂之上大膽假設一下應該不犯法」的這種想法
    • Don’t Assume It * Prove It

Pair Programming 沒人性?

  • 咩時候適合用Pair programming
    • 重要新功能的 coding 工作
      • 如果系統的架構與設計已經有了大致的想法
      • 否則最好討論一下design
    • Big refactoring
    • 帶新人
    • 知識傳遞
    • Debug
    • 寫測試案例
    • Big Refactoring
  • 唔洗100%行pair programming

敏捷開發與軟體架構

  • 「軟體架構逐步成長」作法
    • 要同時採取 top-down 同 bottom-up 嘅設計
      • top-down
        • 分析架構是否可以滿足quality attribute requirements
      • bottom-up
        • 分析實作面以及環境相關的限制
          • 有哪些現成的軟體元件、框架、或技術可以使用,取捨的依據是什麼
    • 當專案開始時,要能夠快速地建立 prototype
      • 驗證軟體架構的概念
      • 然後依據使用者的需求優先順序,按步就班實作與修正架構
    • 當新需求出現,或是團隊成員對於問題領域有更深入的了解之後,調整現有架構,並且重構設計
      • 需要自動化測試與持續整合的幫忙
    • 隨著專案演進,持續地實驗與評估軟體架構是否合用

軟體架構也可逐步成長

  • 要達到讓軟體架構變軟,從高到低有以下幾個層次
    • 了解architecture pattern
      • 「整體先於部分」
        • 在開發初期,雖然需求尚未清楚的釐清,實作也還沒開始,但是軟體架構類型還是可以事先挑選。
          • 例如,MVC、Client-Server、Plug-in、Layered等等
        • 至於架構中的「肉」,可以隨著開發而逐漸長出
          • 例如應用程式需要用到persistence的需求,可以先用一個簡單的O-R mapping的方式來處理,後端可能只用簡單可以支援儲存(key,value)的資料庫
          • 等到發現效能無法滿足時,再來考慮要如何提升效能。
          • 如果效能不是一個問題,這樣的架構也就不需要修改
      • 雖然說「Do not pre-architecture too mush」,但是像這種大範圍架構還是需要先選擇與決定會比較好一點
    • 了解design pattern
      • architecture pattern只是一個殼,真正要把肉長出來,還是需要範圍比較小的design pattern
      • 有人稱design pattern為micro-architecture(微架構)
        • 對於一些規模比較小的軟體,甚至只要直接套用design pattern便可解決設計上的問題
      • 往上可以串接軟體架構,往下則是累積了許多優良的物件導向設計經驗,所以算是一個很好的學習設計與架構入門點。
    • 了解物件導向設計觀念
      • 有了正確的物件導向設計觀念,先可以明白 architecture 同 design pattern 點解咁樣設計
    • 至少熟悉一種程式語言

老問題:Story 做不完怎麼辦?

  • 處理 Story 做不完嘅兩個做法
    • 把 story 移到下個 sprint 繼續做
    • 把 story 範圍切小一點,在這個 story 中 demo 已經完成的部份。
      • 好像只是在玩『文字遊戲』,但是這其中的差別其實是很重大
        • 每個 sprint 結束都完成一個潛在可發布的軟體
        • 如果有人宣稱 story 做完了但是 sprint 結束之後卻『無法交貨』,那麼這種說法就是很有問題的

開發與測試:在或不在 sprint 中

  • 如何處理在 sprint 中會不會無法完成測試
    • Programmer test
      • 有 CD, unit tests 就唔應該發生
    • QA test
      • 冇 QA team
        • 可以由 product owner 兼做驗收測試,一完成其個 story,就馬上可以測試
      • 有 QA team,兩種做法
        • QA team 測試 developers 這個 sprint 所完成的 stories
          • Dev implement 嘅時候, QA 就開始設計 test cases
          • 需要 QA 同 Dev 協調得好
          • 時間比較緊張
        • QA team 測試 developers 上一個 sprint 所完成的 stories
          • 時間感覺上比較充裕
          • 但如果 Dev 仲改緊個 feature,可能下個 sprint 又要重測
  • 兩個 QA 重點
    • QA 要有能力設計測試案測
      • 唔係只識跟 Dev 指示去 test,做「人肉 Test Robot」
      • QA 要參與 development
    • 可以 automate 嘅 test 就盡量 automate