Jest: 最埌のテストが完了した埌、Jestプロセスが終了しない

䜜成日 2016幎08月18日  Â·  60コメント  Â·  ゜ヌス: facebook/jest

最埌のテストが完了した埌、Jestプロセスが完了しないずいう問題がありたす。 ナヌザヌは、ctrl-cを䜿甚しおプロセスを匷制的に終了する必芁がありたす。 私の理論では、すべおのリ゜ヌスがテスト䜜成者によっお適切にクリヌンアップされおいるわけではありたせんが、理想的にはJestはずにかく終了する必芁がありたす。

具䜓的には、Firebaseをfirebase-serverでテストしおおり、テストごずに1぀以䞊のサヌバヌを起動しおいたす。 afterEachアクションでは、最埌のテストで䜜成されたすべおのサヌバヌに察しおcloseメ゜ッドを呌び出したすが、このメ゜ッドを䜿甚しおも、Jestプロセスは終了したせん。

テストが終了した合栌たたは䞍合栌ず、Jestプロセスを匷制的に終了する方法はありたすか afterAllフックを取埗しお、残っおいるすべおのリ゜ヌスをクリヌンアップする方法はありたすか Jestプロセスが終了するのを正確に劚げるものをデバッグする方法はありたすか ありがずう。

Enhancement Help Wanted good first issue

最も参考になるコメント

読んでいる人は誰でも--forceExitフラグを䜿甚しおこの機胜にアクセスできたす。 🎉

党おのコメント60件

珟圚、それを行うための良い方法はありたせん。 デバッガヌChrome Inspectorをフックしお、䜕が起こっおいるのかを把握するこずをお勧めしたす。 䜕が非同期䜜業を䜜成するかを知っおいる堎合は、モンキヌパッチを適甚しお远跡するこずもできたすPromise.prototype.thenの呚りに䜕かを眮くなど

すべおのafterEach / afterフックが解決されたずきに、非同期䜜業を匷制的に終了できない理由はありたすか

既存の非同期プロセスを凊理できない堎合、それらをどのように匷制終了するかはわかりたせん。

avaから移行したしたが、これは問題ではなかったので、答えがあるのでしょうか。 たぶんそれはNode.jsのprocess.exitです

それは可胜だず思いたすが、必芁なずきにぶら䞋がらず、リ゜ヌスを適切にシャットダりンしおいないのではないかず心配しおいたす。

cc @dmitriiabramovどう思いたすか

䞀䟋私は実際にJestでこれに遭遇したした。そこでは、Jest自䜓を終了させない長時間実行されおいるりォッチャヌプロセスがありたした。 Jestがテスト実行䞭に自殺したずしたらええず、私はこの問題に気付かなかったでしょうし、人々がそれを䜿おうずするずハングするバヌゞョンを出荷したでしょう。

プロセスを匷制的に匷制終了しおも安党かどうかはわかりたせん。 同時に、テストの完了埌に非同期埌凊理を実行したい堎合は、 after allフックを䜿甚しお、プロセスを終了する前に終了するのを埅぀こずができたす。

もう1぀の問題は、印刷が完了する前に出力ストリヌムをカットするこずです。 以前、プロセスが終了する前に゚ラヌメッセヌゞを印刷するのに十分な時間がないずきに、この問題が発生したした。

問題は、Jestが「䞀郚のテストが自分たちでクリヌンアップされおいないようです。これが䜕が起こっおいるのか」ず蚀う方法を理解できるかどうかです。

after allフックはここで私を助けるこずができたす、しかし私はドキュメントでそのようなこずを芋おいたせん afterEach 私は䜕かを逃しおいたすか

正しいクリヌンアップのテストに関しおは、_files_が時間どおりに完了しおいるかどうか、および問題を特定するためにバむセクト機胜を䜿甚しおいないかどうかをテストできるかどうかrspecのように。

わかりたした。さらに調査した結果、これはFirebase自䜓に問題があるようで、 process.exitを呌び出す以倖にクリヌンアップする方法はありたせん。

リ゜ヌス

すべおの回避策には、手動でprocess.exit呌び出すこずが含たれたす。 Jestのコンテキストでこれを行うこずを恐れおいたすが、そのような電話をかける堎所に関する掚奚事項はありたすか 私の最初の考えは次のようなものでした

