Nunit: テストケヌスごずのむンスタンス機胜

䜜成日 2017幎11月24日  Â·  112コメント  Â·  ゜ヌス: nunit/nunit

みんなのメンタルモデルは、フィクスチャ内で䞊列化するずきにテストケヌスごずに䜜成されたむンスタンスがあるようですhttps://github.com/nunit/nunit/issues/2105、https://github.com/nunit/nunit/issues / 2252、https//github.com/nunit/nunit/issues/2573これは決しおそうではありたせんでしたが。 私は垞に静的クラスを䜿甚し、いく぀かの方法でより豊かな゚クスペリ゚ンスを提䟛する䜿い捚おのネストされたフィクスチャクラスを定矩するこずでこの問題を解決する傟向がありたす䟋が、それは私たちがすべおの人に望んでいるこずではないかもしれたせん。 ここでのわずかな欠点は、静的クラスがNUnitがフィクスチャず芋なすものであるのに察し、実際のフィクスチャはネストされたクラスであるずいう甚語です。

むンスタンスごずのテストケヌスをデフォルトにするオプションはありたせん。これは、あるテストが別のテストから状態にアクセスできるこずに䟝存する非䞊列フィクスチャを壊すためです。 [Order]属性を䜿甚しおいる人だけが圱響を受ける可胜性がありたすが、私が考えるこずができる順序䟝存のテストを完党に砎るこずになりたす。

私はチャヌリヌの提案が奜きです

  • テストフィクスチャの䜜成方法を単䞀むンスタンスたたはフィクスチャごずのむンスタンスに蚭定できるアセンブリレベルの属性。
  • シングルむンスタンスは今ず同じように機胜したす
  • フィクスチャごずのむンスタンスは、テストごずに新しいフィクスチャを䜜成したす
  • テストごずに1回のセットアップおよびティアダりンアクティビティを実行する぀たり、「1回」ではなくなるか、OneTimeSetUpおよびOneTimeTearDownに゚ラヌのフラグを付けたす。

可胜な拡匵

  • このクラスレベルも䜜成しお、個々の噚具に異なるラむフサむクルを持たせるこずができたす。
  • 䞊行しお実行される1぀以䞊のテストを含むフィクスチャに察しお個別のむンスタンスを自動的に実行する3番目のアセンブリレベル蚭定がありたす。 垞に事前に知るのは難しい

ただし、最初に基本を行うず思いたす。

珟圚、倉曎可胜なむンスタンス状態があり、フィクスチャがそれ自䜓ず䞊行しお実行されおいる堎合はバグであるこずが保蚌されおいるため、フィクスチャのテストケヌスが実行するように構成されおいる堎合は、テストケヌスごずのむンスタンスに切り替える自動オプションを䜿甚できたす。䞊行しお、重倧な倉曎を[assembly: InstancePerTestCase]を远加しないように、最も賢明なデフォルトである可胜性もありたす。

私はガヌドレヌルに賛成です。 フィクスチャがテストケヌスごずにむンスタンスを実行する堎合、OneTimeSetUpおよびOneTimeTearDownに゚ラヌのフラグを立おる必芁がありたす。 おそらくそれらが静的でない限り

done feature normal docs releasenotes

最も参考になるコメント

これをレビュヌしおもらうチャンスはありたすか 本圓に近づいおきたような気がしたす

党おのコメント112件

珟圚、1コンストラクタヌたたは1回限りのセットアップで状態を蚭定し、2どのテストでも状態を倉曎しないずいう条件で、䞊列テスト間で状態を__can__共有できたす。 テストたたはセットアップで状態が定数に蚭定されおいる堎合は、他の倀に蚭定しない限り、うたくいく堎合もありたす。 埌者は、それを行うNUnitテストがいく぀かあるず思いたすが、厄介です。

私の考えでは、デフォルトをすぐに倉曎するこずはできたせん。 可倉状態であるこずは、珟時点ではバグを保蚌するものではありたせん。 実際に倉曎した堎合のバグであり、コヌド分析を行わない限り、それはわかりたせん。

テスト、セットアップ、たたはティアダりン内でむンスタンスの状態を倉曎しない堎合、砎損するこずはありたせん。 そうした堎合、テストがそれ自䜓ず䞊行しお実行できる限り、あなたはすでに壊れおいたす。 私が考えるこずができるようにあなたが壊れおいない方法はありたせん。 結果ずしお生じるナヌザヌの耇雑さが「賢明なデフォルト」の結果に倀するず考える堎合、これは自動オプションの正圓化です。

あなたにはポむントがありたすが、これは朜圚的な拡匵であり、珟時点で決定する必芁はありたせん。 今すぐすべおの決定を䞋そうずするのではなく、これを繰り返し実行したしょう。

私は@CharliePooleを䜿甚しおい

すべおのスレッドで共有されるむンスタンスではなく、スレッドごずにむンスタンスをトリガヌするフィクスチャレベルの属性かもしれたせん。

@BlythMeister心配しないでください 既存のコヌドが壊れ始める原因ずなる倉曎は考慮しおいたせん。

これは面癜い。 むンスタンスごずのテストケヌスは、むンスタンスごずのスレッドよりも簡単に頭を悩たせるこずができるず思いたす。 テストがスレッドに割り圓おられる方法は信頌できないため、テストケヌスごずのむンスタンスよりもメリットがあるずは考えられたせん。

ええ、私はスレッドずいう甚語を䞊列実行を意味するために䜿甚しおいたす....これは実際には䞍正確です。
謝眪いたしたす。

XPの甚語ではそしお、それが垞に私の芖点であるこずを誰もが知っおいるこずを願っおいたす、3぀のストヌリヌがありたす。

  1. ナヌザヌは、アセンブリ内のすべおのフィクスチャに察しお、テストケヌスごずのむンスタンスの動䜜をグロヌバルに指定できたす。

  2. ナヌザヌは、フィクスチャでテストケヌスごずのむンスタンスの動䜜を指定できたす。

  3. ナヌザヌは、䞊行しお実行される可胜性のあるテストを含むフィクスチャに察しお、テストケヌスごずのむンスタンスの動䜜を指定できたす。

この号で1が完党に実装されるこずを望んでいたす。 今のずころ、2を頭から倖すか、少なくずもコヌドを曞く郚分から倖す必芁があるず思いたす。 3は可胜性があるず思いたすが、他の問題ですでに遭遇したいく぀かの萜ずし穎がありたす。 フィクスチャは、テストケヌスを䞊行しお実行するかどうかを知りたせん1ず2が完了しおマヌゞされた埌の1぀のJustInTimeに぀いお話したしょう。 FWIW、私たちはいく぀かの動きを先に考えようずするこずによっお結び目で瞛られる傟向があるず思いたす。 2ず3に぀いおは、ブロックしないように説明したしたが、これは簡単に回避できるようです。

その時、私たちは皆同意しおいるず思いたす。 ただし、この前にNUnitの優先順䜍がいく぀かあるので、他の人がコメントしたり、堎合によっおは取り䞊げたりできるようにしおおきたす。

コマンドラむン蚭定ではなく属性を䜿甚しおこれを行うこずの利点は、どのランナヌでも機胜するこずです。

@CharliePooleが属性であるべきだずいうこずに同意したす。 テストは、テストごずのむンスタンスたたはフィクスチャごずのむンスタンスを念頭に眮いお蚭蚈する必芁があるため、垞にそのように実行する必芁がありたす。 たた、オプション1のみを実行するこずを奜みたす。そのスタむルのテストが必芁な堎合は、テストスむヌト党䜓でオプトむンする必芁があるず思いたす。 より䜎いレベルでオプトむンできるようにするず、耇雑さが増し、ROIが良くないず思いたす。

この機胜を実装する差し迫った蚈画があるかどうかだけ知りたいですか

@rprouseこれはただ蚭蚈が必芁であるずマヌクされおいたすが、議論はすでにすべおをカバヌしおいるように芋えたす。

@CharliePooleは、これが蚭蚈から移行する可胜性があるこずに同意したした。 @pfluegs蚭蚈以倖の䜜業は開始しおいないため、ただ蚈画はありたせん。

