diffplug / diffplug/selfie

Selfie JVM Snapshot Garbage Collection is overly zealous when using multiple test suites in gradle

オープン
#574 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る
bug jvm
主要言語
Kotlin
スター
101
フォーク
18
PR マージ指標
30日以内にマージされた PR はありません

説明

In a project I was using a separate integrationTest source set with the JVM Test Suite approach recommended by Gradle [link to instructions](https://docs.gradle.org/current/userguide/jvm_test_suite_plugin.html#sec:declare_an_additional_test_suite).

When done this way, the integration test sources will be in `src/integrationTest` instead of `src/test`. The classes in `src/test` will not be on the classpath of the integration tests.

When running Selfie with JUnit5, the current garbage collection logic is hardcoded to only look for `*.ss` files in `src/test/` and performs a `Class.forName(...)`  to see if that test still exists and has tests that match the snapshot. If it doesn't find a match, it deletes the file. 

Since the unit tests are invisible on the integrationTest classpath, though, `Class.forName(...)` throws a `ClassNotFoundException` so selfie assumes this is a stale file and deletes. As a consequence, all the unit test snapshots are deleted when running the `integrationTest` task.

Is there some way to get the correct source root from Junit or something like that to avoid deleting unmanaged files?

A reproducer of the described issue can be found here with instructions in the README https://github.com/aelfric/selfie-bug-report-reproducer

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

リンクされた reproducer とその README の手順から始め、別々の Gradle テストスイートに対する Selfie の JUnit5 スナップショットのガベージコレクションロジックを追跡します。integrationTest の実行を再現し、それらのテストが integrationTest の classpath に存在しない場合に src/test 配下のスナップショットが削除されないことを確認します。未管理のユニットテストのスナップショットがそのまま残り、古いスナップショットが引き続き処理されれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java, kotlin
領域
build-system, testing-qa
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
静か
明瞭さ
おおむね明確
初心者へのやさしさ
48/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。