afterAll(() => setTimeout(() => process.exit(), 1000))

 すべおのテストの実行が終了しおから1秒埌に終了し、Jestに凊理を実行させたす。ただし、これがりォッチモヌドにどのように圱響するかはわかりたせん。正しい堎合、Jestは、これが期埅どおりに機胜しない可胜性のあるいく぀かの凝った䞊列凊理を実行したす。 あるいは、これはJestで修正する必芁があるものでしょうか これが倚くの人にずっおフットガンのように思えるなら、ゞェストに入れおみたせんか たたは、少なくずも「譊告」モヌドず「匷制終了」モヌドを切り替えたす。

mochaず同様に、テストの完了時にプロセスを自動的に閉じる--exitフラグなどファむルごずのコメントなどが欲しいです。 すべおのテストファむルのすべおの接続を手動で閉じるのは少し面倒です。

Codeshipでテストを実行するず、同じ問題が発生drone.ioでも
ただし、ロヌカルでは正しく機胜したす。

線集

  • ゞェストバヌゞョン15.1.1
  • ロヌカル

    • ノヌド6.2.2

    • npm3.9.5

  • CodeShip 

    • ノヌド6.5.0

    • npm3.10.3

  • Drone.io

    • ノヌド0.10.26

    • npm1.4.3

Firebaseを修正する必芁があるように思えたす。

--forceExitAfterTestRunずいうオプションを远加するこずに予玄はありたせんが、簡単に远加できるはずです。 ここで終了するには倉曎が必芁だず思いたす https 

ある皮の競合状態のようです。 すべおのテストをロヌカルで実行した埌に終了する堎合もあれば、終了しない堎合もありたす...

モックの代わりに実際のデヌタベヌスを䜿甚しおいるAPI仕様にJestを䜿甚し始めた埌も、これを実行しおいたす申し蚳ありたせんが😇が、スナップショットはこれに最適です。 afterAllフックを远加しお接続をクリヌンアップした埌でも、問題を解決するこずができたした。これは、デバッグが最も簡単ではなく、 setupFilesのフィクスチャの母集団に䜕らかの関係があるず信じおいたす。

ゞャスミンには--forceexitオプションがあるようですので、同様のものがゞェストにも届くかどうかは文句を蚀いたせん🙏

別の問題-テストが倱敗した堎合、 afterAll()は呌び出されないため、䜕もクリヌンアップされず、䜕も閉じられたせん。 --bailこれが修正されるず思いたすが、ただ詊しおいたせん

誰かがPRを送りたいのなら、これは私たちが助けを借りるこずができるものであり、私は以前のコメントで詳现を抂説したした:)

週末に時間があれば、詊しおみたす。 誰かがその前にそれをやりたいのなら、それはクヌルだろうsmile

開店したばかりのPRに賛成しお閉䌚。 そこで議論を続けたす。

読んでいる人は誰でも--forceExitフラグを䜿甚しおこの機胜にアクセスできたす。 🎉

グヌグルの堎合JestはJenkins CIで終了したせんが、ロヌカルでは終了したす。 --forceExit確かに私のために修正したした。

私にずっおは、.then=> {}でpromiseを凊理するのを忘れおいたした-仕事をしたした

私はただこれに苊劎しおいたす。 asyncずawait䜿甚しおAPIをテストしおいたす。 Expressアプリケヌションに接続しお゚ンドポむントにpingを実行したしたが、テストが終了したせん。 mongodbずサヌバヌぞの接続を閉じようずしたしたが、ただ開いおいたす。 空のjsonのみを送り返したす。

私の堎合、これはFirebaseの問題になりたした。 䜿甚する

afterAll(() => {
  firebaseApp.database().goOffline();
  firebaseApp.delete();
});

トリックをするようです。 䞡方の行が実際に必芁であり、元々 .initializeApp()から取埗したものず同じfirebaseAppを䜿甚する必芁があるこずがわかりたした。

forceExitなしでこれを解決する方法はありたすか

Jest 23には、Jestが終了できない理由の゜ヌスを瀺す--detectOpenHandlesずいうフラグが含たれおいたす。

--detectOpenHandlesはmongoose.connectずmongoose.modelを返したす。 afterAllでmongoose.disconnectを実行しようずするず、mongo゚ラヌトポロゞが砎棄されたす。

screenshot 2018-06-08 11 14 51
screenshot 2018-06-08 11 14 29

@elkhanは、マングヌスの問題を解決する方法を理解しおいたすか

--detectOpenHandles远加した埌、Jestはテストを完了するだけでなく、実際にJestをブロックするものを衚瀺したせん。これは奇劙なこずです。 バグのようです。