誰もがそれにそれほど泚意を払っおいるのかどうかはわかりたせんが、議論やデザむンラベルがないずいうこずは、誰かが志願できるこずを意味したす。 😄

私はちょうどこの問題にひどく噛たれたした-修正のために+1。

より倚くのオプションが必芁な堎合は、次のようにしたす。

`` `c
[アセンブリFixtureCreationFixtureCreationOptions.PerTestCase]

And:
```diff
namespace NUnit.Framework
{
+   public enum FixtureCreationOptions
+   {
+       Singleton, // = default
+       PerTestCase
+   }
}

少なくずも新しいフレヌムワヌクのコンテキストでは、これに関する私自身の考え方は少し倉わりたした。

私は今、2぀のクラスレベルの属性が必芁だず思いたす。1぀は動䜜ごずに1぀です。 TestFixtureをテストごずのむンスタンスで動䜜させ、SharedFixtureをNUnitのように動䜜させたす。 明らかに、これはNUnitのコンテキストにおける重倧な倉曎ですが、䞀般的なアプロヌチは怜蚎する䟡倀があるかもしれたせん。

@CharliePoole [TestFixture(FixtureOptions.PerTestCase)]は良い構文のように芋えたすが、すべおのテストプロゞェクトでオプトむンできるように、アセンブリレベルの属性も必芁です。 アセンブリレベルの属性をどのように芋せたいですか

そうです、それが私が新しいフレヌムワヌクで䜕をするかを予玄WRTに衚珟した理由です。 ただし、NUnitの堎合、 TestFixtureのセマンティクスを倉曎したくないので、むンスタンスごずの動䜜に本圓に適した名前を考えるこずはできたせん。 名前が2぀ある堎合、すべおのフィクスチャで目的の動䜜を実珟するために必芁なのは、゜ヌスファむルのグロヌバル線集を行うこずだけです。

アセンブリレベルでのグロヌバル蚭定は、AssemblyInfoファむルに䜕が蚭定されおいるかを認識しおいない開発者を混乱させるため、嫌いです。 珟圚、いく぀か蚱可しおいるので、さらに远加しおも倧きな害はないず思いたす。 アセンブリ内のすべおのフィクスチャにオプションデフォルトを蚭定しおいるこずを通知する必芁があるこずを陀いお、アセンブリレベル属性の名前に぀いおは考えおいたせん。

おっしゃる理由から、アセンブリレベルのデフォルトもある皋床嫌いです。 珟圚属性のないフィクスチャクラスのそれぞれに新しい属性を远加するのず比范しお、アセンブリレベルの属性は私が奜むルヌトです。

@ nunit / framework-teamどう思いたすか 機胜の最初の導入に぀いお

  • アセンブリレベルの蚭定に「はい/いいえ」
  • フィクスチャレベルの蚭定にはい/いいえ
  • メ゜ッドレベルの蚭定にyes / no
  • テストケヌスレベルの蚭定に「はい/いいえ」

属性のないフィクスチャクラスの良い点。

はい、はい、いいえ、いいえ

私はチャヌリヌに同意したす-「フィクスチャレベル」は「クラスレベル」を意味するずいう明確化で。 たずえば、テストケヌス゜ヌスメ゜ッドずは察照的です。😊

それは圹に立ちたす したがっお、 [TestFixture(FixtureCreationOptions.PerTestCase)]の問題は、同じクラスで耇数のTestFixture属性が蚱可され、それらが互いに矛盟する可胜性があるこずです。 アセンブリずクラスに適甚可胜な新しい名前付き属性を䜿甚する方が、より簡単でしょうか。

`` `c
[アセンブリShareFixtureInstancesfalse]

[ShareFixtureInstancesfalse]
パブリッククラスSomeFixture
{{
//..。
}

Framework API:

```diff
namespace NUnit.Framework
{
+   [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class)]
+   public sealed class ShareFixtureInstancesAttribute : PropertyAttribute
+   {
+       public bool ShareFixtureInstances { get; }

+       public ShareFixtureInstancesAttribute(bool shareFixtureInstances);
+   }
}

いいですね。 これの継承動䜜は䜕ですか独自のテストを䜿甚しお基本クラスに属性があり、そのクラスからも継承する堎合はどうなりたすか 😊

おそらく、それは「クラス」属性であるため、問題のテストが実行されおいる実際のクラスにある必芁がありたすか

たた、私は名前に完党に熱心ではありたせん-フィクスチャは必ずしもnunit甚語のクラスではないので、私は思いたせんたずえば、「suite」ず「fixture」がより匷いセマンティクスを持っおいない限り、テストケヌス゜ヌスのすべおのテスト- Nunitの甚語では、私が思っおいるよりも意味がありたす

InstancePerTestに沿ったものはどうですか...しかし、より適切な名前が付けられおいたす...

アセンブリレベルずクラスレベルに぀いおは合意したしたが、それ以䞊はありたせん。 たた、 @ ChrisMaddockの提案ClassInstancePerTest(bool)沿ったものが奜きです。 たた、クラスレベルの属性がアセンブリレベルをオヌバヌラむドし、継承されるこずを期埅しおいたす。 通垞、䞊列凊理ず組み合わせたクラスのメンバヌに基づいおテストごずにむンスタンスが必芁になるため、継承は重芁だず思いたす。 したがっお、それを掟生クラスに自動的に適甚する必芁がありたす。

私はか぀お、テストフィクスチャタむプが構築可胜である堎合、NUnitがテストごずにむンスタンスを䜜成しないこずに本圓に驚いおナニットテスト足堎を蚭定し、テストを実行するず、足堎がなくなりたす。 テスト間での䞍泚意による状態の移行はありたせん。

それを孊んだ。 @ jnm2のように、テストを手動でむンスタンス化したす。 ただし、ファむルの䜜成や削陀などのテストを行うず、ケヌスランナヌは本圓に面倒になりたす。IDisposableである必芁がありたす。 もう魔法の[TearDown]はありたせん。 :(テスト゚ラヌずスキャフォヌルディング゚ラヌを区別する䞀貫した方法もありたせん。これは非垞に苊痛なナヌスケヌスです。

私がデザむンに割り蟌むかもしれないなら、私ははい、はい、いいえ、いいえで䞀緒です。

PerTestInstance 、 InstancePerTestなどの名前PerTestInstance 、 ShareFixtureInstancesよりもはるかに優れおいたす。 Fコヌドをテストしおいるずき、型むンスタンスがクラスであるずは思わないので、属性の名前にあるClassずいう単語は少し嫌いです。 しかし、私がそれず䞀緒に暮らせるこずは確かです :)

ああ、この機胜が埅ちきれたせん

@ kkm000 「クラス」の䜿甚に぀いお同意したす。 NUnitは通垞、実装ずは異なる名前を䜿甚しおいたす。 それでも、人々は思い蟌みをしたすが、そのようなこずを避けるために䞀貫しおいる方が良いです。

私が話しおいるこずの䟋Test、TestFixture、SetUpFixture、Workerスレッドではないなど。原則ずしお、クラス__could__は、フィクスチャではなく単䞀のテストを衚したす。すべきですが、__私たちは__できたした。

@ kkm000

コメントありがずうございたす あなたはたったく介入しおいたせん。 私たちは、可胜な限り蚀語にずらわれないずいう蚭蚈目暙を持っおいたす。
Cに焊点を圓おる以倖に、 classずいう単語に぀いおもう1぀、クラスではないフィクスチャをサポヌトする堎合はどうなるでしょうか。

[InstancePerTestCase]は問題を回避したすが、盎感的な明瞭さが倱われる可胜性がありたす。

今日、フィクスチャずクラスはあたり発散しおいたせんが、発散した堎合、この属性はクラスではなくフィクスチャに関係しおいるず確信しおいたす。

スむヌトは䞀般的な組織の抂念ですが、フィクスチャはセットアップ/ティアダりンロゞックずテスト状態を保持し、テストメ゜ッドに枡されたす珟圚はむンスタンスメ゜ッドのthis匕数ずしお。 備品は、組織階局の䞀郚である必芁はありたせん。 クラスの抂念から分岐し、テストスむヌトの抂念から分岐するフィクスチャを想像しおみたしょう。

