生產(chǎn)環(huán)境又有問題?都是臟數(shù)據(jù)惹的禍!
本文筆者對(duì)臟數(shù)據(jù)的來源、臟數(shù)據(jù)的危害、臟數(shù)據(jù)的預(yù)防、如何對(duì)已出現(xiàn)的臟數(shù)據(jù)進(jìn)行處理等問題進(jìn)行詳細(xì)闡述。
“小光,今天那個(gè)詭異的生產(chǎn)環(huán)境問題找到原因了嗎?”
“還是數(shù)據(jù)問題!之前做的一個(gè)功能有一部分?jǐn)?shù)據(jù)遷移工作沒有做好,導(dǎo)致生產(chǎn)環(huán)境有臟數(shù)據(jù),委托人的聯(lián)系人已經(jīng)不為該委托人服務(wù)了,應(yīng)該移除掉的……”
“又是臟數(shù)據(jù)……”
“嗯,好在不是代碼問題。”
這是在藍(lán)鯨項(xiàng)目發(fā)生的真實(shí)對(duì)話。其中提到的臟數(shù)據(jù)(Dirty data),也叫壞數(shù)據(jù)(Bad data),通常是指跟期待的數(shù)據(jù)不一樣、會(huì)影響系統(tǒng)正常行為的數(shù)據(jù)。
藍(lán)鯨項(xiàng)目的QA會(huì)定期分析生產(chǎn)環(huán)境的缺陷,當(dāng)定位某個(gè)缺陷為臟數(shù)據(jù)引起之后,往往就到此為止了。
生產(chǎn)環(huán)境下的缺陷分析流程是這樣的:
![都是臟數(shù)據(jù)惹的禍 都是臟數(shù)據(jù)惹的禍](https://image.woshipm.com/wp-files/2019/04/04JdX1ewYBaaGdDF6wrM.png)
調(diào)查分析生產(chǎn)環(huán)境缺陷,到最后定位是數(shù)據(jù)問題的時(shí)候,總是讓人渾身輕松……于是,“臟數(shù)據(jù)”就跟測(cè)試的“隨機(jī)掛”一樣,成為了光榮的“背鍋俠”!
臟數(shù)據(jù) ≠ 代碼問題,真的是這樣嗎?先來深入了解一下臟數(shù)據(jù)。
臟數(shù)據(jù)是怎么回事?
臟數(shù)據(jù)產(chǎn)生的原因多種多樣,有的甚至很難解釋清楚到底發(fā)生了什么……
通常,以下原因可能造成臟數(shù)據(jù):
- 臟讀:讀了事務(wù)處理中間狀態(tài)的數(shù)據(jù)
- 重復(fù)插入了相同的數(shù)據(jù):多次點(diǎn)擊同一個(gè)按鈕導(dǎo)致
- 不能為空的字段存為空:數(shù)據(jù)庫(kù)字段沒有驗(yàn)證,或者對(duì)于歷史數(shù)據(jù)沒有做好遷移處理
- 人工錄入不合法的數(shù)據(jù):比如電話號(hào)碼含有特殊字符
- 運(yùn)行SQL腳本插入了不合法數(shù)據(jù):比如不同實(shí)體id搞混等
- 存入了多余的空格
- 測(cè)試環(huán)境可能由于部署了半成品產(chǎn)生一些不合法數(shù)據(jù)
- ……
因此,臟數(shù)據(jù)跟代碼有關(guān),臟數(shù)據(jù)的產(chǎn)生是因?yàn)闆]有做好防御工作!
臟數(shù)據(jù)有哪些危害?
根據(jù)不同的系統(tǒng)、不同的業(yè)務(wù),臟數(shù)據(jù)帶來的危害也會(huì)不一樣。
- 臟讀產(chǎn)生的數(shù)據(jù)往往是錯(cuò)誤的,導(dǎo)致數(shù)據(jù)不真實(shí)性,或者數(shù)據(jù)的不一致性;
- 重復(fù)和其他不合法數(shù)據(jù)則可能導(dǎo)致系統(tǒng)行為的不正常,有時(shí)候還可能導(dǎo)致非常嚴(yán)重的故障,甚至有些沒有暴露的臟數(shù)據(jù)可能帶來不可預(yù)知的致命錯(cuò)誤,危害可能是相當(dāng)大的。
臟數(shù)據(jù)帶來的危害很難估量,有很大的不可預(yù)測(cè)性,對(duì)于臟數(shù)據(jù)的預(yù)防至關(guān)重要。
那么,如何能夠防范于未然呢?
如何預(yù)防臟數(shù)據(jù)的產(chǎn)生?
嘗試對(duì)臟數(shù)據(jù)引起的生產(chǎn)環(huán)境缺陷做進(jìn)一步分析,總結(jié)出臟數(shù)據(jù)的幾種類型,可以在敏捷軟件開發(fā)生命周期的不同階段對(duì)其進(jìn)行防御。
![都是臟數(shù)據(jù)惹的禍 都是臟數(shù)據(jù)惹的禍](https://image.woshipm.com/wp-files/2019/04/osALCwLvEXbczHwRwdm3.png)
業(yè)務(wù)需求分析階段
在業(yè)務(wù)分析的時(shí)候,根據(jù)業(yè)務(wù)需求,明確業(yè)務(wù)相關(guān)數(shù)據(jù)的特定要求:
- 不能為空的字段
- 不能重復(fù)的數(shù)據(jù)
- 日期范圍
- 電話號(hào)碼可以有“ext.”、“+”和“-” 但不能有其他字符
- 特殊字符的限定
- 功能升級(jí)的時(shí)候考慮已有數(shù)據(jù)的遷移
- 還有一些跟常識(shí)不同有特定業(yè)務(wù)含義的數(shù)據(jù)需求
- ……
數(shù)據(jù)庫(kù)和代碼實(shí)現(xiàn)階段
明確了數(shù)據(jù)的需求,可以根據(jù)需求定義和軟件使用常識(shí),在實(shí)現(xiàn)層面對(duì)數(shù)據(jù)進(jìn)行嚴(yán)格的約束和校驗(yàn):
- 數(shù)據(jù)庫(kù)表的主外鍵、字段類型、是否允許為空,事務(wù)處理隔離等。
- 前后端對(duì)數(shù)據(jù)進(jìn)行嚴(yán)格的校驗(yàn),防止各種手段存入不合法的數(shù)據(jù),包括需求定義的數(shù)據(jù)和常識(shí)性的數(shù)據(jù),比如身份證號(hào)碼最多18位等。
- 考慮多用戶同時(shí)處理可能帶來的并發(fā)問題。
- 防止按鈕或者鏈接被重復(fù)多次點(diǎn)擊,可重復(fù)點(diǎn)擊通常在網(wǎng)速較慢時(shí)可能存入重復(fù)數(shù)據(jù)。
- 程序讀取數(shù)據(jù)的時(shí)候進(jìn)行處理,比如去掉多余空格、去重、大小寫不敏感數(shù)據(jù)的處理。
- ……
測(cè)試的進(jìn)一步保障
有了需求定義和實(shí)現(xiàn)層面的校驗(yàn),大部分的不合法數(shù)據(jù)被阻止了,但是還是會(huì)有漏網(wǎng)之魚,在測(cè)試的時(shí)候繼續(xù)采取相應(yīng)的措施來進(jìn)一步防御。
- 業(yè)務(wù)需求規(guī)定的數(shù)據(jù):這個(gè)毫無疑問是需要測(cè)試的,有底層的單元測(cè)試覆蓋會(huì)更好。
- 常識(shí)性的數(shù)據(jù):由于不同的人可能有不同的常識(shí),這些問題在測(cè)試的時(shí)候還需要特別關(guān)注。
- 探索隱藏邊界:關(guān)于隱藏邊界的概念大家可能不是很熟悉。咱們通常說的等價(jià)類、邊界值分析方法設(shè)計(jì)測(cè)試用例,都是根據(jù)可見的邊界來考慮的,其實(shí)咱們程序后臺(tái)可能還存在一些隱藏的邊界,也是很有可能會(huì)導(dǎo)致數(shù)據(jù)問題的,需要在測(cè)試過程中進(jìn)行探索發(fā)現(xiàn)它們并進(jìn)行驗(yàn)證。
關(guān)于隱藏邊界,可以參考John Ruberto的文章《Uncovering Hidden Boundary Values in Testing》,里邊提到了四種隱藏邊界:數(shù)據(jù)類型邊界、信任域邊界、特殊數(shù)據(jù)值、復(fù)活節(jié)彩蛋。
除此之外,咱們平常測(cè)試過程中可以多積累,總結(jié)出還有哪些可能會(huì)導(dǎo)致數(shù)據(jù)問題的隱藏邊界。
對(duì)線上用戶的培訓(xùn)
做了前面一層層的防御,如果最終用戶在使用的時(shí)候能夠按照規(guī)范操作數(shù)據(jù),對(duì)減少臟數(shù)據(jù)的產(chǎn)生會(huì)很有幫助。
下面兩個(gè)措施可以培訓(xùn)用戶更規(guī)范的操作數(shù)據(jù):
- 在界面上給出清晰的提示,告訴用戶某些數(shù)據(jù)輸入的要求
- 給用戶培訓(xùn)或者提供用戶手冊(cè),告訴用戶該怎么正確使用系統(tǒng)
如何處理已產(chǎn)生的臟數(shù)據(jù)?
有那么多預(yù)防臟數(shù)據(jù)產(chǎn)生的方法,但相信臟數(shù)據(jù)的產(chǎn)生還是在所難免的。臟數(shù)據(jù)一旦產(chǎn)生,導(dǎo)致的系統(tǒng)行為也是不可預(yù)測(cè)的,可能無足輕重,也可能暴露非常嚴(yán)重的缺陷。
該如何應(yīng)對(duì)產(chǎn)生的臟數(shù)據(jù)呢?
![都是臟數(shù)據(jù)惹的禍 都是臟數(shù)據(jù)惹的禍](https://image.woshipm.com/wp-files/2019/04/B9WhoXMsXTi0NZUgblHu.png)
臟數(shù)據(jù)產(chǎn)生以后有兩種存在形式,一種是已經(jīng)引起某些問題被發(fā)現(xiàn)了,另一種是還不被人知道,不知道哪天會(huì)發(fā)生什么樣的問題。
已經(jīng)暴露的臟數(shù)據(jù)
對(duì)于已經(jīng)暴露的臟數(shù)據(jù),首要的是對(duì)數(shù)據(jù)的快速修復(fù),讓系統(tǒng)恢復(fù)正常運(yùn)轉(zhuǎn)。對(duì)于專業(yè)的臟數(shù)據(jù)處理可以了解一下數(shù)據(jù)清洗(Data cleaning)技術(shù)。咱們平常對(duì)于臟數(shù)據(jù)的修復(fù),可以根據(jù)業(yè)務(wù)需求,采用數(shù)據(jù)庫(kù)腳本修復(fù),或者在前端執(zhí)行JS腳本來修復(fù)。
修復(fù)數(shù)據(jù)需要特別注意不要引入新的臟數(shù)據(jù),編寫腳本之前要理清相關(guān)業(yè)務(wù)和數(shù)據(jù)之間的關(guān)系,編寫好腳本之后要經(jīng)過嚴(yán)格的測(cè)試才能在線上環(huán)境執(zhí)行。
修復(fù)數(shù)據(jù)的同時(shí),需要進(jìn)一步調(diào)查數(shù)據(jù)產(chǎn)生的原因,檢查可以在哪個(gè)環(huán)節(jié)加固防御措施,以盡量減少類似數(shù)據(jù)問題再次發(fā)生的可能性。
未暴露的臟數(shù)據(jù)
這樣的數(shù)據(jù),其實(shí)我們并不知道它的存在,就像一個(gè)在黑暗處的幽靈,不知道什么時(shí)候會(huì)給系統(tǒng)帶來麻煩。
由于系統(tǒng)環(huán)境的復(fù)雜性、用戶行為的多樣性,生產(chǎn)環(huán)境更加容易產(chǎn)生臟數(shù)據(jù)。盡早發(fā)現(xiàn)這種潛在危害的臟數(shù)據(jù)非常重要。
藍(lán)鯨項(xiàng)目就是這樣。在跟客戶做支持的同事溝通過程中,最大的擔(dān)憂就是生產(chǎn)環(huán)境的數(shù)據(jù)總能發(fā)現(xiàn)問題,如何能夠讓這些問題盡早暴露出來?
推薦生產(chǎn)環(huán)境下的測(cè)試(Testing in production,TiP)的一些實(shí)踐:
1) 直接在生產(chǎn)環(huán)境測(cè)試
生產(chǎn)環(huán)境是高度受保護(hù)的,不可以隨意測(cè)試,以免破壞生產(chǎn)環(huán)境的穩(wěn)定性。在生產(chǎn)環(huán)境寫入數(shù)據(jù)要特別謹(jǐn)慎,大批量的讀操作也要注意對(duì)系統(tǒng)性能的影響。
有些可以隔離出來的功能或操作,相對(duì)來說是安全的,可以在生產(chǎn)環(huán)境直接測(cè)試,比如:藍(lán)鯨項(xiàng)目的郵件服務(wù),常會(huì)在生產(chǎn)環(huán)境部署單獨(dú)的服務(wù)器來測(cè)試。
需要根據(jù)項(xiàng)目真實(shí)情況去做決定。
2)將生產(chǎn)環(huán)境數(shù)據(jù)清理后用于測(cè)試環(huán)境
生產(chǎn)環(huán)境數(shù)據(jù)含有PII(個(gè)人身份信息,需要保護(hù)的隱私信息)或者其他機(jī)密,通常不能直接用于測(cè)試環(huán)境。
將生產(chǎn)環(huán)境數(shù)據(jù)的PII和其他機(jī)密信息清除后用于測(cè)試環(huán)境,測(cè)試人員基于這些數(shù)據(jù)做測(cè)試,就能有效的提前去發(fā)現(xiàn)由于生產(chǎn)環(huán)境數(shù)據(jù)引起的問題。
這個(gè)方案很好,但是要權(quán)衡ROI。對(duì)于一些復(fù)雜的系統(tǒng),數(shù)據(jù)庫(kù)結(jié)構(gòu)過于復(fù)雜,清理的成本太高,也是不太現(xiàn)實(shí)的。
3)利用藍(lán)綠部署等TiP實(shí)踐
藍(lán)綠部署是一種通過運(yùn)行兩個(gè)相同的生產(chǎn)環(huán)境“藍(lán)環(huán)境”和“綠環(huán)境”來減少停機(jī)時(shí)間和風(fēng)險(xiǎn)的技術(shù),是TiP非常典型的一個(gè)實(shí)踐。
在任何時(shí)候,只有一個(gè)環(huán)境是活的,活的環(huán)境為所有生產(chǎn)流量提供服務(wù)。通常綠環(huán)境是閑置的,藍(lán)環(huán)境是活的。部署新的版本到綠環(huán)境,可以先進(jìn)行測(cè)試,而不會(huì)給真正在使用的藍(lán)環(huán)境帶來影響。完成部署和測(cè)試以后,再進(jìn)行藍(lán)綠環(huán)境的切換。
此技術(shù)可以消除由于應(yīng)用程序部署導(dǎo)致的停機(jī)時(shí)間。此外,藍(lán)綠部署可降低風(fēng)險(xiǎn):如果新版本在綠環(huán)境上發(fā)生意外情況,可以通過切換回藍(lán)環(huán)境立即回滾到上一版本。這樣就有機(jī)會(huì)提前發(fā)現(xiàn)臟數(shù)據(jù)可能引起的問題。
類似的技術(shù),還有金絲雀發(fā)布等,也有助于提前發(fā)現(xiàn)臟數(shù)據(jù)的問題。
寫在最后
臟數(shù)據(jù)的防御是關(guān)鍵
這跟敏捷測(cè)試的質(zhì)量?jī)?nèi)建原則是一致的。質(zhì)量?jī)?nèi)建強(qiáng)調(diào)缺陷預(yù)防,在預(yù)防缺陷產(chǎn)生的同時(shí),要加強(qiáng)對(duì)于臟數(shù)據(jù)的防御。根據(jù)敏捷測(cè)試的節(jié)奏,在敏捷開發(fā)生命周期各個(gè)環(huán)節(jié)做好臟數(shù)據(jù)的預(yù)防和處理工作,盡量減少臟數(shù)據(jù)給生產(chǎn)環(huán)境帶來的危害。
如果由于各種原因防御工作不到位,臟數(shù)據(jù)產(chǎn)生后也要分析總結(jié),回過頭來指導(dǎo)開發(fā)環(huán)節(jié)的工作,進(jìn)一步加強(qiáng)防御。
![都是臟數(shù)據(jù)惹的禍 都是臟數(shù)據(jù)惹的禍](https://image.woshipm.com/wp-files/2019/04/mFkwbXNnAWgM0edxcfW6.png)
臟數(shù)據(jù)讓我們又愛又恨
恨的是臟數(shù)據(jù)的產(chǎn)生總是會(huì)導(dǎo)致系統(tǒng)行為的不可預(yù)測(cè),讓系統(tǒng)質(zhì)量保障變得復(fù)雜。尤其是一些臟數(shù)據(jù)不停的出現(xiàn),還總是找不到原因的時(shí)候,很讓人抓狂!總想到此為止,讓臟數(shù)據(jù)來背鍋。
但這不是明智的做法,臟數(shù)據(jù)都是有原因的,不挖掘出真正的原因,可能帶來更加意想不到的后果。找出根因,做到防微杜漸,才是正道。
愛的不是因?yàn)榕K數(shù)據(jù)可以幫我們背鍋,而是它的存在可以幫助我們暴露程序潛在的問題,是做好系統(tǒng)質(zhì)量保障工作、生產(chǎn)環(huán)境下的QA不可或缺的助手。
QA朋友們,請(qǐng)加強(qiáng)對(duì)臟數(shù)據(jù)的重視,善待臟數(shù)據(jù)!
作者:ThoughtWorks林冰玉,微信公眾號(hào):ThoughtWorks洞見
本文由@ThoughtWorks洞見 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)允許,禁止轉(zhuǎn)載。
題圖來自Unsplash, 基于CC0協(xié)議
- 目前還沒評(píng)論,等你發(fā)揮!