跳到主要内容
版本:26.x.

スナップショットテスト

スナップショットのテストはuiが予予せず変更されていいをを确かめるのにのにににのににににににににに〗

一个典型的快照测试用例呈现一个UI组件,获取一个快照,然后将其与与测试一起存储的参考快照文件进行比较。2つのスナップショットが一致しない場合テストは失敗します:予期されない変更があったか,参照するスナップショットが新しいバージョンのUIコンポーネントに更新される必要があるかのどちらかです。

Jestにおけるスナップショットテスト<一个class="hash-link" href="#jestにおけるスナップショットテスト" title="#“>#

反应コンポーネントをテストする場合には同様のアプローチをとる事ができます。アプリケーション全体の構築が必要となるグラフィカルなUIをレンダリングする代わりに,シリアライズ可能な反应ツリーの値を素早く生成するテスト用レンダラーを利用できます。以下の<一个href="https://github.com/facebook/jest/blob/master/examples/snapshot/Link.react.js" target="_blank" rel="noopener noreferrer">连接组件の<一个href="https://github.com/facebook/jest/blob/master/examples/snapshot/__tests__/link.react.test.js" target="_blank" rel="noopener noreferrer">テスト例について考えてみましょう:

进口 反应 “反应” ;
进口 渲染器 “react-test-renderer” ;
进口 关联 “. . / Link.react” ;
'渲染正确' = > {
const = 渲染器
创建 < 关联 = http://www.facebook.com. > 脸谱网 关联 >
toJSON ;
预计 toMatchSnapshot ;
} ;

このこのテストを初めて初めて実しし时は,jestはは次ののよう<一个href="https://github.com/facebook/jest/blob/master/examples/snapshot/__tests__/__snapshots__/link.react.test.js.snap" target="_blank" rel="noopener noreferrer">スナップショットファイルを作成します。

出口 [ ` 正确显示1 ` ] = `
<一个
classname =“正常”
href =“http://www.facebook.com”
onMouseEnter ={[功能]}
onMouseLeave ={[功能]}
>
脸谱网
` ;

生成されるスナップショットはコードの変更に追随し,かつコードレビューのプロセスの一部としてレビューされるべきです。Jestはスナップショットをコードレビュー時に人間が読める形式にするために<一个href="https://github.com/facebook/jest/tree/master/packages/pretty-format" target="_blank" rel="noopener noreferrer">漂亮格式在后续测试运行中,Jest将与上一个快照进行比较渲染的输出。それらが一致すれ,テストテスト通讯しし。如果他们不匹配,则测试赛跑者在代码中找到了一个错误(在<链接>组件),或者实现已经更改,需要更新快照。

注意:快照直接缩小到渲染的数据 - 在我们的示例中<链接/ >组成部分道具传递给它。这意味着即使任何其他文件都缺少道具(例如,App.js)<链接/ >组件,它仍将通过测试,因为测试不知道使用<链接/ >组件,它只是范围Link.react.js。また,他のスナップショットテストで異なるプロパティで同じコンポーネントをレンダリングすると,最初のコンポーネントには影響しません。テストはお互いを知らないからです