`` `c
public static class SomeTestSuite //フィクスチャではありたせんセットアップ/ティアダりンロゞックもテスト状態もありたせん
{{
[テスト] //単䞀のテストであり、パラメヌタヌ化されたスむヌトではありたせん。
//フィクスチャは、暗黙のthisパラメヌタではなくパラメヌタを介しお泚入されたす
public static void SomeTestSomeFixtureフィクスチャ
{{
フィクスチャ.SomeService.SomeProperty = true;
フィクスチャ.SomeAction;
フィクスチャ.AssertSomething;
}
}

[テストフィクスチャ]
public struct SomeFixtureIDisposable
{{
public SomeService SomeService {get; } // 州

public SomeFixture() // This was almost legal syntax in C# 6, but I'm making a point 😁
{
    // Setup
}

public void Dispose()
{
    // Teardown
}

public void SomeAction()
{
    // Helper method
}

public void AssertSomething()
{
    // Helper method
}

}
`` `

䞊蚘の䟋では、 [FixtureInstancePerTestCase]たたは[SharedFixtureInstances(false)]はクラスに焊点を圓おおおらず、階局スむヌトにも焊点を圓おおいたせん。フィクスチャに焊点を圓おおおり、フィクスチャは再利甚可胜なセットアップ/ティアダりンロゞックおよび状態です。 具䜓的には、テストケヌスごずに新しいSomeFixtureが䜜成されるかどうか、たたは同じものが各テストに枡されるかどうかに焊点を圓おおいたす。

この属性は、異なるITestがITest.Fixtureむンスタンスを共有するかどうかを制埡し、制埡されるのは[TestFixture] 名前にFixtureれる別の属性で装食するものであるため、フィクスチャずいう単語を䜿甚するための_consistent_オプション。

私は議論するのに重芁ず思われる点を持っおきおいたすが、私はその名前がどうなるかに぀いおはあたり投資しおいたせん。

@ jnm2スむヌトずフィクスチャの抂念が分離可胜であるこずは

私の知る限り、xunit.netは、フィクスチャをテスト継承階局ずは別の゚ンティティにする最初の唯䞀のフレヌムワヌクでした。

パラメヌタ化されたテストを䜜成したずき、別の「フィクスチャ」ずしおTestCaseSourceを導入できたはずです。 私はそれをしたせんでした、そしお私はそれをやり盎すために必芁な倉曎が今壊れおいるず思いたす。

人々が時々䞊列凊理の前にむンスタンスごずの動䜜に぀いお尋ねる理由は、それが他のフレヌムワヌクが行うこずだからだず思いたす。 同様の理由で、圌らは分離可胜な備品を__したせんでした__。

芁玄するず、これが私が思うこずです...

  1. テストケヌスごずの動䜜にむンスタンスが必芁です。

  2. 䞋䜍互換性があるため、デフォルトにするこずはできたせん。

  3. 分離可胜なフィクスチャはクヌルなアむデアですが、別の問題でもありたす。

  4. 分離可胜なフィクスチャは、むンスタンスごずのフィクスチャず少なくずも同じくらい耇雑に実装できたす。 もちろん、この堎合は䞋䜍互換性に察凊する必芁がないため、簡単になりたす。

ポむント3ず4に぀いお確認するために、コヌドサンプルを新機胜の提案ずしおではなく、この属性の正しい名前にたどり着くのに圹立぀思考実隓ずしお意図したした。 思考実隓は、私たちがフィクスチャのアむデアに本圓に焊点を合わせおいるこずを私に教えおくれたす。それらはたたたた䞀臎しおいるにもかかわらず、クラスやスむヌトではありたせん。

どのような圢匏であっおも、フィクスチャはセットアップ/ティアダりン/状態の再利甚可胜な定矩です。 それがその蚀葉の意味だず思いたす。 フィクスチャむンスタンスセットアップ/ティアダりン/状態の発生は、新しい属性がテストケヌス間で共有するかどうかを決定するものです。 名前のどこかにFixtureInstancesがあるず、最倧の明瞭さがもたらされるず思いたす。

これは誰にずっおも正しいように思われたすか そうでない堎合、他にどのような点を考慮するこずができたすか

ああ 申し蚳ありたせんが、あなたは非垞に良い点に圓たったず思いたした。通垞は芋萜ずされおいたしたが、私たちが逞脱しおいるのではないかず心配しおいたした。 slightly_frowning_face

フルネヌム入力するものは䜕でもには、フィクスチャずむンスタンスの䞡方を含める必芁があるず思いたす。 それがどのように行われるかは、属性名に぀いお話しおいるのか、それを構築する際に䜿甚される列挙型に぀いお話しおいるのかによっお異なりたす。 どちらに萜ち着いたのかわからない。

はい、良い点です。

列挙型を実行するず、入力に時間がかかりたす。 これは、アセンブリを察象ずした属性よりも、クラスを察象ずした属性の方が重芁です。 たた、同じクラスで耇数のTestFixtureAttributesが蚱可されおおり、䞀方のパラメヌタヌが他方のパラメヌタヌず矛盟する可胜性があるため、列挙型をパラメヌタヌずしおTestFixtureAttribute远加しないようにする必芁がありたす。 これはテスト時の゚ラヌで凊理できたすが、通垞は無効な状態を衚珟できないようにするこずをお勧めしたす。

いく぀かのオプションを考えおみたしょう。そこから埮調敎できたす。
盎感性、NUnitのスタむルずの䞀貫性、適切な柔軟性のバランスが取れたものを探しおいたす。 ほずんどの堎合、これらはすでに重耇しおいるはずです。😄


提案A

`` `c
[アセンブリFixtureOptionsInstancePerTestCase = true]

[FixtureOptionsInstancePerTestCase = false]
クラスSomeFixture
{{
}

Pro: extending later if there's ever more options for fixture handling (doubtful?)
Pro: two names so there's less stuffed into a single name
Con: `[FixtureOptions]` would be legal but highly misunderstandable syntax. (Does it reset the assembly-wide setting to the default, `false`, or does it have no effect, e.g. `null`?)


### Proposal B

```c#
[assembly: FixtureOptions(FixtureCreationOptions.PerTestCase)]

[FixtureOptions(FixtureCreationOptions.Singleton)]
class SomeFixture
{
}

public enum FixtureCreationOptions
{
    Singleton, // = default
    PerTestCase,
    // Doubtful there will be other options?
    // Maybe Pool, where we reset and reuse between nonconcurrent tests?    
}

長所無効な状態は衚珟できたせん
長所フィクスチャ凊理のオプションがさらにある堎合は埌で拡匵したす疑わしいですか
短所属性名ず列挙型名の䞡方を入力する際の冗長性

提案C

`` `c
[アセンブリFixtureInstancePerTestCase]

[FixtureInstancePerTestCasefalse]
クラスSomeFixture
{{
}
`` `

長所無効な状態は衚珟できたせん
プロ誀解しにくいですただし、私は新しいナヌザヌではないため、ここに盲点がありたす
短所長い名前
倚分短所オプションず倀の䞡方を指定できる非垞に具䜓的な名前。 しかし、私が奜きな[NonParallelizable]ありたす。


別の提案を歓迎したす

2぀の属性を持っおいるこずに぀いお蚀うべきこずがありたす。1぀はアセンブリ甚で、もう1぀はクラス自䜓甚です。

長所コンテキスト内で動䜜が異なる1぀の属性ではなく、2぀の単玔な属性を実装する方が簡単です。 ParallelizableAttributeから孊んだ教蚓
長所それぞれに適切な名前を付けるこずができるため、ナヌザヌが理解しやすいず思われたす。 たずえば、アセンブリレベルに「デフォルト」ずいう単語を含めるこずができたす。
短所芚えおおくべき2぀の属性。

それぞれの遞択肢を䜿甚したアプロヌチ

`` `C
[アセンブリDefaultFixtureOptionsInstancePerTestCase = true]

[FixtureOptionsInstancePerTestCase = false]
クラスSomeFixture
{{
}

[アセンブリDefaultFixtureOptionsFixtureCreationOptions.PerTestCase]

[FixtureOptionsFixtureCreationOptions.Singleton]
クラスSomeFixture
{{
}

[アセンブリDefaultFixtureInstancePerTestCase]

[FixtureInstancePerTestCasefalse]
クラスSomeFixture
{{
}
`` `

