精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

淺析前端測試的反模式

開發 開發工具 前端
你的測試應該盡量少用函數去手動觸發,而要盡量多地利用測試框架給你的API,去模擬Input框的輸入,按鈕的點擊,表單的提交等等。

[[431928]]

過于關注實現細節的測試

在為前端項目編寫測試用例的時候,你也許和我一樣,曾遇到過以下困擾:

(1) 明明進行了功能正確的改動,測試卻掛了。修復測試有時候得認真閱讀各種mock的細節,或者去了解很多本沒有必要知道的代碼邏輯。最后修測試花的時間比進行業務改動花的時間還要長(甚至長很多)。

(2) 對代碼進行提取抽象之后,為各個組件或函數添加測試,實際上是用測試工具的API去重復 業務代碼的內部實現邏輯(有時候還很麻煩!)。任何正常的重構都會導致測試失敗,你本來希望測試能告訴你什么樣的修改是對的,結果現在測試只能告訴你代碼確實有被修改。

(3) 測試寫好,覆蓋率提高,本應信心十足地認為代碼變得健壯了,可是捫心自問,你知道自己寫的這個測試弱點在什么地方,或者說還有多少細節沒有涵蓋。你精心模擬了一個條件,去觸發邏輯流程,并且測試通過,可是在真實的瀏覽器交互中用戶也許并不能觸發這個條件。因此,同樣的道理,你在自己的代碼通過了他人寫的測試之后,也不能確定真實場景下沒有問題,只好把后續的重任交給QA。

造成上面三個問題的原因不止一個,但測試過于關注實現細節在我看來是最主要的。

第一個問題,明明是正確的改動,可是測試不止是驗證業務功能,還對實現細節提出了不該提出的要求,比如要求你的函數接受跟以前一樣的參數,返回值必須是字符串而不能是數組等等。可是這個函數只是實現流程中一個小小的環節,也許在下次重構時就會不復存在。

第二個問題很類似,如果測試代碼去重復實現細節,不管進行正確還是錯誤的重構,你都得把測試改一遍,那原先的測試又能提供什么價值呢?

第三個問題有時發生在,測試的實現細節,不能覆蓋整個真實交互流程的時候。用戶點擊的是屏幕上的button按鈕,而測試的起點是onClick事件被觸發。后面的邏輯被驗證成功,可問題偏偏發生在點擊環節,真實的點擊也許因為按鈕狀態而無法觸發onClick事件。

因此,才會有人提出前端的測試應盡量去模擬真實的用戶行為,Testing-Library就在其官網的“指導原則”章節,鼓勵使用者盡量仿照應用真實的使用方式去編寫測試,并明確提出,你的測試越接近用戶的真實使用方式,它就能給你越多的信心。換句話說,你的測試應該盡量少用函數去手動觸發,而要盡量多地利用測試框架給你的API,去模擬Input框的輸入,按鈕的點擊,表單的提交等等。

如此一來,有的函數,你也無需寫測試證明它的返回值如你所愿,需要寫的,是頁面顯示了期待的文字,發生了預期的變化,進行了對應的跳轉。你會發現,這時的測試就像寫在卡里的AC一樣。只要測試是通過的,你就有理由相信主體功能沒有破壞,而不只是函數工作正常。

沒有獨立業務含義的測試單元

看到上面的方案,你可能會立馬會想到一些問題。

首先就是測試流程可能會很長,從用戶填完表單,點擊提交,到期待的變化出現,當中可能經歷了好幾個函數的執行,連帶著一系列的副作用。模擬這一系列行為,似乎是集成測試與E2E測試該干的事情。如果項目中大部分邏輯都是由這種測試去覆蓋,看起來與測試金字塔所說的由單元測試作為地基是矛盾的。

我認為,當真實遇到的問題碰到了某種教條規范時,后者該適當地讓步。

鼓勵多寫單元測試的原因在于它們成本低,有針對性。可是在前端項目里面,很多形式上的單元并沒有獨立的業務含義。

拿React項目舉例,好多函數只是因為它們在形式上可以被抽取出來,就被拎到一個單獨的文件里,從而降低主函數的復雜度。如果給它寫單元測試,你就不得不手動觸發它的參數變化,或者檢測它的參數函數是否有被調用。

我們寫的React hook尤其如此。很多時候抽取自定義的hook是出于邏輯上的原因,把相關的邏輯和數據聚合到一起,減輕UI組件的負擔,但這些hook往往沒有一個可以輕易解釋清楚的業務含義,而且它們也不會被其它地方使用。

