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

React團隊是如何測試并發特性的

開發
本文來聊聊React團隊如何測試并發特性。

大家好,我卡頌。

React18進入大家視野已經有一段時間了,不知道各位有沒有嘗試「并發特性」呢?

當啟用「并發特性」后,React會從「同步更新」變為「異步、帶優先級、可中斷的更新」。

這也為編寫單元測試帶來了一些難度。

本文來聊聊React團隊如何測試并發特性。

遇到的困境

主要有兩個問題需要面對。

1. 如何表達渲染結果?

React可以對接不同宿主環境的渲染器,大家最熟悉的渲染器想必是ReactDOM,用于對接「瀏覽器」與「Node環境」(SSR)。

對于一些場景,可以用ReactDOM的輸出結果做測試。

比如,下面是使用ReactDOM的輸出結果測試「無狀態組件的渲染結果是否符合預期」(測試框架是jest):

it('should render stateless component', () => {
const el = document.createElement('div');
ReactDOM.render(<FunctionComponent name="A" />, el);
expect(el.textContent).toBe('A');
});

這里有個不方便的地方 —— 這個用例依賴瀏覽器環境與DOM API(比如用到document.createElement)。

對于測試「React內部運行機制」這樣的場景,摻雜了宿主環境相關信息顯然會讓測試用例編寫起來更繁瑣。

2. 如何測試并發環境?

如果將上文的用例中ReactDOM.render改為ReactDOM.createRoot,那么用例就會失敗:

// 之前
ReactDOM.render(<FunctionComponent name="A" />, el);
expect(el.textContent).toBe('A');
// 之后
ReactDOM.createRoot(el).render(<FunctionComponent name="A" />);
expect(el.textContent).toBe('A');

這是因為在新的架構下,很多「同步更新」變成了「并發更新」,當render執行后,頁面還沒完成渲染。

要讓上述用例成功,最簡單的修改方式是:

ReactDOM.createRoot(el).render(<FunctionComponent name="A" />);
setTimeout(() => {
// 異步獲取結果
expect(el.textContent).toBe('A');
})

如何優雅的應對這種變化?

React的應對策略

接下來我們來看React團隊的應對方式。

首先來看第一個問題 —— 如何表達渲染結果?

既然ReactDOM渲染器對應瀏覽器、Node環境,ReactNative渲染器對應Native環境。

那能不能為測試「內部運行流程」專門開發一個渲染器呢?

答案是肯定的。

這個渲染器叫React-Noop-Renderer。

簡單的說,這個渲染器會渲染出純JS對象。

實現一個渲染器

React內部有個叫Reconciler的包,他會引用一些「操作宿主環境」的API。

比如如下方法用于「向容器中插入節點」:

function appendChildToContainer(child, container) {
// 具體實現
}

對于瀏覽器環境(ReactDOM),使用appendChild方法實現即可:

function appendChildToContainer(child, container) {
// 使用appendChild方法
container.appendChild(child);
}

打包工具(rollup)將Reconciler包與上述這類「針對瀏覽器環境的API」打包起來,就是ReactDOM包。

在React-Noop-Renderer中,與ReactDOM中的DOM節點對標的是如下數據結構:

const instance = {
id: instanceCounter++,
type: type,
children: [],
parent: -1,
props
};

注意其中的children字段,用于保存子節點。

所以appendChildToContainer方法在React-Noop-Renderer中可以實現的很簡單:

function appendChildToContainer(child, container) {
const index = container.children.indexOf(child);
if (index !== -1) {
container.children.splice(index, 1);
}
container.children.push(child);
};

打包工具將Reconciler包與上述這類「針對React-Noop的API」打包起來,就是React-Noop-Renderer包。

基于React-Noop-Renderer,可以完全脫離正常的宿主環境,測試Reconciler內部的邏輯。

接下來來看第二個問題。

如何測試并發環境?

「并發特性」再復雜,說到底也只是「各種異步執行代碼的策略」,最終執行策略的API不外乎setTimeout、setInterval、Promise等。