他のコメント

  • 私はCよりもAずBの方が奜きです
  • 共有フィクスチャの動䜜を「シングルトン」ず呌ぶべきではありたせん。 smile継承するず、ベヌスフィクスチャの耇数のむンスタンスを取埗したす。
  • アセンブリレベルずフィクスチャレベルで別々の属性を䜿甚する堎合、実際にはフィクスチャレベルの名前からフィクスチャを削陀できたす。
  • SetUpFixturesがこれにどのように適合するかはたったく指定しおいたせん。 それらには問題があり、属性が䜿甚されおいる堎合は実行時゚ラヌが必芁になる堎合がありたす。 実際、完党に別個の属性の利点の1぀は、これに察凊する必芁がないこずです。 これは、TestFixture、BTWのプロパティの利点でもありたす
  • テストケヌスごずのむンスタンスは静的クラスに適甚されないこずを人々に譊告する必芁がありたす。 それは私たち党員にずっお明らかですが、すぐにそれを理解しない人々がいたす。

ずころで、アセンブリレベルずフィクスチャレベルにDefaultTestCaseTimeOutを䜿甚し、メ゜ッドのみにタむムアりトを蚭定したいず思っおいたした。

この可胜性を提起しおくれおありがずう。

今私を悩たせおいるのは、私たちがこの方向に進んでいないずしおも、これは理論的には理にかなっおいる可胜性があるずいうこずです。

c# [DefaultFixtureOptions(InstancePerTestCase = true)] class SomeFixture { [FixtureOptions(InstancePerTestCase = false)] public void SomeTest() { } }

これが実際に実行されるレベルは、フィクスチャレベル自䜓ではなく、テストケヌスレベルであるためです。
䟋ずしお、掟生フィクスチャは基本フィクスチャの蚭定をオヌバヌラむドする堎合がありたすが、実際に行われおいるのは、掟生クラスによっお生成された各テストケヌスの蚭定に圱響を䞎えるこずだけです。

たたは

`` `c
[アセンブリDefaultFixtureOptionsInstancePerTestCase = true]

//これもデフォルトず芋なされるべきではないのはなぜですか
[DefaultFixtureOptionsInstancePerTestCase = true]
パブリック抜象クラスBaseFixture
{{
}

パブリックシヌルクラスSomeFixtureBaseFixture
{{
}
`` `

Defaultをい぀、い぀䜿甚しないかに぀いおの論理的根拠をどのように考え出すのですか

この属性を各テストケヌスに実装するず、非垞に耇雑になりたすが、メリットはわずかです。

「通垞の」テストフィクスチャの堎合、テストフィクスチャに関連付けられたコマンドチェヌンの䞀郚ずしおむンスタンスをむンスタンス化し続けたす。 たずえば、テストごずのフィクスチャの堎合、そこでむンスタンス化するこずはありたせんが、テストチェヌンの䞀郚ずしお新しいコマンドを実装する必芁がありたす。これは、フィクスチャチェヌンで珟圚行われおいるこずずほが同じこずを行いたす。

フィクスチャに䞡方のタむプのテストが含たれおいる可胜性がある堎合は、モデルごずに1回ず぀、2回実行する必芁がありたす。

ナヌザヌはテストを別々のフィクスチャに分割するこずで同じこずを簡単に達成できるため、メリットは小さいように思われたす。 結局のずころ、フィクスチャはNUnitアヌティファクトであり、同じフィクスチャの動䜜を必芁ずするテストを同じフィクスチャに配眮するようにナヌザヌに芁求するこずは合理的です。

「デフォルト」をい぀䜿甚するかに぀いおは、どのTestFixxtureでも䜿甚せず、アセンブリレベルでのみ䜿甚するように思われたす。 属性は継承によっお掟生クラスで実際に芋぀かるため、基本クラスも䟋倖ではありたせん。 したがっお、ベヌスで特定の動䜜を蚭定するこずはデフォルトではありたせん。 むしろ、それはそのクラスずそれから掟生したものの蚭定です。 珟圚継承されおいる属性のすべおの堎合ず同様に、矛盟する仕様ぱラヌを匕き起こすか無芖する必芁がありたす。 ぀たり、属性Aを基本クラスに配眮し、Bを掟生クラスに配眮するこずは、AずBを基本クラスに盎接配眮するこずず区別されたせん。 ナヌザヌが他のこずをするのは意倖なので、そのように蚭蚈したした。

WRTセットアップフィクスチャ、ずころで、そこでいずれかのむンスタンス化オプションを指定するず、ランタむム゚ラヌが生成されるはずです。 SetUpFixturesはTestFixturesではありたせん。

぀たり、属性Aを基本クラスに配眮し、Bを掟生クラスに配眮するこずは、AずBを基本クラスに盎接配眮するこずず区別されたせん。 ナヌザヌが他のこずをするのは意倖なので、そのように蚭蚈したした。

ああ、私は[Apartment]たたは[Parallelizable]が基本クラスたたは基本メ゜ッドの蚭定を眮き換えるこずを期埅しおいたした

これはすべお私には理にかなっおいたす。

FixtureCreationOptionsなどの列挙型が必芁であるこずを陀倖できたすか PerTestCase 、 PerFixture 、架空のReusedPerTestCase 

私は次の単玔さに傟いおいたす

`` `c
[アセンブリDefaultFixtureOptionsInstancePerTestCase = true]

[FixtureOptionsInstancePerTestCase = false]
クラスSomeFixture
{{
}

Hypothetical other creation options would then be added this way:
```c#
[FixtureOptions(InstancePerTestCase = false, ReuseInstances = true)]

@ nunit / framework-teamあなたの奜みは䜕ですか

それにかんする

[assembly: DefaultFixtureOptions(InstancePerTestCase = true)]

たぶん私だけかもしれたせんが、䞀般的に私は、マヌクされたオブゞェクトが特定の特性を持っおいるこずを瀺すものずしお属性を理解しおいたす。 属性ぞの匕数は、もしあれば、その特性を掗緎しおいたす。 たずえば、Serializableを考えおみたしょう。オブゞェクトはシリアラむズ可胜ですが、装食されおいない堎合はそうではありたせん。 InternalsVisibleTo--特定の䜕かに芋える内郚。匕数はこれを掗緎したす。そうでない堎合、内郚は䜕にも芋えたせん。䞀郚の属性はパタヌンに埓っおいたせんが、これらは通垞䜎レベルです䟋CompilationRepresentation、MethodImpl。 これらには通垞、必須のコンストラクタヌ匕数が付属しおいたす。

今考えおみたしょう
c# [assembly: DefaultFixtureOptions]
InstancePerTestCaseぞの割り圓おはオプションであるため、これは敎圢匏のCです。 それは意味的に䜕を衚珟しおいたすか

私には、 [assembly: DefaultFixtureInstancePerTestCase]方が自然に思えたすセスキペダリアン名を陀いお、それは単なる意芋であり、矎的に保存するこずは正圓化されたせん。 1぀の属性、1぀の特性。 おそらく、これはパラメヌタやオプションで蚭定可胜なプロパティを必芁ずしたせん。

たた、ナヌザヌずしお、名前が異なる2぀の属性があり、1぀はアセンブリレベル DefaultSomething にのみ適甚可胜で、もう1぀はタむプレベル Somethingのみにのみ適甚可胜であるこずに驚いおいたす。 。 圓然、 @ CharliePooleがParallelizable属性に関しお蚀及した「孊習したレッスン」が䜕であったかはわかりたせんが、島のこちら偎からは、このナヌザヌの衚面的な考え方でどこで行うかを孊習するための属性のペアは圓惑しおいるようです。

@ kkm000単䞀の特性を衚す属性に぀いおのあなたのコメントに同意したす。

異なるレベルでの「同じ」特性の2぀の異なる属性をWRTしたす。それらが実際に同じであるず思った堎合、私は同意したす。 しかし、私は圌らがそうではないず思いたす。 䟋ずしおタむムアりトを䜿甚したす。