所以這類 “單元”只是長得像單元而已,它們其實只是一個實現環節。這里完整的UI操作流程,才更像一個有價值的單元,盡管它們在形式上可能超越了單個函數的范疇。

但我不想矯枉過正,確實有不少情況下,一個util函數,一個hook,一個很小的公共組件,都是有獨立存在的價值的,因此,它們也應當被視為真正的單元,確實“有資格”擁有自己的專屬測試。

testing-library下面有一個單獨的庫,叫react-hooks-testing-library,讓你無需通過UI行為層面,而是直接以hook的方式去測試它們。它的GitHub頁面上,明確提出了使用以及不使用它的場景:當你的hook不與組件強相關,擁有獨立含義時可以使用;當你的hook只被一個組件使用,且和它的定義強相關時,則不建議使用。

【插入一段:盡管存在react-hooks-testing-library這樣的工具,但像SWR這樣優秀的三方庫,在用testing-library為自己的hook API做測試的時候,依然選擇在UI層面進行。方法是,把自己的hook置于一個臨時的div標簽里進行render,把數據的變化映射成html文字的變化,最后對文字內容做斷言。其實對于獨立性強的函數,個人覺得放置在UI里面做測試倒沒有太大區別,但SWR的例子體現了對“仿照真實使用場景去測試”這一原則的尊重。】

將上面的規律套用到Angular項目中,也是類似的。對于獨立性和通用性不強的pipe,directive,reducer,effect,service,都可以認為它們是實現流程的一部分,從UI行為層面寫好測試即可。

總之,在構思前端測試的時候,與其死守“單元測試”的字面含義,不如結合實際場景,重新思考什么才是真正有價值的“單元”,因地制宜地去寫。換種角度表述,與其在意我們寫的測試是不是“單元測試”,不如追求更核心的東西——我們的測試有沒有以合適的方式去校驗邏輯。

另外,當我們的“單元”過大,一些邏輯可能就會覆蓋不上。像sonar這類工具,不僅會檢查你的行數覆蓋率,還會檢查你的各項條件語句是否有被測試執行。當一套測試的行為流程囊括了多個函數,而且每個函數都有好幾個if…else語句時,想要在UI操作與mock數據上把所有情況都覆蓋到,成本就會變得非常高昂。

對于此,我們得承認,無論用什么方式組織測試,覆蓋所有的條件分支都是不太現實的,而且價值也不大。對于“滿足條件A就執行XXX”之類的語句,條件為非A時沒有業務上的規定,如果為了刻意覆蓋函數的所有條件,就強行測它在非A的情況下返回一個undefined,則沒有太多價值。對這類情況,用UI行為測試主要條件即可,如果你實在覺得有重要的邏輯沒有被覆蓋,不妨回過頭來想想,是不是漏掉了某種輸入條件,例如特定的用戶鍵入或者特殊的API mock返回值。但是,當有過多的條件分支很難用業務場景去表述和模擬的時候,我們可能需要重新思考代碼的實現邏輯是否合理了。

當然,即使按上面這樣做,有時候還是會發現要覆蓋的條件組合太多,從行為流程上寫測試太復雜,這時就不得不做一定的妥協,為那些沒有獨立性的部分去單獨寫測試。如果這類測試不太好寫,可以參照剛才提到的SWR官方測試用到的技巧,把要測的函數或者是對象放置在一個臨時的UI組件下,以最小的成本做UI行為測試。

最后

總結一下上面談到的幾個原則:

(1) 從真實用戶的行為流程去測試,往往比測函數本身,能給你帶來更多的信心。

(2) 對于沒有獨立性和通用性的函數或對象,把它們視作實現的一部分,一般沒有必要為它們去寫單獨的測試。不要拘泥于對“單元測試”的字面理解,不要被形式上的規律所束縛。

(3) 不要把測試覆蓋率視為太過重要的指標,它的目的還是幫助提升代碼的穩定。有的代碼沒有覆蓋也沒關系,有的代碼值得你覆蓋好多遍。畢竟,我們不是為了寫測試而寫測試。

【本文是51CTO專欄作者“ThoughtWorks”的原創稿件,微信公眾號:思特沃克,轉載請聯系原作者】

戳這里,看該作者更多好文

 

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2011-05-24 09:30:26

Findbugs

2009-07-07 09:38:37

ServletQuer

2014-07-30 10:08:13

Python反模式

2012-02-02 09:21:39

編程

2024-07-26 10:28:51