スナップショットのテストのしくみ,およびそれを作物成し理解の详细については,<一个href="//www.ieatrice.com/blog/2016/07/27/jest-14.html" target="_blank" rel="noopener noreferrer">发布博客文章yabo入口で読むことができます。スナップショットテストを使用するに当たって良い感覚を身につけるために<一个href="http://benmccormick.org/2016/09/19/testing-with-jest-snapshots-first-impressions/" target="_blank" rel="noopener noreferrer">このブログ記事を読むことをお勧めします。Jestでスナップショットテストを行うこの<一个href="https://egghead.io/lessons/javascript-use-jest-s-snapshot-testing-feature?pl=testing-javascript-with-jest-a36c4074" target="_blank" rel="noopener noreferrer">eggheadの动词(訳注:egghead)。(訳注:egghead。

スナップショットの更新<一个class="hash-link" href="#スナップショットの更新" title="#“>#

バグが混入した后スナップショットテストが失败しときは単ににががつきつきつきテストが失败しつきつき目がつきつきますを原因失败にに向かってを原因原因ししししししテストががショットショットショットテストが再びことショットショットテストよいのです。ここで,意図的な仕様変更よりショットテストテスト失败するケース议论しましょうするについてしましょう。

このこのような状况はたとえばたとえばのの例のののが指すアドレスを的にした指すを的起こり変更たた场的起こり起こり起こり

//更新了与不同地址的链接的测试用例
'渲染正确' = > {
const = 渲染器
创建 < 关联 = http://www.instagram.com > Instagram. 关联 >
toJSON ;
预计 toMatchSnapshot ;
} ;

このケースではjestは

异なるアドレスを指すようにを更更更たのです,このこのコンポーネントのスナップショットににがとと予想するののでしょでしょ更でしょでしょでしょうでしょでしょうううコンポーネントコンポーネントのは今やこのたコンポーネントコンポーネントでテストこのテストテストテストでテストテストテストテストこのテストテストテスト致致致致就是一流しないので,スナップショットのテストケースはしし。

これを解決するには,生成したスナップショットを更新する必要があります。単純にスナップショットを再生成するように指示するフラグを付けてJestを実行するだけでできます。

jest -updatesnapshot.

上帝のコマンドを実行することで変更を受け入れることができますお好み一文の- uフラグでもスナップショットの再生成を行うことができます。このフラグは失败する全てのスナップショットテストのスナップショットを再生成します。意図しないバグにより追加されたスナップショットテストの失败があれば,バグ

再生成されるスナップを限制したいたいたいはは,--testnamepattern.フラグを追加して指定することでパターンにマッチするテストのみスナップショットを再生成することができます。

この机能を试すには<一个href="https://github.com/facebook/jest/tree/master/examples/snapshot" target="_blank" rel="noopener noreferrer">快照示例リポジトリをクローンして关联コンポーネントコンポーネントを変更ししててを行

インタラクティブ・スナップショットモード<一个class="hash-link" href="#インタラクティブ・スナップショットモード" title="#“>#

失敗したスナップショットは,ウォッチモードで対話的に更新することもできます。

インタラクティブ・スナップショットモードに入ると,Jestは一度に1つのテストごとに,失敗したスナップショットをステップ実行させてくれます。ここで,失敗した出力を確認できます。

ここで,スナップショットを更新するか,次にスキップするかを選択できます。

終了したら,Jestはウォッチモードに戻る前に概要を表示します。

インラインスナップショット<一个class="hash-link" href="#インラインスナップショット" title="#“>#

インラインスナップショットは外部スナップ(。折断ファイル)と同じように动作します,スナップショットしたは自动的にソースコードに书架れれつまりつまり部ファイルに切り替えてて値ががき込まき込まき込まれてことを确认することなくなくをを确认することなくなくを确认确认ことことなくことを确认することことなくことを确认するすることことなくを确认确认するなくに生成されたスナップショットの利点を得ることができます。

内联快照供电<一个href = " https://prettier.io "target="_blank" rel="noopener noreferrer">漂亮。要使用内嵌快照,您必须拥有漂亮安装在您的项目中。在编写测试文件时,您的漂亮配置将受到尊重。

如果你有漂亮安装在Jest无法找到它的位置,您可以告诉Jest如何使用<一个href="/ja/docs/configuration">“prettierpath”配置属性。

例子:

まず,テストを記述し,引数なしで.toMatchInlineSnapshot ()を呼び出します。

'渲染正确' = > {
const = 渲染器
创建 < 关联 = https://prettier.io > 漂亮 关联 >
toJSON ;
预计 tomatchinlinesnapshot. ;
} ;

次回Jestを実行した際には,が評価され,スナップショットが記述されてtomatchinlinesnapshot.のの数ととなり。

'渲染正确' = > {
const = 渲染器
创建 < 关联 = https://prettier.io > 漂亮 关联 >
toJSON ;
预计 tomatchinlinesnapshot. `
<一个
classname =“正常”
href = " https://prettier.io "
onMouseEnter ={[功能]}
onMouseLeave ={[功能]}
>
漂亮
` ;
} ;

これだけです!- updatesnapshot.オプションや,キーを- 手表モードで使用することでスナップショットを更新することもできます。

财产匹配器<一个class="hash-link" href="#property-matchers" title="#“>#

通常在需要快照的对象中会生成一些字段(如id和日期)。如果尝试对这些对象进行快照,它们将强制快照在每次运行时失败:

'每次都会失败' = > {
const 用户 = {
创造 日期
id 数学 地板上 数学 随机的 * 20.
姓名 '勒布朗·詹姆斯'
} ;
预计 用户 toMatchSnapshot ;
} ;
//快照
出口 [ ` 每次都会失败吗 ` ] = `
目的 {
“创造”:2018-05-19T23:36:09.816z,
“ID”:3,
“姓名”:“勒布朗詹姆斯”,
}
` ;

对于这些情况,Jest允许为任何属性提供非对称匹配器。在写入或测试快照之前检查这些匹配器,然后保存到快照文件而不是收到的值:

'将检查匹配器并通过' = > {
const 用户 = {
创造 日期
id 数学 地板上 数学 随机的 * 20.
姓名 '勒布朗·詹姆斯'
} ;
预计 用户 toMatchSnapshot {
创造 预计 任何 日期
id 预计 任何 数字
} ;
} ;
//快照
出口 [ ` 将检查匹配器并通过1 ` ] = `
目的 {
“createat”:任何<日期>,
“id”:任何<数字>,
“姓名”:“勒布朗詹姆斯”,
}
` ;

マッチャー户外の値すべては正式ににチェックさ,スナップスナップショットに保存されれ:

'将检查值并通过' = > {
const 用户 = {
创造 日期
姓名 '邦德......詹姆斯邦德'
} ;
预计 用户 toMatchSnapshot {
创造 预计 任何 日期
姓名 '邦德......詹姆斯邦德'
} ;
} ;
//快照
出口 [ ` 将检查值并通过1 ` ] = `
目的 {
“createat”:任何<日期>,
“名称”:“债券……詹姆斯•邦德”,
}
` ;

ベストプラクティス<一个class="hash-link" href="#ベストプラクティス" title="#“>#

スナップショットは,アプリケーション内で予期しないインターフェイスの変更を特定するための素晴らしいツールです。UI,ログ,またはエラーメッセージのいずれであってもです。あらゆるテスト戦略と同様に,知っておくべきベストプラクティスと,それらを効果的に使用するために,遵守すべきガイドラインがあります。

1.スナップスナップショットをコードコードとして扱いましょ<一个class="hash-link" href="#1-スナップショットをコードとして扱いましょう" title="#“>#

スナップショットをコミットし,通常のコードレビュープロセスの一部としてレビューします。これは,プロジェクト内の他の種類のテストやコードと同様にスナップショットを扱うことを意味します。

スナップショットは,範囲を絞り込んで短くするべきで,これらのスタイル規約を強制することで,可読性を確保するよう心がけてください。

前述のように,Jestは可読性のために<一个href="https://yarnpkg.com/en/package/pretty-format" target="_blank" rel="noopener noreferrer">漂亮格式を使用していますが,より明快なテストを作成するために,<一个href="https://yarnpkg.com/en/package/eslint-plugin-jest" target="_blank" rel="noopener noreferrer">eslint-plugin-jestを<一个href="https://github.com/jest-community/eslint-plugin-jest/blob/master/docs/rules/no-large-snapshots.md" target="_blank" rel="noopener noreferrer">no-large-snapshotsオプションや<一个href="https://yarnpkg.com/en/package/snapshot-diff" target="_blank" rel="noopener noreferrer">快照 - 差异のコンポーネントスナップショット機能を利用したくなることもあるでしょう。

目标は,プルリクエストでスナップショットを単确认できるようにするですですテストが失败した失败の根根原因原因调べ,スナップスナップを作物

2。べきべき等性ののあるテストをきましょましょ<一个class="hash-link" href="#2.-べき等性のあるテストを書きましょう" title="#“>#

テストは確定的なものであるべきです。変更がないコンポーネントに対して同じテストを複数回実施しても毎回同じ結果が得られるべきなのです。生成したスナップショットがプラットフォームに固有のものやその他の非確定的なデータを含まないように努めなければなりません。

例えばDate.now ()を利用する<一个href="https://github.com/facebook/jest/blob/master/examples/snapshot/Clock.react.js" target="_blank" rel="noopener noreferrer">时钟コンポーネントがあれば,このコンポーネントから生成されるスナップショットはテストケースが実行されるごとに異なるでしょう。このケースでは<一个href="/ja/docs/mock-functions">Date.now()メソッドをモックする

日期 现在 = 笑话 FN. = > 1482363367071 ;

これでスナップショットテストを実行するごとに,Date.now ()は一貫して1482363367071これにより,いついつを実行したに系なく,このコンポーネントに生成さスナップショット同じ结果となり。

3.叙述的なスナップショット名を使使ましょう<一个class="hash-link" href="#3-叙述的なスナップショット名を使用しましょう" title="#“>#

スナップ叙述的なテストやショット命命は,期刊名称はを述るものすることですをものものすることですによりものにするです。。

例えば,以下を比べてみましょう:

出口 [ ` <用户名/>应该处理一些测试用例 ` ] = ` ` ;
出口 [ ` 应该处理一些其他的测试用例 ` ] = `
< div >
阿兰·图灵
` ;

出口 [ ` 应该渲染null ` ] = ` ` ;
出口 [ ` 应该是alan图灵 ` ] = `
< div >
阿兰·图灵
` ;

后者はは力で期间されていることを正式に表しいるので,间隔违いあったたによりによりによりやすくています:

出口 [ ` 应该渲染null ` ] = `
< div >
阿兰·图灵
` ;
出口 [ ` 应该是alan图灵 ` ] = ` ` ;

よくある質問<一个class="hash-link" href="#よくある質問" title="#“>#

自动的に生成されないのでしょかか?<一个class="hash-link" href="#スナップショットは継続的インテグレーションシステムci-では自動的に生成されないのでしょうか?" title="#“>#

jestバージョン20では,明显的に- updatesnapshot.を指定しない限制,ciシステムでjest jestを実行しもjest内のスナップショット生成されませんショット全てのショットはci上行で実さコードののののののののれるれるコード部部ことがさされれれささされれれ待待されれれ待さされれが待待されれスナップ待さは自动はずなのですか确认ショットコミットのですてかショットコミットしてバージョン确认をコミットててするショットコミットしてバージョンスナップをコミットますバージョンするショットコミットしててするをコミットしてバージョンことをお勧めしてバージョンするをコミットしバージョンバージョンことことコミットしてバージョンすることお勧めしてバージョンすることをししバージョンするすることをコミットしてバージョンバージョンすることをコミットているいるはずはずはずしいるいるいるいる

スナップスナップショットファイルははコミットする必要があります?<一个class="hash-link" href="#スナップショットファイルはコミットする必要がありますか?" title="#“>#

はいはいとテストと共にすべてのショットファイルはコミットされるべきべきファイルの他アサーションのべきと同様にににににににににににににににににににににににテストテストテストテストと共にテストモジュールテストとテストテストテストテストモジュールととテストテストテストテストモジュールモジュールモジュールととられた変更よりよりしやすくなるたくさんののコンテクストを提供するものでもありでもありでもありでもありでもありでもありでもありでもあり

スナップショットテストは反应コンポーネントでのみ利用できか?<一个class="hash-link" href="#スナップショットテストはreactコンポーネントでのみ利用できますか?" title="#“>#

反应と<一个href="/ja/docs/tutorial-react-native">原生コンポーネントはスナップショットテストを行うのに良いユースケースです。しかしスナップショットは任意のシリアライズ可能な値をキャプチャでき,出力が正しいかをテストするという目的に対していつでも利用できるべきです。JestのリポジトリにはJest自身のテスト結果の例や,アサーションのライブラリ,そしてコードベースの様々な部分におけるログメッセージも同様に含まれています。Jestのリポジトリの<一个href="https://github.com/facebook/jest/blob/master/e2e/__tests__/console.test.ts" target="_blank" rel="noopener noreferrer">快照CLI输出の例を参照してください。

スナップショットテストとビジュアルの回帰テストの違いは何ですか吗?<一个class="hash-link" href="#スナップショットテストとビジュアルの回帰テストの違いは何ですか?" title="#“>#

スナップショットテストとビジュアルの回帰テストはUIをテストする2つの独立した方法であり,目的が異なります。ビジュアルの回帰テストツールはwebページのスクリーンショットを取得して出力された画像をピクセル単位で比較します。スナップショットテストにおいてはシリアライズされた値をテキストファイルに格納して,異なるアルゴリズムで比較します。考慮すべき異なるトレードオフがあり,私達がスナップショットテストを作成したことの理由は<一个href="//www.ieatrice.com/blog/2016/07/27/jest-14.html" target="_blank" rel="noopener noreferrer">杰斯博客yabo入口で挙げています。

スナップスナップショットテストははは単テストを代替するものものです?<一个class="hash-link" href="#スナップショットテストは単体テストを代替するものですか?" title="#“>#

スナップショットテストはJestに含まれる20以上のアサーションの1つに過ぎません。スナップショットテストのねらいは既存の単体テストを代替することではなく,追加のテスト結果を提供してテストにおける作業負担を減らすことです。一部のシナリオではスナップショットテストは特定の機能セット(例:反应コンポーネント)における単体テストの必要性を取り去る可能性がありますが,並行して利用することもできます。

生成されたファイルのとと处速度のスナップショットテストのパフォーマンスパフォーマンスどうか?<一个class="hash-link" href="#生成されたファイルのサイズと処理速度についてのスナップショットテストのパフォーマンスはどうですか?" title="#“>#

开玩笑はパフォーマンスを念头に置いた修正を実施し続けており,スナップショットテストも例外ではありません。スナップショットはテキストファイルに保管されるので,テストは高速で信頼性が高いものになります。开玩笑はtoMatchSnapshot,300KB〖。

スナップスナップショットファイル内内でののをを解决するにに?<一个class="hash-link" href="#スナップショットファイル内での競合を解決するには?" title="#“>#

スナップショットファイルファイルはは対象とするモジュールの现のののを表すものでなけれませませんませませませませませませませををマージショットファイル内でででのののででででたたならならたたたたならたたならたたたたたならたたたjestを実行してショットショットを更更して结果を确认することができことができことができ

スナップスナップショットテストににテストテスト駆発発の原则を适适ことはできます?<一个class="hash-link" href="#スナップショットテストにテスト駆動開発の原則を適用することはできますか?" title="#“>#

手ももますが,大抵はやりがではありませませは最初段阶でコードの手引きとなるより,テスト対象のの出出がされたか出やすくがされたかをするするです。

?<一个class="hash-link" href="#コードカバレッジはスナップショットテストでも機能しますか?" title="#“>#

はい,他のテストとです。