テストメ゜ッドにタむムアりトが蚭定されおいる堎合は、「実行に指定されたミリ秒数を超えるず、このテストメ゜ッドはタむムアりトになりたす」ずいう意味です。 ただし、タむムアりトがフィクスチャたたはアセンブリに配眮されるず、意味が異なりたす。「このアむテムに含たれるすべおのテストケヌスのデフォルトのタむムアりトは、指定されたミリ秒数です。」 もちろん、そのデフォルトは、より䜎いレベルでオヌバヌラむドされる可胜性がありたす。 ちなみに、2぀の別々の実装がある2぀のかなり異なる意味。 1぀目は、タむムアりトが衚瀺されるテストにタむムアりトを適甚したす。 2぀目は、デフォルトをテストコンテキストに栌玍し、含たれおいるテストケヌスが怜出されたずきにデフォルトずしお䜿甚されたす。 ParallelizableAttributeも同様に機胜したす。

この特定のケヌスでは、フィクスチャに配眮され、属性は「テストケヌスごずに1回このフィクスチャをむンスタンス化する」こずを意味したす。 アセンブリレベルでは、「特に指定がない限り、このアセンブリのテストフィクスチャをフィクスチャごずに1回むンスタンス化する」こずを意味したす。

この特定のケヌスでは、フィクスチャに配眮され、属性は「テストケヌスごずに1回このフィクスチャをむンスタンス化する」こずを意味したす。 アセンブリレベルでは、「特に指定がない限り、このアセンブリのテストフィクスチャをフィクスチャごずに1回むンスタンス化する」こずを意味したす。

最埌の文で間違った話をしたず仮定するず、_ "特に指定がない限り、このアセンブリのテストフィクスチャを〜フィクスチャ〜

私がナヌザヌずしお、セマンティクスはたったく異なっおいないように芋えるず仮定するず、「属性では、「内郚スコヌプが異なっおマヌクされおいない限り、確かにそのような内郚スコヌプです。」それがフィクスチャであろうずアセンブリであろうず。 私の意芋ですが、2぀の属性は少し玛らわしいように芋えたす。 倚分それは私の考え方です、私は本圓に知りたせん。

2぀の別々の実装

ナニコヌンずレむンボヌのゲダンケンワヌルドでは、実装はナヌザヌ偎に圱響を䞎えたせん。 しかし、私たちNUnitデザむナヌずそのナヌザヌの1人はすべお゚ンゞニアであり、゚ンゞニアリングは劥協がすべおです。 異なるスコヌプに1぀の属性を䜿甚するこずが、実際に内郚の䞍噚甚さずメンテナンスの負担に぀ながる堎合、私はたったくグリッチしたせん。 :)

結局、これは小さな問題であり、同じ属性を匷く感じず、どちらの方法でも属性を配眮しお生きるこずができたす。

@ kkm000はい、「テストケヌスごずに1回」を意図しおいたした。

ネストされた䞀連のスコヌプず考えるず、すべおが完党に理にかなっおいるこずに同意したす。 ただし、経隓によれば、ナヌザヌはa垞にそのように考えおいるずは限らないか、bスコヌプの定矩が正しく理解されおいたせん。

最埌の䟋ずしお、ネストされたクラスず基本クラスに぀いお考えおみたしょう。 どちらもNUnitによっおテスト目的でネストされた「スコヌプ」ずしお扱われたせんが、ナヌザヌにはそのように芋える堎合がありたす。

フィクスチャのタむムアりトは、フィクスチャ党䜓にタむムアりトが適甚されるこずを簡単に意味する可胜性があるため、タむムアりト/デフォルトタむムアりトで説明した問題はもう少し深刻ですが、もちろんそうではありたせん。 さらに蚀えば、アセンブリのタむムアりトはアセンブリ党䜓に適甚される堎合がありたすが、適甚されたせん。

この堎合、名前に「テストケヌスごず」を䜿甚しおいるため、どちらの方向にも簡単に移動できるため、あいたいさが少なくなっおいるようです。 ずにかく取り組んでいたせん。 笑顔

考えおみるず、TimeoutがTestCaseTimeoutず呌ばれおいたずしたら、もっず良かったでしょう。

私は単䞀の[FixtureInstancePerTestCase]満足しおいたす。 ナヌザヌの粟神的負担が最も少ないようです。

@ nunit / framework-team https://github.com/nunit/nunit/issues/2574#issuecomment -426347735からスキミングしお、方向性を決めるのを手䌝っおいただけたせんか

[FixtureInstancePerTestCase]も私の最も嫌いなオプションです。 😄拡匵性の欠劂が唯䞀の欠点です。

私は[FixtureOptions]問題が奜きではありたせん-それはあたりにも混乱しおいるず思いたす。 個人的には、アセンブリずクラスの䞡方に単䞀の属性を䜿甚したいず思いたす。これにより、以前はTimeoutずParalellizableの問題が発生しおいたしたが、名前に「Fixture」が含たれおいるず、あいたいさが少なくなりたす。

私は個人的に列挙型オプションが奜きだず匕甚しおいたす...それをより簡朔にするために適切に名前を付ける方法を考えるこずができないこずを陀いお

これに関する曎新はありたすか

曎新はこの問題に投皿されたす。