私の堎合、 --forceExitで問題が解決し、同時に--detectOpenHandlesが、䜕も怜出されたせんロヌカルずCircleCIの䞡方。 私も--runInBandたす。

私にずっおは、 --runInBand削陀するこずで解決したした。

--forceExitは、shippableを䜿甚する堎合にも問題を解決したす... --detectOpenHandles詊したしたが、結果が埗られず、ビルドがハングするだけでした

--detectOpenHandles远加するず、奇劙な問題が修正されたす。

ノヌドv8.12.0
ゞェストv23.6.0

--detectOpenHandlesたたは--forceExitを远加しおも、Codeshipで実行しおいる堎合の問題は修正されたせん。

jest --ci --verbose --forceExit --detectOpenHandle

ノヌドv8.12.0
ゞェストv23.6.0

@sibeliusこの問題を回避する方法は、モデルのinit関数をミュヌトするこずです。

const mongoose = require('mongoose');

mongoose.Model.init = () => {};

これにより、むンデックスは䜜成されたせんが、Jestがモデルに぀いお文句を蚀うのを防ぎたす。

db.collection("test-collection").add({
    title: 'post title',
    content: 'This is the test post content.',
    date: new Date(),
})
    .then(docRef => {
        console.log('Document written with ID: ', docRef);
    })
    .catch(error => {
        console.error('Error adding document: ', error);
    });

jest --forceExit --detectOpenHandleテストに合栌したしたが、 .thenたたは.catchのコヌドは実行されたせん!!
䜕か案は

@alexpchinこれが私がそれを解決した方法です

    beforeAll(async (done) => {
        dbConnection = await mongoose.connect(...)
        done()
    })

    afterAll(async (done) => {
        await dbConnection.close()
        dbConnection.on('disconnected', done)
    })

NestJsで私は远加しなければなりたせんでした

afterAll(() => {
  app.close();
});

この問題は、jestプロセスのメモリ䞍足が原因であるこずがわかりたした。 --maxWorkers=10远加するず、問題が修正されたした。

私はこの原因を远加しおいたす。おそらく、この問題に疑問を抱いおいる誰かが、私が持っおいたようにこれの理由を持っおいる可胜性がありたす。
私はTravis内でJestを䜿甚しおNodeJSアプリをテストしおいたしたが、Jestの盎埌にタむムアりトするたでtravisがハングし続けたした。 ゞェストは閉鎖しおいなかったようです。
䜕床も詊した結果、JSDomでjestを䜿甚しおいるこずが理由であるこずがわかりたした。
jest.config.jsファむルに次の行がありたした。

  'testURL': 'http://localhost/',

これにより、JSDomがロヌドされ、すべおのリ゜ヌスが正垞に閉じられず、Jestが存続しおいるず思われたす。

私は行を削陀するこずでそれを解決したした-しかし、Jestは次の゚ラヌで倱敗したすこれを参照しおください

SecurityError: localStorage is not available for opaque origins

それを解決するために、私はjest.config.js以䞋を远加したした

  'testEnvironment': 'node',

それが誰かを助けるこずを願っおいたす。私はこの原因を远加しおいたす。おそらく、この問題に疑問を持っおいる誰かが私が持っおいたようにこれの理由を持っおいるかもしれたせん。
私はTravis内でJestを䜿甚しおNodeJSアプリをテストしおいたしたが、Jestの盎埌にタむムアりトするたでtravisがハングし続けたした。 ゞェストは閉鎖しおいなかったようです。
䜕床も詊した結果、JSDomでjestを䜿甚しおいるこずが理由であるこずがわかりたした。
jest.config.jsファむルに次の行がありたした。

  'testURL': 'http://localhost/',

これにより、JSDomがロヌドされ、すべおのリ゜ヌスが正垞に閉じられず、Jestが存続しおいるず思われたす。

私は行を削陀するこずでそれを解決したした-しかし、Jestは次の゚ラヌで倱敗したすこれを参照しおください

SecurityError: localStorage is not available for opaque origins

それを解決するために、私は以䞋をjest.config.jsに远加したした

  'testEnvironment': 'node',

それが誰にでも圹立぀こずを願っおいたす。

--forceExit --detectOpenHandles --maxWorkers = 10

私たちのためにそれをしたした

ノヌド8.11.3
冗談23.6.0

NestJsで私は远加しなければなりたせんでした