2009-06-29 17:39:31

JSP設計模式

2023-10-30 18:59:38

REST API開發

2024-02-28 08:38:07

Rust前端效率

2020-09-14 08:30:44

Kubernetes容器

2017-04-12 11:46:46

前端瀏覽器渲染機制

2023-09-13 11:58:17

云原生反模式

2020-08-17 07:48:54

物聯網

2010-04-16 16:12:51

jdbc分頁

2011-06-14 14:27:43

灰盒測試

2009-07-07 16:39:40

JDK Observe

2021-01-11 05:37:54

倉儲模式接口

2020-05-07 17:30:49

開發iOS技術

2015-10-10 11:23:17

Java常量反模式

2015-09-22 10:56:13

Java反模式

2021-04-20 22:09:13

Python編程語言
點贊
收藏

51CTO技術棧公眾號

国产乱一区二区| 欧美丝袜激情| 亚洲国产黄色| 亚洲国产成人精品电影| 成人黄色av片| 国产高清美女一级毛片久久| 久久aⅴ国产欧美74aaa| 欧美成人小视频| 真人bbbbbbbbb毛片| 黄色网页在线播放| 99久久精品国产一区| 国产精品视频一区二区高潮| 69av视频在线| 国产99久久精品一区二区300| 欧美日韩久久不卡| 欧美18视频| 国产免费黄色录像| 亚洲永久在线| 欧美人与性动交a欧美精品| 丁香花五月婷婷| 周于希免费高清在线观看| 国产精品久久久久影院| 精品无人区一区二区三区| 国产理论片在线观看| 国产欧美一区二区三区国产幕精品| 日韩最新中文字幕电影免费看| 在线免费观看污视频| 国产精品一站二站| 欧美少妇bbb| 成人久久久久久久久| 黑人另类精品××××性爽| 亚洲欧美在线观看| 亚洲 日韩 国产第一区| 青青操视频在线| 波多野洁衣一区| 久久理论片午夜琪琪电影网| 免费精品在线视频| 国内精品久久久久久久影视简单 | 欧美精品18videos性欧美| 天天操天天舔天天射| 九九在线高清精品视频| 日韩h在线观看| 男女啪啪免费视频网站| 久cao在线| 国产精品网友自拍| 日韩aⅴ视频一区二区三区| 国产 欧美 日韩 在线| 午夜精品一区二区三区国产| 一级做a爰片久久毛片美女图片| 亚洲制服丝袜在线播放| 久久超级碰碰| 日韩不卡在线观看| 一级特黄a大片免费| 欧美1区2区3区4区| 亚洲精品国产欧美| 精品国产av色一区二区深夜久久 | 美女视频黄 久久| 国产精品高清在线观看| 久久久久精彩视频| 男女性色大片免费观看一区二区 | 亚洲综合网av| 国产精品7m凸凹视频分类| 在线视频精品一| 人妻内射一区二区在线视频| 久草在线中文最新视频| 精品日本高清在线播放| 欧美日韩国产精品激情在线播放| 蜜桃视频www网站在线观看| 欧美日韩国产精品一区| 久久久免费视频网站| 成人影院网站| 欧美吞精做爰啪啪高潮| 日韩成人精品视频在线观看| 2019中文亚洲字幕| 精品国产sm最大网站免费看| 欧美做受喷浆在线观看| 久久91成人| www.精品av.com| 69av视频在线| 亚洲永久在线| 国产综合色香蕉精品| 国产草草影院ccyycom| 乱码第一页成人| 国产福利视频一区| 亚洲一级黄色大片| 国产99精品国产| 国产精品精品久久久久久| 一起草av在线| 国产ts人妖一区二区| 久久精品国产精品国产精品污 | 日韩综合视频在线观看| 中文字幕五月天| 一本色道久久综合| 国产在线视频91| 亚洲av片一区二区三区| 免费不卡在线观看| 亚洲自拍偷拍第一页| 香蕉视频网站在线| 综合自拍亚洲综合图不卡区| 国产av国片精品| 久久精品国产福利| 亚洲精品www久久久| 少妇愉情理伦三级| 国产剧情一区| 欧美二区在线播放| 小泽玛利亚一区二区三区视频| 国产精品影视网| 欧美第一黄网| 欧美xxxx视频| 亚洲人吸女人奶水| 日本免费一级视频| 亚洲超碰在线观看| 欧美videos中文字幕| 精品人妻无码一区| 日韩视频一区| 亚洲一区二区三区成人在线视频精品| 色综合888| 亚洲一区二区三区在线看| 亚洲娇小娇小娇小| 另类一区二区三区| 亚洲免费视频一区二区| 成人免费av片| 午夜视频一区| 久久久久久亚洲| 97人妻人人澡人人爽人人精品| 91网站在线观看视频| 免费看欧美一级片| 欧美亚洲综合视频| 这里只有精品在线播放| 91video| 成人丝袜视频网| 精品国产福利| 色操视频在线| 亚洲一区二区三区在线播放| 在线观看av网页| 自拍偷拍亚洲图片| 这里只有精品丝袜| 成人一二三四区| 久久久蜜桃精品| 欧美精品99久久| 国产精品毛片av| 欧美韩国理论所午夜片917电影| 亚洲中文一区二区三区| 国产欧美日韩综合| 成人羞羞国产免费网站| 日本国产精品| 日本视频久久久| 欧美成熟毛茸茸| 色综合天天综合给合国产| 国产区二区三区| 国产一区二区三区四区大秀| 秋霞午夜一区二区| 嫩草在线播放| 91传媒视频在线播放| 国产传媒第一页| 久久资源在线| 欧美一级日本a级v片| 午夜激情成人网| 日日噜噜噜夜夜爽亚洲精品| 国产又黄又大又爽| 亚洲蜜臀av乱码久久精品蜜桃| 波多野结衣网页| 九九视频免费观看视频精品| 国产精品69精品一区二区三区| 精品电影在线| 欧美日韩一区精品| 欧美一区二区三区爽爽爽| 国产馆精品极品| 欧美日韩一道本| 精品国产一区二区三区久久久樱花| 精品久久久999| 国产日韩欧美一区二区东京热 | 亚洲www啪成人一区二区| 夜夜嗨av一区二区三区免费区| 日批视频免费观看| 亚洲免费在线看| 性囗交免费视频观看| 久久久久中文| 自拍偷拍一区二区三区| 高清日韩欧美| 日韩免费在线视频| 精品51国产黑色丝袜高跟鞋| 亚洲成人国产精品| 欧美a视频在线观看| ㊣最新国产の精品bt伙计久久| 91成人在线观看喷潮蘑菇| 午夜亚洲影视| 美国av在线播放| 国产精品专区免费| www高清在线视频日韩欧美| 亚洲国产精品无码久久| 色综合久久中文综合久久牛| 男人av资源站| 26uuu亚洲综合色欧美| 怡红院亚洲色图| 亚洲精品国产日韩| 亚洲图片小说在线| 国内精品偷拍| 成人午夜高潮视频| 在线免费av资源| 欧美日韩国产二区| 一级毛片视频在线观看| 色噜噜狠狠色综合中国| 破处女黄色一级片| 国产日韩影视精品| 亚洲一区二区三区四区av| 日本欧美在线观看| 阿v天堂2017| 你懂的国产精品永久在线| 日本一区视频在线观看| jizz国产精品| 91免费看片在线| 精品三区视频| 97婷婷涩涩精品一区| 超碰个人在线| 中文字幕一精品亚洲无线一区| 少妇一级淫片免费看| 欧美精品久久一区| 日韩不卡高清视频| 欧美日韩一区二区三区在线免费观看| 欧美视频www| 国产精品视频免费| 巨胸大乳www视频免费观看| 丁香啪啪综合成人亚洲小说 | 国产a级毛片一区| 日本超碰在线观看| 久久亚洲精品伦理| 无码人妻丰满熟妇区96| 红桃视频亚洲| 成人在线观看毛片| 超碰cao国产精品一区二区| 国产精品私拍pans大尺度在线| 在线播放麻豆| 亚洲天堂网在线观看| 瑟瑟在线观看| 日韩精品欧美国产精品忘忧草| 亚洲成人中文字幕在线| 日韩欧美一区在线| 国产白浆在线观看| 欧美变态凌虐bdsm| 亚洲欧美另类综合| 精品成人免费观看| 国产91免费在线观看| 精品国产乱码久久久久久久| 亚洲xxx在线| 欧美tickling网站挠脚心| 国产v在线观看| 精品免费一区二区三区| 乱精品一区字幕二区| 亚洲成色777777女色窝| 天天色天天操天天射| 日韩精品视频在线观看网址| 五月婷婷综合久久| 亚洲精选在线观看| 成年午夜在线| 日韩一区二区久久久| 黄网页免费在线观看| 欧美精品在线看| 爱情岛亚洲播放路线| 91精品国产91| 日韩电影大全网站| 国产一区二区香蕉| 国产一区二区三区视频在线| 91福利视频导航| 欧美理论影院| 国产欧美一区二区三区在线看| 97久久精品一区二区三区的观看方式| 亚洲自拍小视频免费观看| 国产ts一区| 日本成人三级电影网站| 天天做天天爱天天综合网2021| 欧美另类videosbestsex日本| 红桃视频国产精品| 国产精品无码av无码| 精品亚洲成a人在线观看| 欧美一级片在线免费观看| 91啪亚洲精品| 欧美一级特黄高清视频| 亚洲一区二区在线视频| 国产一级免费视频| 欧美一区二区三区的| 姝姝窝人体www聚色窝| 中文字幕亚洲欧美在线| 污污在线观看| 国产精品国产亚洲伊人久久| 成人午夜888| 免费av一区二区三区| 99久久99久久精品国产片桃花| 日韩精品一区二区免费| 丝袜诱惑亚洲看片| 国产吃瓜黑料一区二区| 久久久99免费| 久久久全国免费视频| 欧美亚洲自拍偷拍| 理论片中文字幕| 最近2019年日本中文免费字幕| 久草在线视频资源| 国产精品偷伦一区二区| 老司机凹凸av亚洲导航| 中文字幕一区二区三区最新| 午夜亚洲视频| 中国极品少妇xxxx| 亚洲欧美日韩一区二区三区在线观看| 天天综合天天干| 日韩欧美高清dvd碟片| 91在线看片| 亲爱的老师9免费观看全集电视剧| 91麻豆精品国产综合久久久| 日本午夜精品一区二区| 亚洲免费成人| 中文字幕第10页| 欧美激情一区二区三区不卡| 日韩精品一区二区三| 日韩一区二区三区四区| 2021av在线| 国产成人精品电影| 日韩成人一级| 精品国产av无码一区二区三区| 久久97超碰国产精品超碰| 色一情一交一乱一区二区三区 | 91丨九色丨海角社区| 亚洲国模精品私拍| 欧美xxxx免费虐| av资源站久久亚洲| 99re6热只有精品免费观看| 在线观看日韩片| 青青草97国产精品免费观看无弹窗版| 少妇一级淫片免费放播放| 亚洲国产毛片aaaaa无费看| 亚洲av无码一区二区三区性色| 久久精品成人一区二区三区| 久久爱.com| 视频一区三区| 欧美a级一区二区| 国产午夜福利一区| 欧美性一级生活| 91在线播放网站| 国产精品免费观看在线| 欧美一区2区| 欧美婷婷精品激情| 中文字幕不卡的av| 亚洲午夜无码久久久久| 国产一区二区三区在线视频| 国产成人精品123区免费视频| 欧美一区二区三区四区夜夜大片| 国产一区91| 精品无人区无码乱码毛片国产| 色哟哟一区二区在线观看| 韩国三级在线观看久| 国产精品成人av在线| 日韩欧美网址| 亚洲综合伊人久久| 亚洲一区免费视频| 偷拍25位美女撒尿视频在线观看| 在线观看欧美成人| 狠狠久久伊人中文字幕| 一区二区三区视频| 国产精品一区专区| 日本在线视频中文字幕| 精品小视频在线| 影视一区二区三区| 亚洲一区二区在线免费观看| 国内精品不卡在线| 久久黄色免费网站| 欧美日韩亚洲不卡| 国产日产一区二区| 国产91免费视频| 久久精品在线| 永久免费看片直接| 亚洲成人免费网站| 国模一区二区| 嫩草影院中文字幕| wwwwww.欧美系列| 五月综合色婷婷| 日韩精品一区二区三区四区| 黄网在线免费看| 日韩视频在线播放| 国产精品一区二区在线观看不卡 | 黄色一级片在线观看| 国产98在线|日韩| 久久久青草婷婷精品综合日韩| 日韩一区二区三区四区视频| 欧美大肚乱孕交hd孕妇| 偷拍视频一区二区三区| 免费看av软件| 91日韩在线专区| 国产情侣av在线| 清纯唯美亚洲综合| 欧美国产专区| 国产精品成人无码免费| 日韩欧美国产系列| 亚洲成人一区在线观看| 久久久久久久久久网| 中文字幕欧美日韩一区| 亚洲男人第一天堂| 国产欧美va欧美va香蕉在线| 亚洲视频观看| 精品在线观看一区| 国产午夜精品久久久| 日韩欧美高清一区二区三区|