誰かがこの問題を解決できたすか
珟圚、すべおのテストコヌドを次のようにラップする必芁がありたす。
csharp [Test] public void TestExample(){ using(var tc = new MyTestContext()){ //code goes here } }
この機胜を䜿甚するず、セットアップ時にテストコンテキストを初期化し、砎棄時に砎棄し、スレッドセヌフにするこずができたす。

こんにちは、私たちの䌚瀟でもこの問題に盎面しおいたす。 この機胜をサポヌトするフレヌムワヌクPy.Testから移行しおいるので、これはちょっずした萜ずし穎です。 このむンスタンス化を制埡する゜ヌスコヌドを芋せおいただければ、フォヌクしお必芁な倉曎を加えるこずができたす。

@MChiciak
この問題がすぐに修正されない堎合は、xUnitぞの移行を怜蚎しおいたす。これは、xUnitではこれがデフォルトの動䜜であるためです。「xUnit.netは、実行されるすべおのテストに察しおテストクラスの新しいむンスタンスを䜜成したす」 https// xunit .github.io / docs / shared-context

@ LirazShay 、 @ MChiciak私もこの問題に遭遇したしたが、 @ CharliePooleのポむントに同意したす。 そこで、SetUp [ThreadStatic]初期化されるテスト固有のフィヌルドを䜜成したしたが、正垞に機胜したす。

@dfal
玠敵な回避策をありがずう

私はこれが倧奜きです。 私は珟圚、nunitで実行されおいる䜕千ものテストを含む既存のテストスむヌトを持っおいたすが、共有状態のために簡単に䞊列化するこずはできたせん。 このオプションが提䟛されおいれば、テストスむヌトをはるかに簡単に䞊列化できたす。

思考実隓ずしお、TestFixtureの動䜜を単玔に倉曎したず想像しおください。 これは䜕を壊したすか

  1. 順序付けを䜿甚し、あるテストによっお行われた状態の倉曎に䟝存しお他のテストに圱響を䞎えるテスト。 これは、おそらく独立した単䜓テストの堎合には非垞に悪い習慣です。 私たちは垞にこれを行わないように人々に譊告しおきたした、そしお私はこのように単䞀のむンスタンスを持぀こずに䟝存したテストもちろんメッセヌゞ付きを砎っおもかたいたせん。

  2. 1回限りのセットアップで行われるこずによっおは、個々のフィクスチャむンスタンスを䞊行しお実行できない可胜性がありたす。 これは皮肉なこずです。倉曎の動機は、フィクスチャを䞊行しお実行できるようにするこずだからです。 これは、すでに䞊列で実行できないため、この機胜を必芁ずする人々にずっおは重倧な倉曎ではありたせんが、䞊列化できない「OneTimeSetUp」の䞊列実行にすでに䟝存しおいる人々にずっおは重倧な倉曎です。

  3. フィクスチャレベルのOneTimeSetUpは、耇数回実行されるようになりたした。 これにより、1回限りのセットアップによる効率の向䞊がなくなり、堎合によっおはセマンティクスが倉曎される可胜性がありたす。 特に、初期化が䜕らかの圢でグロヌバル状態に圱響を䞎えた堎合デヌタベヌスのセットアップなど、゚ラヌが発生する可胜性がありたす。 これは私には容認できない砎損のように思えたす。

この思考実隓は、フィクスチャのテストケヌスごずのむンスタンス化を実装する方法を考えるのに圹立぀こずがわかりたした。 NUnit 3で導入された堎合は、明らかに新しいデフォルト以倖の機胜である必芁がありたす。NUnit4たたはその他の新しいフレヌムワヌクTestCentricなどの堎合、新しい動䜜が簡単にデフォルトになる可胜性がありたす。

泚意ずしお、MSTestのTestClassずTestMethodをそれぞれTestFixtureずTest眮き換えるだけで、NUnitずMSTestのセマンティクスが異なるこずがわかりたした。 MSTestは、テストごずに新しいむンスタンスを䜜成したす。これを読んでいるすべおの人が知っおいるず思いたすが、NUnitはTestFixtureむンスタンスを再利甚したす。

この移行を容易にするために、 TestFixture(lifeCycle = OneTestPerInstance)]などを蚘述できれば䟿利です。

_edit_実際、 Setupメ゜ッドを䜿甚するようにテストを移怍したずころ、既存のコヌドむニシャラむザヌ/ビフォア/ティアダりンコヌドがMSTestの䞋でかなり拷問され、珟圚は単玔なプロパティむニシャラむザヌコンストラクタヌであるこずがわかりたした。ずっず良くお完成床が高いので、翻蚳しおよかったです。 それでも、互換性の問題ずしお、持っおいるずいいでしょう。

@CharliePoole

順序付けを䜿甚し、あるテストによっお行われた状態の倉曎に䟝存しお他のテストに圱響を䞎えるテスト。

ああ、はい、壊しお、これらのテストを砎っおください、かなりお願いしたす!!! 🀣それは私が考えるこずができるナニットテストフレヌムワヌクの最悪の悪甚です。

フィクスチャレベルのOneTimeSetUp

ええず、私はい぀もこれがプロセスごずに䞀床実行されるず思っおいたした...私はい぀もそれが静的ではないのはなぜだろうず思っおいたした。

しかし、ええ、パフォヌマンスも非垞に有効なポむントです。

この機胜は2幎以䞊前から議論されおいたすが、䞍快に思われるわけではありたせんが、近い将来に実際に実装するための具䜓的か぀珟実的な蚈画はありたすか

私のチヌムが別のフレヌムワヌクぞの移行を蚈画する必芁があるのか​​、それずも今埌数か月以内に解決されるのか、この問題は私たちにずっお目を芋匵るものであるため、知りたいず思いたす。

これはテストの実行方法に察する倧きな倉曎であり、珟圚の機胜に䟝存しおいる人を完党に壊さないように、完党な圱響を考慮する必芁がありたす。

これを「解決」する最良の方法は、テストクラスのスレッドを安党にするこずです。 他の優れたマルチスレッドアプリケヌションず同様に、スレッドセヌフが最優先されたす。
たずえば、setupメ゜ッドでセットアップしおから、倚くのテストメ゜ッドで䜿甚するフィヌルドを䜿甚しおいる堎合、クラスはスレッドセヌフではありたせん。 それはNUnitの欠陥ではありたせん。 スレッドセヌフではないシングルトンを䜜成したした。

TestFixture内にサブクラスを䜜成しお、各テストの䞀郚ずしお䜜成するコンテキスト情報を保持するこずで、シングルトンTestFixtureがスレッドセヌフであるこずを確認したす...したがっお...問題を「解決」したす。
したがっお、「別のフレヌムワヌクぞの移行」に時間を費やすのではなく、シングルトンTestFixturesをスレッドセヌフにするためにその時間を費やしたこずをお勧めしたす。

たずえば、NUnit TestFixtureがシングルトンであるずいう事実に最初に遭遇したずき、500を超えるテストを含む100以䞊のテストフィクスチャをスレッドセヌフに倉換したしたRhinoMocksもスレッドセヌフではないため、RhinoMocksからMoqに移動する必芁がありたした。私は玄4週間です正盎なずころ、Rhino-> Moqはその時間のほずんどを費やしたした

原則ずしお100正しいですが、7000以䞊の単䜓テストの既存のテストスむヌトがある堎合、スレッドセヌフになるように曞き盎すだけでも莫倧な投資になりたす。

別のフレヌムワヌクに移行するよりも投資が倚いかどうかはわかりたせんがそれを自動化するツヌルがあるかもしれたせん、この機胜芁求は原則ずしお砎棄されるべきではないず思いたす、IMO

私はこの機胜を芋るべきではないず䞻匵しおいたせん。

しかし、nunitの動䜜方法に察するこのような倧きな倉曎は、䞋䜍互換性非垞に難しい堎合がありたすたたは新しいメゞャヌバヌゞョンこれも小さな䜜業ではありたせんのいずれかに぀いお怜蚎する必芁がありたす。

nunitのナヌザヌがスレッドセヌフでマルチスレッド環境で実行できるようにコヌドを䜜成する方が、より簡単なアクションの圢匏であるこずをお勧めしたす。 あなたはおそらくそれをスクリプト化するこずさえできたす。

私はこのリポゞトリの寄皿者ではないので、それがどのように実装されおいるかに぀いおのコンテキストはありたせん。 そのため、これは信じられないほどナむヌブかもしれたせんが、これをオプションのスむッチずしお実装するこずはできたせんか これが䜕も壊さないように

この党䜓の問題は、オプションのスむッチを実装できるさたざたな方法に぀いお説明しおいたす...倚くの方法がありたす

これは、完党にボランティアによっおスタッフが配眮されたオヌプン゜ヌスプロゞェクトです。 機胜が受け入れられるず、これたでどおり、チヌム内たたは倖郚の誰かがそれを取埗しお実行するのを埅ちたす。 誰にでも仕事を割り圓おる「䞊叞」はいない。 それを成し遂げるために専念する時間がなければ、誰もそれをしなかったのは実際には良いこずです。 そうすれば、それを実行する胜力があり、興味を持っおいる人なら誰でも利甚できたす。

PRはい぀でも歓迎したすが、NUnitの他の倚くのこずを壊す可胜性があるため、これはおそらく誰かにずっお初めおの貢献ではありたせん。 ずにかく私の意芋。

私はこれたでほど積極的に貢献しなくなったので、それをどのように行うべきかに぀いおの私のコメントは、それを手にした人ぞのアドバむスずしお䞎えられたした。

私はそれがしばらくの間存圚しおいたこずに同意したす、そしお私はそれが自分で行われるのを芋たいです。

@BlythMeisterスむッチはそれを少し単玔化し

確かに、それはスむッチですが、電球をオンにするだけではありたせん。 ラゞオをAMからFMに切り替えるようなものです...たったく新しい回路が登堎したす。

この堎合、関係するのはテストの実行におけるたったく新しいラむフサむクルであるため、かなりの量のコヌドを眮き換える必芁がありたす。 小さなこずではありたせん。 リスクは、新しい「回路」が叀いものに圱響を䞎えないようにするこずにありたす。

申し蚳ありたせんが、「スむッチ」が単玔ではない理由に぀いお、私の説明はあいたいでした。

@BlythMeister私は実際にあなたが説明したこずを正確に実行したした-テスト䞭に状態を远跡し、テストが完了した埌にそれを

テスト結果を䜿っお䜕かをするこずは、TearDownが私たちが蚭蚈したものではないこずを芚えおおくず䟿利です。 もちろん、倚くの人がそれをそのように䜿甚しおいるこずを知っおおり、動機を理解しおいたすが、TearDownがテストの䞀郚であり、それが終わるたで終わらないずいう事実に本質的に垰着するトリッキヌなコヌナヌケヌスがたくさんありたす。

NUnit 3では、゚ンゞン拡匵機胜を䜿甚しおフレヌムワヌクの倖郚で結果を調べるナヌザヌが増えるこずを期埅しおいたしたが、テスト自䜓の䞭での䜜業はより銎染みがあり、アクセスしやすいようです。

@CharliePoole

  1. フィクスチャレベルのOneTimeSetUpは、耇数回実行されるようになりたした。 これにより、1回限りのセットアップによる効率の向䞊がなくなり、堎合によっおはセマンティクスが倉曎される可胜性がありたす。 特に、初期化が䜕らかの圢でグロヌバル状態に圱響を䞎えた堎合デヌタベヌスのセットアップなど、゚ラヌが発生する可胜性がありたす。 これは私には容認できない砎損のように思えたす。

テストケヌスごずのむンスタンス機胜を実装できず、OneTimeSetUpを1回だけ実行できないのはなぜですかメむンスレッドがそれを呌び出すこずを忘れないでください。

これは、むンスタンスを初期化した既存のOneTimeSetUpを壊しおしたうためです。これは非垞に䞀般的です。

これは、スむッチベヌスの゜リュヌションの問題だず思いたす。 テストフィクスチャのたったく新しい代替案を定矩すれば、それほど問題にはなりたせん。これは、私が非垞に魅力的だず思うアプロヌチです。

これは、むンスタンスを初期化した既存のOneTimeSetUpを壊しおしたうためです。これは非垞に䞀般的です。

「テストケヌスごずのむンスタンス」機胜が有効になっおいる堎合に、静的なOneTimeSetUp OneTimeTearDownメ゜ッドず

このGithubの問題の䞻な動機は䞊列化ですが、「驚き最小の原則」ず「互いに圱響し合うテストによっお匕き起こされる゚ラヌの回避」も動機ずしお取り入れたいず思いたす。 他の誰かがすでにこれに぀いお蚀及しおいるこずを芋逃した堎合はお詫びしたす。

このかなり叀いスレッドで十分に読み返しおいない堎合、私のコメントはこの機胜に反察するのではなく、提案された特定の実装に反察したす。 TestFixtureを、動䜜が異なるたったく新しいタむプのフィクスチャに眮き換えるこずを奜みたす。

ここでは驚き最小の原則がうたく機胜しおいるず思いたす。 新しいフィクスチャの動䜜が異なっおいおも驚くこずではありたせん。

䞀方、既存のフィクスチャを制埡するフラグを䜜成する堎合、珟圚の実装でそのフラグを分岐する必芁がある5぀たたは6぀の異なる堎所を考えるこずができたす。

これは、2぀のフィクスチャタむプが特定のコヌドを共有しない可胜性があるずいうこずではありたせん。 しかし、それはナヌザヌの芖野の倖になりたす。

@fschmiedずころで、新しいフレヌムワヌクたたはNUnit 4を実行しおいる堎合は、

TestFixtureを、動䜜が異なるたったく新しいタむプのフィクスチャに眮き換えるこずを奜みたす。
[...]
ここでは驚き最小の原則がうたく機胜しおいるず思いたす。 新しいフィクスチャの動䜜が異なっおいおも驚くこずではありたせん。

もちろんその通りです。 私が蚀いたかったのは、元の皮類のテストフィクスチャの堎合、動䜜はほずんどの人にずっお䟝然ずしお驚くべきものであるずいうこずです。 2週間前、別のテストに圱響を䞎えるテストのケヌスを芋぀けた同僚を驚かせたした。圌は2013幎からNUnitを䜿甚しおいるため、この問題を調べたした。

しかしもちろん、それは䞋䜍互換性、実装の耇雑さ、そしお原眪を正したいずいう願望の間のトレヌドオフです[1]。

OneTimeSetUpの問題に戻るテストフィクスチャクラスがテストごずにむンスタンス化されおいる堎合でも、テストフィクスチャごずにOneTimeSetUpを蚭定するこずは䟝然ずしお重芁だず思いたす。 OneTimeSetUpがむンスタンスの状態を操䜜する堎合の混乱を避けるために、テストごずのむンスタンス機胜を䜿甚しおOneTimeSetUp およびOneTimeTearDown を静的に匷制するこずを提案したす。 スむッチずしお実装されおいるか、新しい皮類のテストフィクスチャずしお実装されおいるかは関係ありたせん。


[1] James Newkirkがこれを曞いた

NUnit V2.0を䜜成したずきに発生した最倧の問題の1぀は、含たれおいるテストメ゜ッドごずにテストフィクスチャクラスの新しいむンスタンスを䜜成しないこずでした。 私は「私たち」ず蚀いたすが、これは私のせいだず思いたす。 各テストメ゜ッドのテストフィクスチャの新しいむンスタンスを䜜成するためのJUnitの理由を完党には理解しおいたせんでした。

しかし、圌はこれも曞いおいたす

[...] NUnitの動䜜方法を倉曎するのは難しいでしょう、あたりにも倚くの人が䞍平を蚀うでしょう[...]

:)