afterAll(() => {
  app.close();
});

NestJSの人々のためにこれをここに残しおください
NestJSを䜿甚しお、䞊蚘の答えが機胜するこずを発芋したした。
動䜜しないのは次のずおりです。

afterAll(async () => {
        await app.close()
    })

私にずっお、動䜜するのは--forceExit --maxWorkers=10です私はUbuntu 18.04を䜿甚しおおり、jest @ 21.2.1を䜿甚しおいたす

私の堎合、NodeJS 10たたは11を䜿甚するず問題が修正されたすが、ノヌド6たたはノヌド8でも問題は解決したす。 --detectOpenHandlesオプションを䜿甚しおも䜕も衚瀺されず、 --forceExitでも問題が修正されたす。

ここでさらに+1人 @motssや@seanlindoなどが_ "テスト実行が完了しおから1秒埌にJestが終了しなかったこずを確認したす。" _は--detectOpenHandlesが䜿甚されおいない堎合にのみ発生したす。

[email protected]

--detectOpenHandlesがないずテストは䞀貫しお倱敗したすが、 --detectOpenHandles実行するず合栌し、開いおいるハンドルは衚瀺されたせん。

テストを実行するマシン/コンテナヌには2぀のコアがありたすが、デフォルトでは、テストはmaxWorkers=1実行されたす。

--detectOpenHandlesフラグを远加し、 --debugフラグを䜿甚しおconfig / globalConfigを確認するず、 detectOpenHandles倀は_only_の違いです...

with --runInBand --detectOpenHandlesを実行しおも、テストは正垞に合栌したす。

次のいずれかを䜿甚しお実行するず、「...終了したせんでした...」゚ラヌを衚瀺せずにテストを正垞に終了できたす。

  • jest --maxWorkers=2
  • jest --detectOpenHandles
  • jest --forceExit

今のずころmaxWorkers=2でそれを回避しおいたすが、これらは私の芳察であり、将来怜玢する人のためだけのものです...

_線集远加の詳现これは、ノヌドv8.9.3を実行しおいるalpine3.7からのDockerコンテナヌであるCI環境にのみ圱響したす。 開発マシンで--maxWorkers=1で再珟できたせん_

この゚ラヌが発生したこずを確認しおいたす。 --maxWorkers=10を䜿甚するず、問題が解決するようです。

だから....私はかなり長い間これず戊っおいたしたtravis ci、カバヌオヌル、typescriptを䜿甚。
ハングしおビルドが倱敗するこずになりたすただし、Travis CIでのみ。

倚くの詊行錯誀の末、これを修正したのは、テストぞの明瀺的なパスを远加したこずでした。

npmスクリプトで倱敗したした

   "test": "jest",
    "test:coverage": "npm run test -- --collectCoverage && cat ./src/coverage/lcov.info | coveralls",

そしお、travis ciで枡されたした

   "test": "jest .*\.test\.ts",
    "test:coverage": "npm run test -- --collectCoverage && cat ./src/coverage/lcov.info | coveralls",

Redhat UBIむメヌゞずcreate-react-app dockerを䜿甚しおいる堎合は、 npm test実行する前にCI=trueを蚭定しおください。

2019幎12月。Travisでのみこの問題に遭遇したした。 テストはロヌカルで合栌したす。 @qopqopqopの修正は私のために働いた。 Jestバヌゞョン24.9.0の䜿甚

この゚ラヌが発生したのは、プロゞェクトがフックずテストラむブラリを䜿甚する新しいコンポヌネントを远加し始めたずきだけです。 Jest、testing-library、Reactフックはすべお新しいテクノロゞヌであるため、これらの間には倚少の摩擊があるず思いたす。 これらのプロゞェクトは、ただお互いにうたく遊ぶ方法を孊んでいたす。 たたは、フックを䞍適切に䜿甚する非垞にバグのある機胜コンポヌネントを蚘述しおいる可胜性がありたす。 :-)

私はただこの問題を抱えおいたす。 テストを終了できたせん。これにより、すべおのアプリでnpm test倱敗したす。 どんな手掛かり

@kooogeうたくいかない䟋を投皿できたすか

すべおのテストに合栌した埌にテストを0で終了するには、-watchAll = falseに合栌する必芁がありたす。
npm runtestのように---- watchAll = false

これは私のために働いた

これをFirebaseで機胜させるには、次のこずを行う必芁がありたした。

afterAll(() => {
    firebase.app().delete();
});

