在這一章里,我將介紹測試的基礎(chǔ)知識蝉揍,以及如何用 Python 網(wǎng)絡(luò)爬蟲測試各種簡單或復(fù)雜的網(wǎng)站。
13.1 測試簡介
運(yùn)行一套測試方法能夠保證你的代碼按照既定的目標(biāo)運(yùn)行,不僅可以節(jié)約你的時間泰偿,減少你對 bug 的憂 慮,還可以讓新版本升級變得更加簡單蜈垮。
什么是單元測試
一個單元測試通常包含以下特點(diǎn)耗跛。
? 每個單元測試用于測試一個零件(component)功能的一個方面。
通常窃款,一個零件的所有單元測試都集成在同一個類(class)里课兄。
? 每個單元測試都可以完全獨(dú)立地運(yùn)行,一個單元測試需要的所有啟動(setup)和卸載 (teardown)都必須通過這個單元測試本身去處理晨继。單元測試不能對其他測試造成干擾烟阐,而且不論按何種順序排列,它們都必須能夠正常地運(yùn)行紊扬。
? 每個單元測試通常至少包含一個斷言(assertion)蜒茄。
? 單元測試與生產(chǎn)代碼是分離的。雖然它們需要導(dǎo)入然后在待測試的代碼中使用餐屎,但是它們一般被保留在獨(dú)立的類和目錄中檀葛。
13.2 Python 單元測試
Python 的單元測試模塊 unittest,所有標(biāo)準(zhǔn)版 Python 安裝后都有腹缩。只要先導(dǎo)入模塊然后
繼承 unittest.TestCase 類屿聋,就可以實現(xiàn)下面的功能:
? 為每個單元測試的開始和結(jié)束提供 setUp 和 tearDown 函數(shù)
? 提供不同類型的“斷言”語句讓測試成功或失敗
? 把所有以 test_ 開頭的函數(shù)當(dāng)作單元測試運(yùn)行空扎,忽略不帶 test_ 的函數(shù)
需要注意的是,這兩個函數(shù)在每個測試的開始和結(jié)束都會運(yùn)行一次润讥,而不是把類中所有測 試作為一個整體在開始或結(jié)束時各運(yùn)行一次转锈。
13.3 Selenium 單元測試
Selenium,它是一個可以解決網(wǎng)站上各種復(fù)雜問題的優(yōu)秀測試框架;其實楚殿,它的初衷就是用來做網(wǎng)站測試
1. 鼠標(biāo)拖放動作
單擊按鈕和輸入文字只是 Selenium 的一個功能撮慨,其真正的亮點(diǎn)是能夠處理更加復(fù)雜的網(wǎng)絡(luò) 表單交互行為。Selenium 可以輕松地完成鼠標(biāo)拖放動作(drag-and-drop)脆粥。
很多驗證碼里使用拖放動作證明訪問者不是一個機(jī)器 人砌溺,這是一種常用手段。
2. 截屏
除了普通的測試功能变隔,Selenium 還有一個有趣的技巧可以讓你的測試更容易(或者讓你老 板更喜歡):截屏规伐。截屏可以在單元測試中創(chuàng)建,不需要點(diǎn)擊截屏按鈕就可以獲取
13.4 Python 單元測試與 Selenium 單元測試的選擇
Python 的單元測試語法嚴(yán)謹(jǐn)冗長弟胀,更適合為大多數(shù)大型項目寫測試萍鲸,而 Selenium 的測試方 式靈活且功能強(qiáng)大吁断,可以成為一些網(wǎng)站功能測試的首選笆包。那么應(yīng)該使用哪個呢?
答案是:不需要選擇憾股。Selenium 可以輕易地獲取網(wǎng)站的信息,而單元測試可以評估這些信息是否滿足通過測試的條件夏哭。因此检柬,你沒有理由拒絕把 Selenium 導(dǎo)入 Python 的單元測試, 兩者組合是最佳拍檔竖配。