在jest中,可以模擬這些異步API,控制他們的執行時機。

比如上面的異步代碼,在React中的測試用例會這么寫:

// 測試用例修改后:
await act(() => {
ReactDOM.createRoot(el).render(<FunctionComponent name="A" />);
})
expect(el.textContent).toBe('A');

act方法來自jest-react包,他的內部會執行jest.runOnlyPendingTimers方法,讓所有等待中的計時器觸發回調。

比如如下代碼:

setTimeout(() => {
console.log('執行')
}, 9999999)

執行jest.runOnlyPendingTimers后會立刻打印「執行」。

通過這種方式,人為控制React并發更新的速度,同時對框架代碼0侵入。

除此之外,用于驅動并發更新的Scheduler(調度器)模塊,本身也有一個針對測試的版本。

在這個版本中,開發者可以手動控制Scheduler的輸入、輸出。

比如,我想測試組件卸載時useEffect回調的執行順序。

如下面代碼所示,其中Parent為掛載的「被測試組件」:

function Parent() {
useEffect(() => {
return () => Scheduler.unstable_yieldValue('Unmount parent');
});
return <Child />;
}
function Child() {
useEffect(() => {
return () => Scheduler.unstable_yieldValue('Unmount child');
});
return 'Child';
}
await act(async () => {
root.render(<Parent />);
});

根據yieldValue的插入順序是否符合預期,就能確定useEffect的邏輯是否符合預期:

expect(Scheduler).toHaveYielded(['Unmount parent', 'Unmount child']);

總結

React中測試用例的編寫策略為:

可以用ReactDOM測的用例,一般結合ReactDOM與ReactTestUtils(瀏覽器環境的輔助方法)完成

需要把控中間過程的用例,使用Scheduler的測試包,用Scheduler.unstable_yieldValue記錄過程信息

脫離宿主環境,單獨測試React內部運行流程的,使用React-Noop-Renderer

測試并發下的場景,需要結合上述工具與jest-react一起使用

如果想深入學習下React中與測試相關的技巧,可以看下司徒正美老師的作品anu[1]。

這是個類React框架,但能跑通800+的React用例。里面實現了ReactTestUtils、React-Noop-Renderer的簡化版。

責任編輯:張燕妮 來源: 魔術師卡頌
相關推薦

2021-03-12 18:25:09

開發前端React

2022-02-04 22:18:28

React路由應用

2020-01-07 15:40:43

React前端技術準則

2023-02-09 14:55:43

旋轉門React團隊

2024-02-07 12:35:00

React并發模式concurrent

2016-11-21 15:08:38

Leader工程師團隊管理

2011-09-23 09:46:09

軟件項目

2023-04-20 10:15:57

React組件Render

2022-05-10 09:14:15

React 并發渲染

2022-10-26 15:22:31

React組件User組件

2023-02-02 08:41:14

React團隊Vite

2021-07-15 23:18:48

Go語言并發

2022-04-14 09:01:39

React源碼Flow

2020-10-12 10:06:26

技術React代數

2021-04-25 08:43:30

管理前端后端

2022-04-14 08:00:00

Cypress測試開發

2009-01-16 10:01:57

MySQL復制特性測試

2015-10-10 16:02:36

React NativAndroid

2023-03-24 12:34:56

點贊
收藏

51CTO技術棧公眾號

