精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

少妇高潮av久久久久久| 国产伦精品一区二区三区| free性中国hd国语露脸| 日韩pacopacomama| 最新日韩在线视频| 国产v亚洲v天堂无码| av无码av天天av天天爽| xx欧美视频| 亚洲日本青草视频在线怡红院| 北条麻妃高清一区| 艳妇荡乳欲伦69影片| 精品国产第一国产综合精品| 婷婷丁香久久五月婷婷| 亚洲激情图片| 波多野结衣不卡| 欧美成人综合| 亚洲人免费视频| 成人性生交视频免费观看| 番号集在线观看| 日韩午夜高潮| 日韩中文字幕亚洲| 国产网站无遮挡| 亚洲国产精品免费视频| 国产日产欧产精品推荐色 | 亚洲视频axxx| 亚洲女则毛耸耸bbw| 成人精品三级| 欧美日韩午夜剧场| 91精品国产毛片武则天| 国产毛片av在线| 99精品久久只有精品| 色综合久久久久久中文网| 特级西西www444人体聚色| 超碰97成人| 欧美一级免费大片| 国产三级精品三级在线| 国产成人精品亚洲日本在线观看| 亚洲黄色在线视频| 亚洲国产精品123| 久草视频视频在线播放| 成人av电影在线网| www久久99| www日本高清| 激情综合亚洲精品| 国产色视频一区| 丰满熟女人妻一区二区三| 香蕉精品999视频一区二区| 国模极品一区二区三区| 国产亚洲无码精品| 懂色av一区二区| 欧美日韩加勒比精品一区| 一本大道东京热无码aⅴ| 永久av在线| 国产精品无遮挡| 亚洲国产日韩综合一区| 成人在线免费公开观看视频| 国产日产精品一区| 亚洲精品国产精品国自产观看| 国产永久免费高清在线观看| 国产午夜精品久久久久久免费视 | 全球成人免费直播| 在线观看91精品国产麻豆| 成年人在线看片| 国产 日韩 欧美一区| 色吊一区二区三区| 国产又黄又猛又粗| 国产精品原创视频| 欧美丰满高潮xxxx喷水动漫| 涩多多在线观看| 日韩免费一级| 亚洲国产精品va在线观看黑人| 亚洲色图欧美另类| 天天久久夜夜| 尤物九九久久国产精品的分类| 欧美一区二区三区粗大| 天天久久综合| 欧美激情一区二区三区成人 | 欧美日一区二区在线观看 | 成人欧美一区二区三区的电影| 午夜成人免费电影| 亚洲精品自在在线观看| 激情在线小视频| 一区二区三区久久| 亚洲不卡中文字幕无码| 3d性欧美动漫精品xxxx软件| 欧美日韩电影在线| 中文字幕一区二区三区人妻在线视频| 给我免费播放日韩视频| 亚洲视频免费一区| 久久久久久视频| 亚洲第一精品影视| 国产精品91在线| 国产免费一区二区三区免费视频| 岛国av在线一区| 日韩精品不卡| 午夜dj在线观看高清视频完整版| 天天综合网 天天综合色| 九热视频在线观看| 一区二区日韩| 国产一区二区三区在线看| 丝袜美腿小色网| 久久黄色网页| av资源一区二区| 都市激情一区| 五月天一区二区三区| 日日摸天天爽天天爽视频| 国产一区二区三区免费在线| 日韩精品丝袜在线| av在线免费播放网址| 亚洲精品护士| 成人激情视频在线播放| 日韩美女一级视频| 亚洲自拍欧美精品| jizz18女人| 免费成人av| 久久久久国产精品一区| 国产又黄又粗又长| 久久久99免费| 夜夜添无码一区二区三区| 搜成人激情视频| 亚洲第一页自拍| 永久免费看片直接| 日韩成人精品在线| 久久精品国产精品青草色艺| 亚洲aaa在线观看| 亚洲日穴在线视频| 亚洲国产精品三区| 要久久电视剧全集免费| 久久久久久尹人网香蕉| 99热这里只有精品66| 国产亚洲欧美日韩俺去了| 97超碰人人澡| 国产日韩三级| 色综合天天综合网国产成人网| 中文字幕在线播放日韩| 久久精品一区四区| 丝袜老师办公室里做好紧好爽| 一区二区在线免费播放| 久久久精品国产网站| 中文字幕 视频一区| 久久久精品影视| 青青草原成人网| 亚洲色图美女| 青青草成人在线| 四虎精品在线| 一本色道久久综合亚洲精品按摩| 美女网站免费观看视频| 日韩母乳在线| 国产91ⅴ在线精品免费观看| 天堂av一区二区三区| 国产欧美一区在线| 美女网站免费观看视频| 成人综合久久| 国产狼人综合免费视频| 日本免费视频在线观看| 欧美放荡的少妇| 精品国产乱码久久久久久鸭王1| 国产综合一区二区| 黄色小视频大全| 日韩视频在线直播| 久久久久久久久久久免费| 丰满岳乱妇国产精品一区| 亚洲一卡二卡三卡四卡无卡久久| 国产av一区二区三区传媒| 最新日韩在线| 久久久久网址| 日韩漫画puputoon| 色av吧综合网| 日本天堂网在线| 2021中文字幕一区亚洲| 黄色高清视频网站| 精品国产一区二区三区性色av| 欧美精品一区二区免费| 成人乱码一区二区三区 | 免费的一级黄色片| 风间由美一区二区av101| 91国产美女视频| 番号集在线观看| 日韩区在线观看| 久久午夜免费视频| 欧美国产一区视频在线观看| 成人性生交视频免费观看| 亚洲经典自拍| 夜夜爽99久久国产综合精品女不卡| 国产精品亚洲一区二区在线观看| 欧美肥老妇视频| 欧美婷婷久久五月精品三区| 欧美色图天堂网| 久久久久久福利| 久久久久久久久久久黄色 | 菠萝蜜视频在线观看入口| 国语一区二区三区| 国产精品爱久久久久久久| 国产91在线视频蝌蚪| 亚洲国产精品中文| 亚洲熟妇无码久久精品| 亚洲专区一二三| 摸摸摸bbb毛毛毛片| 国产精品亚洲午夜一区二区三区| 日韩电影大全在线观看| 国产麻豆精品| 国产aaa精品| 欧洲在线视频| 中文字幕在线成人| 神宫寺奈绪一区二区三区| 精品视频在线视频| 香蕉免费毛片视频| 一区视频在线播放| 亚洲AV无码国产成人久久| 国产精品亚洲午夜一区二区三区| 激情综合网俺也去| 影院欧美亚洲| 99久久久无码国产精品性色戒| 亚洲丁香日韩| 国产精品免费观看高清| 亚洲ww精品| 欧美精品日韩三级| 触手亚洲一区二区三区| 亚洲аv电影天堂网| 91亚洲精品国偷拍自产在线观看| 黑人巨大精品欧美一区免费视频 | 你懂的成人av| 相泽南亚洲一区二区在线播放 | 美日韩一区二区三区| 尤物av无码色av无码| 综合一区在线| 亚洲精品欧美精品| 国产剧情一区| 久久久久九九九| 盗摄系列偷拍视频精品tp| 成人黄色在线观看| 色999韩欧美国产综合俺来也| 全亚洲最色的网站在线观看| zzzwww在线看片免费| 欧美巨乳在线观看| fc2ppv国产精品久久| 色噜噜国产精品视频一区二区 | 97国产精东麻豆人妻电影| 国模 一区 二区 三区| 国产欧美亚洲日本| 亚洲精品在线a| 69堂成人精品视频免费| 99久久99九九99九九九| 国产男女猛烈无遮挡91| www.久久.com| 国产精品午夜国产小视频| 第84页国产精品| 日本精品性网站在线观看| 深夜福利视频一区二区| 91精品国产成人| 日韩伦理在线一区| 欧美在线视频免费| 欧美成人资源| 国产国语videosex另类| 欧美色网在线| 91精品免费看| 欧美视频二区欧美影视| 成人永久免费| 麻豆一区一区三区四区| 久久综合一区二区三区| 自拍视频一区| 西游记1978| 中文视频一区| 日韩 欧美 视频| 亚洲制服少妇| 亚洲成人天堂网| 国产在线国偷精品产拍免费yy| 精产国品一二三区| 成人av午夜电影| 免费观看av网站| 国产精品久久久久三级| 国产一区二区三区在线视频观看| 樱花影视一区二区| 色播视频在线播放| 在线免费不卡电影| 亚洲国产精品成人无久久精品| 国产天堂亚洲国产碰碰| av资源在线免费观看| 亚洲美女淫视频| 国产大片中文字幕在线观看| 国产精品网站一区| 欧美成人精品激情在线视频| 亚洲成a人片综合在线| 天干夜夜爽爽日日日日| 欧美日本免费一区二区三区| 成人高潮片免费视频| 日韩成人小视频| 欧美日韩视频在线播放| 高清欧美性猛交xxxx| 免费观看成人性生生活片 | 亚洲精品国产精| 亚洲欧美日韩视频一区| 国产午夜精品久久久久免费视| 欧美极度另类性三渗透| 亚洲四虎影院| 国产精品一区二区欧美| 欧美日韩伦理| 韩日视频在线观看| 麻豆一区二区三区| 国产一级二级视频| 国产精品1区二区.| 在线免费观看日韩av| 亚洲欧美视频一区| 日日夜夜狠狠操| 欧美α欧美αv大片| 成人av电影观看| 国内精品小视频| 成人综合日日夜夜| 欧美三级华人主播| 激情自拍一区| 男女污污视频网站| 国产午夜精品一区二区三区视频 | 91久久久一线二线三线品牌| 美女久久久久| 丁香花在线影院观看在线播放| 久久精品国产77777蜜臀| 国产精品亚洲无码| 亚洲国产精品综合小说图片区| 91麻豆国产在线| 国产午夜精品麻豆| 丁香花电影在线观看完整版 | www青青草原| 欧美日韩日日摸| 国产污视频在线| 欧美亚洲国产成人精品| 国产96在线亚洲| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 | 亚洲精品大尺度| 成人性生交大片免费看网站| 国产啪精品视频| 成人无号精品一区二区三区| 亚洲人成无码www久久久| 2023国产一二三区日本精品2022| 国产亚洲精品女人久久久久久| 91精品欧美福利在线观看| 成人资源www网在线最新版| 国产精品99一区| 国产成人短视频在线观看| 人妻少妇被粗大爽9797pw| 成人免费av在线| 日产精品久久久久久久| 欧美r级在线观看| 国产精品—色呦呦| 不卡视频一区二区三区| 欧美三级黄美女| 欧洲熟妇的性久久久久久| 亚洲国产成人高清精品| 懂色av一区二区三区四区 | 日本另类视频| 婷婷亚洲婷婷综合色香五月| 蜜臀精品久久久久久蜜臀| 亚洲毛片亚洲毛片亚洲毛片| 欧美日韩专区在线| 免费在线看黄色| 亚洲自拍偷拍福利| 亚洲一级黄色| 给我看免费高清在线观看| 日韩欧美aaa| 大胆av不用播放器在线播放 | 国产日韩精品一区二区三区在线| 亚洲中文字幕无码爆乳av| 中文字幕日韩欧美在线| 国产精品久久久久久久久久久久久久久 | 欧美精品三区| 欧美激情 亚洲| 日韩欧美国产激情| 大地资源中文在线观看免费版| 成人a免费视频| 精品动漫3d一区二区三区免费版| 国产一级免费片| 色www精品视频在线观看| 香蕉视频网站在线观看| 亚洲a中文字幕| 99在线精品视频在线观看| 在线视频第一页| 欧美一区二区视频观看视频| 9lporm自拍视频区在线| 欧美一区二区三区四区夜夜大片 | 久久精品国产99国产精品澳门| 高清精品久久| 热99这里只有精品| 欧美国产国产综合| av网站在线观看免费| 2019中文字幕全在线观看| 日韩www.| 国产黄色三级网站| 欧美午夜精品一区二区蜜桃 | 成人看的羞羞网站| 亚洲精品乱码久久久久久9色| 精品久久久久人成 | 97精品在线视频| 无人区乱码一区二区三区| 久色视频在线播放| 国产欧美一二三区| 丰满人妻一区二区三区免费视频| 热久久这里只有| 午夜精品影院| 能直接看的av| 亚洲激情 国产| 久久精品九色|