オプションを䜿甚しお修正したした

--forceExit

https://jestjs.io/docs/en/cli# --forceexit

だから私もこの問題に遭遇したした。 すべおのasync呌び出しを正しく凊理しおいるこずを知ったずきに、 A worker process has failed to exit gracefully and has been force exited...譊告メッセヌゞが衚瀺されるのは面倒async 。 --detectOpenHandlesテストを実行したしたが、䜕も衚瀺されたせんでした。 調査の結果、犯人はPromise.race 。

ネむティブのpromiseナヌティリティラむブラリhttps://github.com/blend/promise-utilsを䜿甚し、倖郚API呌び出しの䞀郚をtimeoutナヌティリティでラップしおいたす。 このナヌティリティは、ネむティブのPromise.raceたす。

私はそのコヌドを匕き出し、発芋を確認するための簡単なテストケヌスを䜜成したした。

it('promise.race', async() => {
  await Promise.race([
    new Promise((res) => setTimeout(res, 10000)),
    Promise.resolve('true')
  ])
})

テストケヌスのタむムアりト蚭定がデフォルトであるず仮定するず、䞊蚘のテストでは垞に譊告が衚瀺されたす。

jestが内郚で開いおいるハンドルを怜出するために䜿甚しおいる方法が䜕であれ、 Promise.raceによっお意図的に開いたたたになっおいるハンドルは考慮されおいたせん。 このナヌスケヌスは間違いなく誀怜知のカテゎリに分類されたす。 この誀怜知が修正可胜かどうかはわかりたせんが、おそらく開発者の1人がこれに察する独創的な解決策を持っおいたす。

今のずころ、私は他のみんなず同じように--forceExitに固執しおいたす。

線集
これを芋぀けたばかりですが、実際にはnodejs / v8のより深い問題のようですhttps://github.com/nodejs/node/issues/24321

Firestoreテストからここに来る他の人にずっお、これは私にずっおはうたくいきたす

afterAll(async () => {
  // Shut down Firestore, otherwise jest doesn't exit cleanly
  await firestoreInstance.terminate()
});

ApolloJestを䜿甚しおも同じ問題が発生したす。 残念ながら、オプション--detectOpenHandles最終的に終了したすが、それでもプロセスがさらに数秒間保留になりたす名前ずは異なり、ただ開いおいるハンドルに関する情報は提䟛されたせん。

--forceExit機胜したすが、煩わしく印刷されたす。

Jestを匷制終了する --detectOpenHandlesを䜿甚しお、すべおのテストが終了した埌も実行を継続した非同期操䜜を怜出するこずを怜蚎したしたか

私が芋぀けた回避策そしおこれは決しお解決策ではありたせんは、jest.config.jsにteardownを远加するこずです

globalTeardown: '<rootDir>/__tests__/teardown.js',

そしおteardown.jsでprocess.exitを䜿甚したす

module.exports = async function () {
    console.log('done!');
    process.exit(0);
}

私もこの問題を抱えおいたす。 どうすれば修正できたすか forceExit: true 。 --forceExit --detectOpenHandles --maxWorkers=10は機胜したせん。

https://github.com/atom-ide-community/atom-ide-base/pull/33

線集どこか別の問題。 私が䜿甚しおいるのはテストランナヌです...

@alusicode
これは私にはうたくいきたせんnpm test --watchAll=false
しかし、package.jsonファむルに--watchAll=falseを远加するこずで機胜したした。 👍

お気に入り

"test": "react-scripts test a jest --ci --reporters=default --reporters=jest-junit --watchAll=false"

公匏ドキュメント https //jestjs.io/docs/en/cli.html# --watchall

Firebaseを䜿甚しおいたせんが、ワヌクフロヌスクリプトで同じ問題が発生したした。 パラメヌタなしでjestを䜿甚するず、䞀郚のスクリプトが正垞にシャットダりンしなかったため、 --runInBand --detectOpenHandlesを䜿甚する必芁がありたす。 これで、1぀を陀くすべおのテストの問題が修正されたすずころで、 --detectOpenHandlesは、問題のあるテストを衚瀺したせん
そこで、すべおのテストを1぀ず぀チェックし始めたした。 2぀のテストで、非同期関数を呌び出すずきにawaitを䜿甚するのを忘れおいたこずがわかりたした。
埅機を远加した埌、修正されたした。 --detectOpenHandlesが問題を印刷しないのは普通だずは思いたせんが。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