国模私拍视频一区| 欧美精品一区二区久久婷婷| 性欧美精品一区二区三区在线播放 | 国产一区二区三区免费在线 | 欧美 日韩 国产精品| 亚洲第九十九页| 日本视频在线一区| 久久久久久久久久国产精品| 国产又大又粗又爽的毛片| 高清在线一区二区| 在线观看91视频| 激情五月婷婷六月| 成年人在线观看| 福利电影一区二区三区| 国产伦精品免费视频| 日本系列第一页| 午夜久久免费观看| 日韩久久午夜影院| 中文字幕第10页| 国产成人a视频高清在线观看| 亚洲国产综合人成综合网站| 无码免费一区二区三区免费播放| 亚洲精品无码久久久| 另类调教123区| 欧洲精品毛片网站| 精品视频一区二区在线观看| 欧美jizz| 这里只有精品久久| 黄瓜视频污在线观看| 成人看片爽爽爽| 欧美一区二区视频观看视频| mm131国产精品| 粉嫩一区二区| 岛国av一区二区在线在线观看| 天堂av免费看| 亚洲搞黄视频| 国产欧美日韩在线| 欧美日韩精品综合| 三级视频在线播放| www.欧美色图| 黄色国产精品一区二区三区| av手机免费看| 国产一区二区在线看| 国产精品永久免费在线| 尤物视频免费观看| 噜噜噜躁狠狠躁狠狠精品视频 | 日韩久久精品成人| yy1111111| 国产精品白浆| 亚洲第一男人天堂| 星空大象在线观看免费播放| 超碰97久久| 精品少妇一区二区三区在线视频| 久久影院中文字幕| 成人a视频在线观看| 亚洲久久在线观看| 亚洲精品乱码| 91精品国产色综合久久不卡98| 国产一卡二卡在线| 亚洲激情av| 69av在线视频| 中文在线第一页| 日日夜夜精品免费视频| 国产精品久久综合av爱欲tv| 夜夜躁日日躁狠狠久久av| 日韩高清欧美激情| 国产免费一区二区三区在线观看 | 亚洲精品一二| 98视频在线噜噜噜国产| www.日本精品| 久久久久久色| 成人免费淫片aa视频免费| 国产婷婷在线视频| 北条麻妃一区二区三区| 欧美成人在线免费观看| 成年女人的天堂在线| 国产精品第四页| 日本精品福利视频| a级大胆欧美人体大胆666| 精品久久久久久亚洲国产300| 青青草原成人网| 成人av色网站| 精品日韩99亚洲| 国产精品无码久久久久久| 色综合久久网| 欧美精品电影免费在线观看| 青青国产在线观看| 免费在线看一区| 99re视频| 二区在线观看| 亚洲国产精品自拍| 黄色免费网址大全| 欧美影院精品| 亚洲欧美综合v| 91插插插插插插| 一区二区三区福利| 国产日韩在线视频| 少妇av在线播放| 国产精品久久久久久妇女6080| 成人av在线不卡| 666av成人影院在线观看| 91精品国产色综合久久ai换脸| 中文字幕三级电影| 97久久夜色精品国产| 性欧美xxxx交| 国产精品日韩无码| 久久精品无码一区二区三区| 男人的天堂视频在线| 亚洲永久av| 欧美精品一区二区三区视频 | 一区二区三区在线播| 日韩视频第二页| 久久伊人精品| 在线国产精品视频| 国产成人无码精品亚洲| 紧缚捆绑精品一区二区| 欧美久久在线| 不卡的av影片| 91精品国产综合久久精品性色| 91视频啊啊啊| 好看不卡的中文字幕| 国产精品高潮粉嫩av| 亚洲 美腿 欧美 偷拍| 亚洲码国产岛国毛片在线| 别急慢慢来1978如如2| 国产毛片久久久| 久久99热这里只有精品国产| 中文亚洲av片在线观看| 久久综合久久久久88| 97超碰人人澡| 成午夜精品一区二区三区软件| www.xxxx精品| 亚洲网站免费观看| 久久精品欧美一区二区三区不卡| 欧美精品久久久久久久自慰| 视频国产精品| 久久久精品久久久久| 一本久道久久综合无码中文| 久久精品一区四区| 少妇高清精品毛片在线视频| 欧洲精品一区| 97在线免费观看| 午夜性色福利视频| 婷婷国产在线综合| 中文字幕影片免费在线观看| 一区二区毛片| 欧美精品七区| 久久毛片亚洲| 亚洲天堂av网| 日批视频免费观看| 欧美国产日本韩| 天堂网在线免费观看| 成人午夜av| 国产伦精品免费视频| 麻豆视频在线免费观看| 欧美日韩1234| 欧美大片xxxx| 国产凹凸在线观看一区二区| 91国在线高清视频| 久久久久97| 日本成人激情视频| 成人在线视频成人| 欧美精品日韩综合在线| 国产大学生自拍| 不卡电影免费在线播放一区| www一区二区www免费| 亚洲人成网www| 国产精品流白浆视频| 欧美日韩在线看片| 日韩欧美亚洲国产另类| 日本在线观看中文字幕| 26uuu久久综合| 天天色综合天天色| 91精品久久久久久久久久不卡| αv一区二区三区| 天堂av在线网| 日韩中文理论片| 国内精品久久久久久久久久久 | 久久精品影视伊人网| 国产成人毛毛毛片| 无码av中文一区二区三区桃花岛| 亚洲精品成人无码| 国产裸体歌舞团一区二区| av片在线免费| 国产在线日韩精品| 99视频网站| 忘忧草在线www成人影院| 久久精品久久久久电影| 日韩在线观看视频一区二区三区| 日韩欧美成人免费视频| 糖心vlog免费在线观看| av不卡在线播放| 日韩一区二区三区不卡视频| 激情成人亚洲| 一个色的综合| 日韩极品在线| 91久久久精品| 欧美性xxx| 欧美激情第一页xxx| 国产高清免费av在线| 精品国产乱码久久久久久夜甘婷婷 | 欧美日韩性视频| 亚洲最大的黄色网址| 91蝌蚪porny九色| 污免费在线观看| 噜噜噜久久亚洲精品国产品小说| 8x8x华人在线| 欧美日韩国产在线观看网站| 国产精品一区二区欧美黑人喷潮水| 日本.亚洲电影| 91国产高清在线| а√中文在线8| 亚洲欧美在线播放| 东京干手机福利视频| 欧美日韩国产天堂| 国产农村妇女aaaaa视频| 亚洲综合成人网| 乱老熟女一区二区三区| 久久久久久久国产精品影院| 欧美成人精品一区二区综合免费| 久久国产人妖系列| 日韩有码免费视频| 亚洲激情黄色| 国产亚洲精品久久久久久久| 成人区精品一区二区婷婷| 免费精品视频一区二区三区| 精品少妇3p| 高清不卡日本v二区在线| 欧美黄页免费| 国产精品网红福利| 三上悠亚亚洲一区| 欧美一级bbbbb性bbbb喷潮片| 日本伦理一区二区| 插插插亚洲综合网| 麻豆视频网站在线观看| 三级精品视频久久久久| 东热在线免费视频| 亚洲日本欧美日韩高观看| 日韩在线免费看| 日韩风俗一区 二区| 无码国产精品一区二区色情男同 | 大地资源二中文在线影视观看| 国产69精品一区二区亚洲孕妇| 婷婷激情小说网| 久久99九九99精品| 午夜精品久久久久久久99热影院| 丝袜国产日韩另类美女| 亚洲爆乳无码专区| 久久电影一区| 一本久道中文无码字幕av| 久久亚洲风情| 国产一级不卡毛片| 日本中文字幕一区| 蜜臀一区二区三区精品免费视频| 免费高清不卡av| 亚洲一二区在线观看| 国产美女娇喘av呻吟久久| 波多野结衣电影免费观看| 国产精品一级片| 国产综合内射日韩久| 暴力调教一区二区三区| 日本黄色网址大全| 国产精品欧美一区喷水| 中日韩一级黄色片| 一区二区欧美精品| 国产一区二区三区影院| 一本到一区二区三区| 亚洲中文无码av在线| 欧美欧美午夜aⅴ在线观看| 国产美女永久免费| 亚洲精品电影网| 成人综合影院| 欧美大片免费观看| 中文av在线全新| 成人精品一区二区三区| 在线播放一区二区精品视频| 国产伦精品一区二区三区四区免费| 欧美男男freegayvideosroom| 日本免费高清一区| 在线成人直播| 五十路熟女丰满大屁股| 三级影片在线观看欧美日韩一区二区| 鲁一鲁一鲁一鲁一av| 国产v综合v亚洲欧| 黄色三级生活片| 亚洲黄色性网站| 无码人妻丰满熟妇区五十路| 7878成人国产在线观看| 婷婷综合激情网| 日韩最新av在线| 欧美13videosex性极品| 国产精品一区专区欧美日韩| 成人看片爽爽爽| 亚洲欧美成人一区| 中文欧美日韩| 91精品视频国产| wwwwww.欧美系列| 乱h高h女3p含苞待放| 色婷婷精品大视频在线蜜桃视频| 国产露脸国语对白在线| 亚洲欧美日韩一区二区三区在线| yellow91字幕网在线| 日本精品免费一区二区三区| 欧美影院在线| 一本一道久久久a久久久精品91| 一本色道久久| 性一交一黄一片| 中文字幕精品一区二区三区精品| 国产在线欧美在线| 欧美欧美欧美欧美| 国产在线免费观看| 久久久久久网址| 成人51免费| 亚洲国产一区二区精品视频| 国产亚洲精品自拍| 黑人无套内谢中国美女| 国产精品日韩成人| 在线视频一区二区三区四区| 欧美成人午夜电影| 男人的天堂在线视频免费观看| 欧美一区二区色| av综合网站| 麻豆视频传媒入口| 精品一区二区久久| 夫妇露脸对白88av| 欧美在线影院一区二区| 欧美日韩激情视频一区二区三区| 欧美人成在线视频| 国产精品久久久久久久久久辛辛 | 卡通欧美亚洲| 久久www免费人成精品| 亚洲图片在线| 精品人妻人人做人人爽夜夜爽| 亚洲欧洲成人自拍| 亚洲综合网av| 日韩小视频网址| 久久精品嫩草影院| 神马影院一区二区| 日本不卡一二三区黄网| 中字幕一区二区三区乱码| 一本大道av伊人久久综合| 台湾av在线二三区观看| 91精品国产色综合| 蜜臀av免费一区二区三区| 欧美三级一级片| 99久久综合国产精品| 久久久国产精品成人免费| 亚洲精品久久久久中文字幕欢迎你| 欧美性video| 国产精品一区二区三区精品| 亚洲婷婷免费| xxxx黄色片| 欧美性猛交丰臀xxxxx网站| 嫩草在线播放| 国产精品精品久久久久久| 精品国产1区| 亚洲欧美视频二区| 中文字幕综合网| 精品人妻aV中文字幕乱码色欲 | 亚洲视频在线二区| 国内精品国产三级国产a久久| 国产老头老太做爰视频| 日韩精品一区二区三区在线 | 亚洲av午夜精品一区二区三区| 亚洲尤物在线视频观看| 日韩在线视频第一页| 欧洲午夜精品久久久| 综合伊思人在钱三区| 蜜臀视频一区二区三区| 中文字幕在线观看不卡视频| 97在线公开视频| 欧美激情综合亚洲一二区| 亚洲欧美校园春色| 中文av字幕在线观看| 亚洲最快最全在线视频| 日本精品专区| 国产欧美婷婷中文| 欧美日一区二区在线观看| 一区二区三区少妇| 欧美日韩精品一区二区| 美洲精品一卡2卡三卡4卡四卡| 精品乱码一区二区三区| 日本va欧美va瓶| 久久精品国产亚洲AV无码麻豆| 亚洲欧美另类在线观看| 91成人精品观看| 少妇无码av无码专区在线观看| 欧美极品aⅴ影院| 成人av手机在线| 国产91色在线|免| 你懂的网址国产 欧美| 欧洲女同同性吃奶| 91精品国产全国免费观看| 黄色aa久久| 免费成人进口网站| 2020日本不卡一区二区视频| 6—12呦国产精品| 琪琪亚洲精品午夜在线| 久久久久免费av| 无码国产69精品久久久久同性|