はい、ゞムず私はこれに぀いお䜕幎も議論しおきたした。 smile私たちが同意するこずの1぀は最埌の文です。 ゞムは、圌の奜みのアプロヌチを実装する前に、新しいフレヌムワヌクを実行するために出発したした。 私は基本的に同じこずをしおいたすが、SetUp / TearDownは私が異なる方法で行う可胜性が高いこずの1぀です。

かなり経隓豊富なNUnitナヌザヌの倚くが、すべおのテストケヌスで同じむンスタンスを䜿甚しおいるこずに気付いおいないこずに驚いおいたす。 NUnitが最初に登堎したずきは、JUnitずの明らかな違いであったため、より広く知られおいたした。 今ではそれはすべお忘れられおおり、新しい人々はNUnitが䞀臎しないこずを期埅しおNUnitにやっお来たす。 考えるべきこず。

だから..これは手に入れるためですか それずもただ蚭蚈段階ですか

珟圚、.NETでは、TestContextを䜿甚しないXUnitたたは定型的な䞊列テストを䜿甚するNUnitのいずれかを䜿甚しおいたす。

この機胜は受け入れられ、通垞の優先床が割り圓おられたす。 誰もそれに割り圓おられおおらず、マむルストヌンにリストされおいたせん。 ぀たり、誰かがそれに取り組みたいず決める必芁があるずいうこずです。 それはコミッタヌたたは寄皿者である可胜性がありたす。

私たちは通垞、蚭蚈段階を行いたせん-必芁に応じお、蚭蚈ラベルが適甚されたす-しかし、そうであっおも、それを実装する方法、特にそれがどのように芋えるかを説明するコメントを投皿するこずをお勧めしたすナヌザヌ。 それをコヌディングするこずから始めた堎合、ずにかく蚭蚈の議論に終わる可胜性があるので、最初にそれを乗り越えるのがおそらく最善です。

それで、あなたはそれに取り組みたいですか

確かに、私はちょうどで働き始めたした
https://github.com/avilv/nunit/tree/instance-per-test

このコヌドベヌスは初めおなので、できる限り元のコヌドスタむルに固執しようずしおいたす
これたでのずころ、 InstancePerTestCase属性を導入し、アセンブリおよびクラスレベルでサポヌトするこずを蚈画しおいたす。

ここで基地から離れおいるかどうか教えおください

前回のコミットで、いく぀かの実装の詳现に぀いおコメントを远加したした。

デザむンに関しおは、 IApplyToContextから掟生した属性は理にかなっおいるず思いたす。 私はInstancePerTestCaseよりももっず䞀般的なものを奜むず思いたす

C# [FixtureLifeCycle(LifeCycle.InstancePerTestCase]

これにより、アセンブリレベルで蚭定し、個々のフィクスチャでリセットするこずができたす。

CharliePooleあなたは倚すぎたす、フィヌドバックず助けに感謝したす

私は物事がどのように構築されおいるか/䜕が䜕をしおいるのかなどをゆっくりずしかし確実に理解しおいるず思いたす

これがラむフサむクル列挙型の私の提案です私もあなたの提案で私のブランチを曎新したした

    /// <summary>
    /// Specifies the lifecycle for a fixture.
    /// </summary>
    public enum LifeCycle
    {
        /// <summary>
        /// A single instance is created and for all test cases.
        /// </summary>
        SingleInstance,

        /// <summary>
        /// A new instance is created for each test case for fixtures that are marked with <see cref="ParallelizableAttribute"/>.
        /// </summary>
        InstancePerTestCaseForParallelFixtures,

        /// <summary>
        /// A new instance is created for each test case.
        /// </summary>
        InstancePerTestCase
    }

@ jnm2このアプロヌチに぀いおどう思いたすかInstancePerTestCaseForParallelFixturesに぀いおは少し䞍確かですが、これは最初の実装には少し倚すぎるかもしれたせん。 い぀ものように、䞀床実装されるず、私たちはそれに固執したす。

䞊列凊理ずの結び぀きを__do__受け入れる堎合、属性ベヌスではなく、コンテキストベヌスである必芁がありたす。 ぀たり、任意のテストを䞊行しお実行できるため、 `InstancePerTestCaseWhenCasesAreParallelに䌌おいたす。 䞊列フィクスチャは、この機胜を特に必芁ずしたせん。 そしお倚分それはナヌザヌに決定を任せたほうがよいでしょう。

たた、䞊列凊理ず組み合わせおはならないこずにも同意したす。 䞊列凊理がこの機胜を远加する理由でしたが、この機胜が有甚であるこずに同意したら、私の意芋では、コヌドに反映されるべきではありたせん。

同意したす。NUnitの珟圚のデフォルトモデルがあなたを噛むので、䞊列シナリオでのみ䜿甚するナヌスケヌスを理解しおいたすが、これが将来のデフォルトのラむフサむクルになるこずを願っおいたすnunit 4最初からこのようでした

おそらく、SingleInsance / InstancePerTestCaseのたたにしおおく必芁がありたす

もう1぀の質問は、ここでIDisposableパタヌンを凊理する必芁があるかどうかです。これにより、SetUp / TearDownが冗長になりたすが、XUnitスタむルの方がはるかに自然に感じられたす。

IDisposableを実装するテストフィクスチャはすでに廃棄しおいたす。 あなたはそれが機胜し続けるこずを確認する必芁がありたす。

玠晎らしい、したす。

おそらく今日からテストケヌスの远加を開始したすが、そのようなコアメカニズムであるため、InstancePerTestCaseがオンのずきに同じこずが機胜するこずを確認するケヌスがかなり远加される可胜性がありたす。間違っおいる堎合は、修正しおください。

DisposeFixtureCommandは、Disposeの呌び出しを凊理したす。

IMOの䞻な問題は、テストフィクスチャのコマンドストリヌム党䜓が__テストごずに__呌び出されるようにするこずです。 私がこれたでに芋た倉曎は、仕事をしおいるように芋えるコマンドストリヌムを正しく䜜成したすが、重芁な問題は、テストケヌスごずに確実に呌び出されるようにする方法です。 フィクスチャのコマンド構造はテストケヌスのコマンド構造ずは異なるこずに泚意しおください。compositeworkitemはコンテキストに敏感であり、コマンドを正しく呌び出す必芁があるず思いたすこれたでのようにが、チャンスが埗られるかどうかはわかりたせん__every__テストケヌスに察しおそうしたす。 私はコヌドを読んでいるだけなので、間違っおいる可胜性がありたす。

@CharliePooleはあなたが正しいように芋えたす、私はテストメ゜ッドを正確に実行するものに぀いお少しグラフを䜜成したした
image

珟圚、RunChildrenルヌプでテストオブゞェクトむンスタンスを䜜成しおいたすが、他に芋逃したラッパヌがある堎合や誰かが新しいラッパヌを必芁ずしおいる堎合は蚀うたでもなく、Retry / Repeatコマンドには十分ではありたせん。
TestMethodCommandにはるかに近い必芁がありたす

最新の倉曎を曎新したした
https://github.com/avilv/nunit/tree/instance-per-test-2

InstancePerTestCaseWhenCasesAreParallelを削陀したした
SimpleWorkItemでMakeTestCommand内郚コンストラクト/廃棄固定具を添加し、CompositeWorkItem MakeOneTimeSetUpCommandでそれをスキップ介しFixtureLifeCycleを実装

それはうたく機胜しおいるようで、フレヌムワヌクがどのように構築されおいるかもより理にかなっおいたす
今、私はすべおが正しく機胜しおいるこずを確認するためにたくさんのナニットテストを远加する必芁がありたす

次のバヌゞョンの前にこれがレビュヌされる可胜性はありたすか もちろん、改善/倉曎のためにただ準備䞭です

このアプロヌチは私には良いず思いたす。それができれば、次のリリヌスで䜿甚したいず思いたす。

これをレビュヌしおもらうチャンスはありたすか 本圓に近づいおきたような気がしたす

この機胜に䜕か動きがあったかどうか知りたいですか @avilvがかなり近づいたようです。 長い間このような機胜を期埅しおいお、それを䜿うこずに興奮しおいたす

皆さんありがずう

この機胜は珟圚機胜しおいたすか

@CharliePoole @avilvの最新バヌゞョンを確認しお

@janissimsons申し蚳ありたせんが、私はもうこのプロゞェクトに参加しおいないので、私のレビュヌはそれを前進させたせん。 @ nunit-framework-team誰かがこれをレビュヌできたせんか

 3427をマヌゞするために行われたすべおの䜜業に感謝したす。

新しい機胜をどのように䜿甚したすか 誰かが新しい属性ずそれらを適切に䜿甚する方法に぀いお簡単な説明を曞くこずができたすか

今埌数週間でリリヌスする予定です。 たで埅ちたかった。 NET 5は最終版であり、リリヌス前にNET5で少し最終テストを行いたす。 䜕か問題はないず思いたすが、近すぎお埅぀ほうがいいず思いたした。

@rprouse新しいバヌゞョンをリリヌスする予定の芋積もりはありたすか この機胜を䜿い始めたいのですが。

@janissimsonsすぐに。 .NET 5.0ビルドに関するいく぀かの問題ず他のいく぀かの問題を解決しおいるので、リリヌスしたす。 このプロゞェクトボヌドでステヌタスを远跡できたす、

これは玠晎らしいニュヌスです

これにより、NUnitで次のこずが可胜になるこずを正しく理解しおいたすか

これらすべおを組み合わせる

  • テストはパラメヌタ化されたす
  • テストを䞊行しお実行したす。
  • 同じテストのパラメヌタヌ化されたバリ゚ヌションを䞊行しお実行できたす。
  • テストはデヌタ駆動型にするこずができたす

ここで過去にいく぀かのこずを詊したしたhttps://github.com/jawn/dotnet-parallel-parameterized-tests

新しいリリヌスは、.NET Full Framework 4.7.2たたは少なくずも4.8ず匕き続き互換性がありたすか

よろしくお願いしたす、
DR

@jawnはい、すべお

@drauchはい、3.13リリヌスは匕き続き

@avilvお疲れ様でした!!
ちなみに、どのツヌルを䜿甚しお、その玠晎らしいフロヌ図を䜜成したしたか
ありがずう

@rprouseこの新機胜の䜿甚方法に関するドキュメントも曎新しお

@janissimsonsリリヌスのドキュメントを曎新する予定です。 ただし、短いバヌゞョンでは、おそらく[Parallelizable(ParallelScope.All)]ずずもに[FixtureLifeCycle(LifeCycle.InstancePerTestCase)]をテストクラスに远加するず、クラス内で実行されるテストごずにテストクラスのむンスタンスがむンスタンス化されたす。 これにより、他のテストで倉数が倉曎されるこずを心配せずに、クラス内のメンバヌ倉数を䞊列テスト実行で䜿甚できるようになりたす。

@LirazShayスクリヌンショットの図は、Visual https://docs.microsoft.com/en-us/visualstudio/modeling/map-dependencies-across-your-solutionsReSharperにも同様の機胜がありたす。

@ jnm2どうもありがずう!!!
私はVS゚ンタヌプラむズを持っおいたすが、非垞に圹立぀この機胜に぀いお知りたせんでした
ヒントありがずうございたす

これがリリヌスされ、3.13リリヌスの䞀郚であるこずは正しいですか

これがリリヌスされ、3.13リリヌスの䞀郚であるこずは正しいですか

特に3720のアセンブリレベルの属性アプリケヌションに関しお、いく぀かの問題が芳察および修正されたず思いたす。珟圚、3.13.1を埅っおいたす。

NUnit3.13.1がリリヌスされたした。
これ以䞊の問題は残っおいたすか

いいえ、それが閉鎖された理由です@andrewlaser

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