Nunit: AssertionException์„ ์žก์œผ๋ฉด 3.10 ์ดํ›„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 03์›” 14์ผ  ยท  22์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: nunit/nunit

````
๋…ธ๋ ฅํ•˜๋‹ค
{
Assert.True(๊ฑฐ์ง“, "์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€");
}
catch(AssertionException e)
{
Trace.WriteLine("๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.");
}

        Trace.WriteLine("Test Passed");

````

Nunit 3.9.0์—์„œ ์ด ํ…Œ์ŠคํŠธ๋Š” ์„ฑ๊ณต์ ์ด๋ฉฐ Visual Studio ํ…Œ์ŠคํŠธ ํƒ์ƒ‰๊ธฐ์—์„œ ์‹คํ–‰ํ•  ๋•Œ ํ…Œ์ŠคํŠธ ํƒ์ƒ‰๊ธฐ์—์„œ ํ†ต๊ณผ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Nunit 3.10์—์„œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ…Œ์ŠคํŠธ ํƒ์ƒ‰๊ธฐ ๊ฐœ์š”์—์„œ ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ถ”์  ๋ผ์ธ์€ ๋‘ ๋ฒ„์ „ ๋ชจ๋‘์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@fluffynuts ์˜ค๋ž˜์ „์— ๋‚ด๊ฐ€ Assert.Catch ์ฒ˜์Œ ์ผ์„ ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋ฟ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋ณ€๊ฒฝ๋˜์–ด ๋” ์ด์ƒ Assert.Throws ํ•ด๋‹นํ•˜๋Š” "์ค‘๋ฆฝ"์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ํ•˜๋‚˜๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Assert.Throws ์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์€ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ๋™๊ธฐ ์ฝ”๋“œ๋งŒ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ Assert.Throws ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ๋กœ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```C#
๊ณต๊ฐœ ์ •์  ๋ฌดํšจ ์˜ˆ์™ธ SafelyCatchAnNUnitException(TestDelegate ์ฝ”๋“œ)
{
์˜ˆ์™ธ catchException = null;

using (new TestExecutionContext.IsolatedContext())
{
    try
    {
        code();
    }
    catch (Exception ex)
    {
        caughtException = ex;
    }

    return caughtException;
}

}
```

์ด ๋ฉ”์„œ๋“œ๋Š” NUnit์˜ assert ๋ฉ”์„œ๋“œ๊ฐ€ ๋‚จ๊ธด ์˜ค๋ฅ˜์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•˜์—ฌ throw๋œ ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ์—์„œ ๋” ๋†’์€ ์ˆ˜์ค€์—์„œ IsolatedContext() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ฐธ์กฐ ์—†์ด ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์ˆ˜์ค€์—์„œ ์™„์ „ํžˆ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” NUnit์ด ํ˜„์žฌ ์ž์ฒด ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹๋ณด๋‹ค ์šฐ์ˆ˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  22 ๋Œ“๊ธ€

๊ท€ํ•˜์˜ ํ…Œ์ŠคํŠธ๋Š” NUnit์˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์ œ์•ˆ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  ์–ด์„ค์…˜ ์‹คํŒจ๋Š” AssertionException์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  2. ์˜ˆ์™ธ๋ฅผ ์žก๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ณด๊ณ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ฌธ์žฅ์€ ๋Œ€๋ถ€๋ถ„ ์‚ฌ์‹ค์ด์ง€๋งŒ ์—ฌ๋Ÿฌ ์ฃผ์žฅ ๋ธ”๋ก ๋‚ด์—์„œ ๋˜๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•  ๋•Œ ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์ „ํ˜€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋ฅผ ์žก์„ ๋•Œ๊นŒ์ง€๋Š” ์ด๋ฏธ ์‹คํŒจ๊ฐ€ ๊ธฐ๋ก๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ NUnit์˜ ๋‚ด๋ถ€ ๋™์ž‘์˜ ๋ณ€๊ฒฝ์œผ๋กœ, ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ €๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ช‡ ๋…„ ๋™์•ˆ ๊ทธ๋Ÿฌํ•œ ํ–‰๋™์— ์˜์กดํ•˜์ง€ ๋ง๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๊ตฌํ˜„์˜ ์šฐ์—ฐ์— ๋ถˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์ƒ˜ํ”Œ ์ฝ”๋“œ๋Š” ๊ท€ํ•˜๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋ฅผ ์žก๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์ž‘์—…์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์งง์€ ์‹œ๊ฐ„์— ๋‹ค์‹œ ์—ฐ๋ฝํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ƒํ™ฉ์ด ์•„์ง ๋ถˆ์•ˆ์ •ํ•  ๋•Œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋•Œ๋•Œ๋กœ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ ์šฐ๋ฆฌ๋Š” ์ด ๋ถˆ์•ˆ์ •ํ•œ ๋™์ž‘์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ์—์„œ ์‹คํŒจํ•˜๋Š” ๋Œ€์‹  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด Warn.If() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ ํƒ์ƒ‰๊ธฐ์—์„œ ๊ฒฐ๊ณผ๊ฐ€ "Test Skipped"๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์ „ํ˜€ ๊ฑด๋„ˆ๋›ฐ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๊ณ  ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€์‹  ์–ด์„ค์…˜ catch๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๊ฒฝ๊ณ ๋ฅผ ์ถ”์ ํ•˜๋„๋ก ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ฝค ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ๊นŒ์ง€๋Š”.

์ด ๋ณ€๊ฒฝ์ด ์˜๋„์ ์ธ ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ์„ ์••๋‹ˆ๋‹ค.

Warn.If ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ... ํ…Œ์ŠคํŠธ ํƒ์ƒ‰๊ธฐ์—์„œ __except__. ๐Ÿ˜ข ๋ฌธ์ œ๋Š” ํ…Œ์ŠคํŠธ ํƒ์ƒ‰๊ธฐ๊ฐ€ ํ•ฉ๊ฒฉ๊ณผ ๋ถˆํ•ฉ๊ฒฉ์€ ์•Œ์ง€๋งŒ ๊ฒฝ๊ณ ๋Š” ๋ชจ๋ฅธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฝ๊ณ  ๊ฒฐ๊ณผ ์ƒํƒœ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๊นŒ์ง€ ๊ฒฝ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ฒˆ์—ญํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. FWIW๋Š” Inconclusive ๊ฒฐ๊ณผ ์ƒํƒœ์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ณ€๊ฒฝ์€ ์˜๋„์ ์ด์—ˆ๊ณ  ์˜ค๋žซ๋™์•ˆ ๊ณ„ํš๋˜์–ด ์™”์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„ ๋™์•ˆ ์˜ˆ์™ธ์— ์˜์กดํ•˜๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฉฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์–ด์„ค์…˜์˜ ๊ฒฐ๊ณผ(๊ฒฐ๊ตญ ํ†ต๊ณผ๋œ ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ)๋ฅผ ๋ณด๊ณ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ–ˆ์ง€๋งŒ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ถˆ์•ˆ์ •ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ˆ˜๋…„๊ฐ„ ํ‘œ์ค€์€ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋งŽ์€ ํŒ€์ด "๋ฌด์‹œ๋œ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฌด์‹œ"ํ•˜๋ฏ€๋กœ ์ข‹์€ ์„ ํƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํŒ€์—์„œ ๊ฒฝ๊ณ ๋ฅผ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์ด๋„๋ก ํ›ˆ๋ จํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด(์‚ฌ์‹ค์ƒ ์˜ค๋ฅ˜ ๋ฐ ์‹คํŒจ๋งŒํผ์ด๋‚˜ ์‹ฌ๊ฐํ•˜๊ฒŒ) ๊ฒฝ๊ณ  ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ทจ์•ฝ์„ฑ์„ ๊ฐ•์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ์€ ์ข…๋ฃŒ ์†์„ฑ๊ณผ ํ•จ๊ป˜ ๋ฌด์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋‚ ์งœ๊นŒ์ง€ ์ˆ˜์ •๋˜์ง€ ์•Š์œผ๋ฉด ์‹คํŒจ๋กœ ๋ณ€๊ฒฝ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

BTW, ๋‚ด๊ฐ€ ํŒ€์„ ์ง€๋„ํ•  ๋•Œ ๋‚˜๋Š” ๋ณดํ†ต ๋ฌด์‹œ๋œ ํ…Œ์ŠคํŠธ์˜ Big Visible Display๋ฅผ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํŒ€์—์„œ๋Š” ๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ๋‹ด๋‹นํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ๋น„์ •์ƒ์  ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ถ€๋ฅผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋ฌธ์ œ๋ฅผ ๋ณผ ๋•Œ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@svanimpelen ๋น„์ •์ƒ์  ํ…Œ์ŠคํŠธ์— Retry ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ ? ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•˜์—ฌ ํ†ต๊ณผํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ์ƒ‰๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ฒฝ๊ณ ๋กœ ์ธํ•ด ํ˜„์žฌ ์ง€์›ํ•˜๋Š” MSTest์˜ ์ œํ•œ๋œ ์ˆ˜๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฒฐ๊ณผ ์ƒํƒœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก Visual Studio ํŒ€๊ณผ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•˜๋ฏ€๋กœ ์•ž์œผ๋กœ ๊ฐœ์„  ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ ๋‹น์‹ ์€ ๊ฑด๋„ˆ ๋›ฐ๋Š” ๊ณ ํ†ต์„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฑด๋„ˆ๋›ฐ๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ฒฝ๊ณ ๊ฐ€ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜„

API๊ฐ€ ์‹คํŒจ ์‹œ AssertionException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค๋Š” ๋งŽ์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/nunit/nunit/blob/d03e93c8f25170a8ff48e80863a3fe6fd294613a/src/NUnitFramework/framework/Assert.That.cs#L40 -L43

์ด ๋ฌธ์„œ์™€ NUnit์˜ ์˜ค๋žœ ๋™์ž‘์ด 3.10์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์—†๋‹ค๋ฉด ์ ์–ด๋„ ์ง€๊ธˆ์€ ์ž˜๋ชป๋œ ๋ฌธ์„œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์–ด์„ค์…˜ ๋ธ”๋ก์„ ๋„์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ๊ฐ€ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ด ๊ฒฝ์šฐ์—๋Š” AssertionException ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ฐจ์ด์ ์€ ์˜ˆ์™ธ๊ฐ€ ํฌ์ฐฉ๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด์ œ ํ…Œ์ŠคํŠธ๊ฐ€ Visual Studio์—์„œ ์‹คํŒจ๋กœ ๋ณด๊ณ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํš๊ธฐ์ ์ธ ๋ณ€ํ™”๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ ํ–‰๋™์— ์˜์กดํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ฃผ๋ฌธํ•˜๊ธฐ ์œ„ํ•ด ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ์˜์กดํ•˜๋Š” ์‚ฌ์šฉ์ž์™€ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ ๋ฐœ์ƒ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋Œ€์‹  false ์กฐ๊ฑด์ด ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ–ˆ๋‹ค๊ณ  ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ /๋˜๋Š” ๋‹ค์ค‘ ์ฃผ์žฅ ๋ธ”๋ก์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐœ์ธ์ ์œผ๋กœ throw๋˜๋Š” ์˜ˆ์™ธ ์œ ํ˜•์€ ๋‚ด๋ถ€ ์„ธ๋ถ€ ์ •๋ณด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ ์‚ฌ์šฉ์ด ์–ด๋””์—๋‚˜ ๋ฌธ์„œํ™”๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‚ด๋ถ€์˜ ์œ„ํ‚ค ์„น์…˜์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ๋ฌธ์„œ์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ช…๋ฐฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. C#์—๋Š” ํ™•์ธ๋œ ์˜ˆ์™ธ๊ฐ€ ์—†์œผ๋ฉฐ XML ๋ฌธ์„œ๋Š” ๋ฉ”์„œ๋“œ ๊ณ„์•ฝ์˜ ํ•ด๋‹น ๋ถ€๋ถ„์„ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ "throws X"๋ผ๋Š” ์–ธ์–ด๋Š” ํ•ญ์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ทธ๊ฒƒ์„ ์žก์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋ฐ›์•„๋“ค์˜€๋Š”์ง€ ์•ฝ๊ฐ„ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. ์œ„ํ‚ค์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•ˆ์ „ํ•œ ์ชฝ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

XML ๋ฌธ์„œ์—์„œ AssertionException์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ AssertionException์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๊ฒฝ๊ณ ํ•˜๋Š” ์œ„ํ‚ค ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

๐Ÿ’ญ AssertionException ์žก๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๋ฒ„๊ทธ๋ผ๋ฉด, ๊ทธ ์œ ํ˜•์„ ๋‚ด๋ถ€์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@jnm2.

๋‚˜๋Š” XML ๋ฌธ์„œ์˜ ์ค‘์š”์„ฑ์— ๋™์˜ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ๊ทธ ๋ฌธ์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๊ณ„์•ฝ์˜ ์ผ๋ถ€๋ฅผ ํ†ต์‹ ํ•ด์˜จ ๋ฐฉ์‹์ด __์•„๋‹™๋‹ˆ๋‹ค__. ๋‚˜๋Š” ์‹ค์ œ๋กœ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ œ์•ˆํ•œ ์ฒซ๋ฒˆ์งธ ์‚ฌ๋žŒ์ผ์ง€๋„ ๋ชจ๋ฅธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋งŽ์€ ์ž˜๋ชป๋œ ๋Œ“๊ธ€์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์ธ์‹ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฐ๊ฐ์˜ ๋ฌธ์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๊ธฐ๋ณธ ๋™์ž‘ ๋ณ€๊ฒฝ์„ ์ค‘๋‹จ์œผ๋กœ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ฌธ์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊นจ์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ฃผ์š” ๋ณ€๊ฒฝ ๋ชฉ๋ก์— ๋ฌด์—‡์ด ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ณผ๊ฑฐ ์˜๊ฒฌ์„ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”ผํ•ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•˜๋ ค๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์‚ฌ์šฉ์ž๋ฅผ ๋ง์น  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์ฐจ์ด์ ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. __ํŒŒ๊ดด๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ__์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ CYA์™€ ๊ฐ™์€ ๋ƒ„์ƒˆ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ๊ฒฝ์˜์ง„์ด ์‹คํŒจ ์ž์ฒด๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ๋ณด๋‹ค ๋ˆ„๊ฐ€ ์‹คํŒจ์˜ ์ฑ…์ž„์„ ์ง€๋Š”์ง€์— ์ง‘์ค‘ํ•  ๋•Œ ๋•Œ๋•Œ๋กœ ํƒ๋‹‰ํ•˜๋Š” ์ข…๋ฅ˜์˜ CYA์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... "๋ด, ์šฐ๋ฆฌ๋Š” ๋ฎ์—ฌ์žˆ๋‹ค." ์šฐ๋ฆฌ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋งŒ ๋ฌธ์„œํ™”ํ•˜๋ฉด ์ž˜๋ชป๋˜๊ณ  ์‚ฌ๊ณผํ•ด์•ผ ํ•  ์œ„ํ—˜์ด ์žˆ์ง€๋งŒ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ง‘ํ•ฉ์„ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ›„์ž๋ฅผ ์„ ํ˜ธํ•œ๋‹ค.

์–ด์„ค์…˜ ์˜ˆ์™ธ๋ฅผ ์žก๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, TestExecutionContext๊ฐ€ ๊ด€๋ จ๋˜์ง€ ์•Š๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•  ๋•Œ ์•ˆ์ „ํ•˜๊ฒŒ ์œ ์ง€๋˜๋„๋ก ์–ผ๋งˆ ์ „์— ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ๋งŒ๋“ค๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๊นจ์„œ ๊ธฐ๋ปค๋Š”๋ฐ ํŒ€์—์„œ ์•ˆ๋œ๋‹ค๊ณ  ํ•ด์„œ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ๊นจ๊ณ  ์‹ถ์€์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ˆ˜์ •์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ…Œ์ŠคํŠธ ์ž์ฒด ๋‚ด๋ถ€์—์„œ ์˜ˆ์™ธ๋ฅผ ์žก๋Š” ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ˜„์žฌ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ __ํ•˜์ง€__ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ์—์„œ AssertionException์„ ์žก๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ๊ณ ์ „์ ์ธ "๋ƒ„์ƒˆ"๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ๊ตฌ์ฒด์ ์ธ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ด์•ผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ "Catching AssertionException์€ NUnit ๋‚ด๋ถ€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ง€์‹์ด ์—†๋Š” ํ•œ ์˜ค๋ฅ˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์„ ๋ณด์žฅํ•˜๋ ค๋ฉด ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜์ง€ ๋ง๊ณ  ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ์˜ˆ์™ธ๋ฅผ ๋‹ค์‹œ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ." ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ๋Ÿฌํ•œ ์ •๋ณด๊ฐ€ XML ๋ฌธ์„œ ๋˜๋Š” ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ๋ฌธ์„œ์— ์†ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์„น์…˜์— ํŽ˜์ด์ง€๋กœ ๋„ฃ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

BTW, ๋‚ด ๊ณผ๊ฑฐ ๊ฒฝํ—˜์€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฌธ์„œํ™”ํ•œ ๋‹ค์Œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๊ณ  ๋งํ•˜๋ฉด ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜„

์ข‹์€ ์ , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ CYA์˜ ๊ด€์ ์—์„œ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์š”์†Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์†Œ๋น„์ž๋กœ์„œ ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋ชจ๋“  ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋“ฃ๋Š” ๊ฒƒ์— ๊ฐ์‚ฌํ•˜์—ฌ ์ œ ์ฝ”๋“œ์—์„œ ์ž˜๋ชป๋œ ๊ฐ€์ •์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์ฐจ๋ฆฌ์ง€ ๋ชปํ•˜๋Š” ์ด์™€ ๊ฐ™์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ๊ฒฝ์šฐ. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ์‚ฌํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋Š ์ •๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ํˆฌ์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์™œ ์ƒˆ๋กœ์šด๊ฐ€?

์ œ๋ชฉ์€ ์ˆ˜์ •ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋‹ต๋ณ€๋œ ์งˆ๋ฌธ์œผ๋กœ ๋‹ซ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ด ๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•ฉ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•œ ์ผ์€ ๋ฌธ์ œ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์„œ ๋ฌธ์ œ๋กœ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ, ์šฐ๋ฆฌ๋Š” ๊ฐ€๋Šฅํ•œ ๋ฒ„๊ทธ๋กœ ๋จผ์ € ๋…ผ์˜ํ•˜๋Š” ๋ฐ ์ •๋ง ์˜ค๋žœ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์— ๊ด€ํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์ œ ๋ฒ”์œ„ ๋ฐ–์ž…๋‹ˆ๋‹ค.

๋‚ด ๋ง์€ ๋…ผ๋ฆฌ์ ์ด๊ณ  ์ผ๊ด€์„ฑ ์žˆ๋Š” ์ผ์„ ํ•˜๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜„ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ซ๋Š” ๊ฒƒ์€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๋ถˆ๋งŒ ์‚ฌํ•ญ๊ณผ ์†”๋ฃจ์…˜์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ ๋ฒ„๊ทธ๋กœ ์žฌ๋ถ„๋ฅ˜ํ•˜๊ณ  ์ œ๋ชฉ์„ ํŽธ์ง‘ํ•  ๋•Œ ์„ค๋ช… ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๋ฉด ๋ถˆ๋งŒ ์‚ฌํ•ญ์ด ์žˆ๋Š” ์†”๋ฃจ์…˜์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ๋“  Done issues์˜ ์ด์Šˆ ์ œ๋ชฉ์€ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์—์„œ ๋๋‚˜๋ฏ€๋กœ ๋ฐœ์ƒํ•œ ์ผ์„ ํ‘œํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์™ธ๋ฅผ ์žก๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์ž‘์—…์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

3.10์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์—ฌ๊ธฐ ๋‚ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ์ •์˜ ํ…Œ์ŠคํŠธ ์–ด์„ค์…˜ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ NUnit.Assert๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์–ด์„ค์…˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์—ฌ ์‹คํŒจํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•  ๋•Œ ์‹ค์ œ๋กœ ์‹คํŒจํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋‚ด ํ…Œ์ŠคํŠธ๋Š” AssertionException ๋ฅผ ํฌ์ฐฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ์–ด์„ค์…˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํŒจํ•˜๊ฒŒ ํ•˜์ง€๋งŒ ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„์—๋Š” ์œ„์˜ ์ด์œ ๋กœ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

3.10์—์„œ ๊ถŒ์žฅ๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹  Assert.Throws๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์™ธ๋ฅผ catchํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Assert.Throws๋Š” NUnit ๋‚ด๋ถ€๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‹คํŒจ๊ฐ€ ๋ณด๊ณ ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์š”์ „๋‚  ์•Œ๋ฆผ์—์„œ ์ด๊ฒƒ์„ ๋ณด์•˜๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋…ผ๋ฆฌ ๋‚ด์—์„œ "Assert.That"์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ ์—…๋ฐ์ดํŠธ(ํ…Œ์ŠคํŠธ ๋„์šฐ๋ฏธ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ EF ์ปจํ…์ŠคํŠธ ๋ฐ ์—”ํ„ฐํ‹ฐ๋ฅผ ์ง์ ‘ ์ฝ”๋”ฉํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฝ”๋”ฉํ•  ๋•Œ EF ์ง€์†์„ฑ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(๋˜๋Š” FluentMigrator์™€ ๊ฐ™์€ ๋„๊ตฌ ์‚ฌ์šฉ) -- ์ฆ‰, ํ˜ธ์ถœ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์–ด์„ค์…˜์„ ์ˆ˜ํ–‰ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด์ œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ณณ์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด์„ค์…˜ํ•˜๋Š” ํŠน์ • ์กฐ๊ฑด์€ ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ "catch"๊ฐ€ ๋” ์ด์ƒ ํ•ญ์ƒ ๊ทธ๋žฌ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ๋Š” ์‹ค์ œ๋กœ ํ†ต๊ณผํ•˜๋Š” ๋™์•ˆ ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ NUnit ์–ด์„ค์…˜์„ ๋˜์งˆ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์ง€๋ฃจํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋” ๋น ๋ฅธ ํ…Œ์ŠคํŠธ ๊ฐœ๋ฐœ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์—์„œ Assert.That ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

์‚ฌ์šฉ์ž๊ฐ€ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ˆ์™ธ๋ฅผ throwํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค๋Š” ์ด์ „ ์ง„์ˆ ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์†Œ๋น„์ž์™€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด Assert.That ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ nunit ์–ด์„ค์…˜์œผ๋กœ ์‹คํŒจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจ๋ฅผ ๋˜์ง„๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ API ์ค‘ ์ผ๋ถ€๋ฅผ ์ œํ’ˆํ™”ํ•ด์•ผ ํ• ๊นŒ์š”?

@fluffynuts ๋‚ด๊ฐ€ ๋‹น์‹ ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด catch ์ ˆ์€ ์‚ฌ์šฉ์ž ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค. (์‚ฌ์šฉ์ž ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋„ ์žˆ๋‹ค๋ฉด ์ด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.)

๋ฌผ๋ก  NUnit์—๋Š” ์ž์ฒด ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋  ๋•Œ์™€ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ž ์žฌ์  ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ ํ…Œ์ŠคํŠธ๋ฅผ ๊ณ„์† ํ†ต๊ณผํ•˜๋„๋ก ์ž์ฒด ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ฐฉ์–ด์„ ์€ Assert.Throws ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์‹คํŒจ ๋™์ž‘์˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ try / catch(AssertionException) ๋ฅผ Assert.Throws<AssertionException> ์ง์ ‘ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ Assert.Throws ๋Š” TestExecutionContext ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹ค์ œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ํ…Œ์ŠคํŠธ ์ค‘์ธ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์˜ค์—ผ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๊ณ ์œ ํ•œ ๊ฒฉ๋ฆฌ ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Assert.Throws ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ NUnit์˜ ์ž์ฒด ์‹คํŒจ ํ…Œ์ŠคํŠธ์˜ ๋Œ€๋ถ€๋ถ„์€ ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์ฒด ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹คํ–‰๋˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ ๋ณ„๋„์˜ ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์บก์ฒ˜ํ•œ ๋‹ค์Œ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋” ๋งŽ์€ ์ž‘์—…์ด์ง€๋งŒ NUnit์— ๋Œ€ํ•œ ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ…Œ์ŠคํŠธ์— ๋„ˆ๋ฌด ๋งŽ์ด ๋„ฃ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฐฉ๋ฒ•์€ ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด @jnm2 ๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด ๊ฒŒ์‹œํ•˜๊ฑฐ๋‚˜ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์—ฐ๋ฝํ•˜์—ฌ ์ด์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋„์›€์„ ๋ฐ›์œผ์„ธ์š”.

์ •๋ณด์— ๋Œ€ํ•ด์„œ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์˜ˆ, ์–ด์„ค์…˜์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋‚ด์—์„œ ํฌ์ฐฉ๋ฉ๋‹ˆ๋‹ค. Assert.Throws๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ๋ฌธ์ œ์˜ ํŠน์ • ํ…Œ์ŠคํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๋‚ ์งœ/์‹œ๊ฐ„ ๊ฐ’์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ํ—ˆ์šฉ๋˜๋Š” ๋ธํƒ€๊ฐ€ "๋„ˆ๋ฌด ๋‚ฎ์Œ"์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ localdb๋กœ์˜ ๋“œ๋ฆฌํ”„ํŠธ๋Š” 1ms์ด์ง€๋งŒ ๋•Œ๋กœ๋Š” ๋” ๋†’๊ฒŒ ๋“œ๋ฆฌํ”„ํŠธ๋ฉ๋‹ˆ๋‹ค. ์ด ํ…Œ์ŠคํŠธ๋Š” "๊ฐ€๋”" ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๋‹จ์–ธํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ˜„์žฌ 4๊ฐœ์˜ ๋ณ‘๋ ฌ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ”๋“œ๋ฅผ 10๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ์ ์–ด๋„ ํ•œ ๋ฒˆ์€ ์‹คํŒจํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. Assert.Throws๋Š” ๋ถˆํ–‰ํžˆ๋„ ์ด ๊ฒฝ์šฐ์— ๋„ˆ๋ฌด ๊ฒฐ์ •์ ์ด๋ฏ€๋กœ nunit ์˜ˆ์™ธ(๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ ๋‚ด์—์„œ Assert) ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ฌ์šฉํ•˜๋Š” fu๋ฅผ ๋ฐฐ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์˜คํ”„๋ผ์ธ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ง€์นจ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํ—, ๋‚ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋˜ AsyncVoidVerificationScope์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€ ํŽŒํ”„ ํ…Œ์ŠคํŠธ ์‹คํŒจ๊ฐ€ @fluffynuts ๊ฐ€ ๊ฒช๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„

์–ด์จŒ๋“ , ๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ Assert.Throws ๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ using (new TestExecutionContext.IsolatedContext()) ์—์„œ ๋Œ€๋ฆฌ์ž ํ˜ธ์ถœ์„ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Assert.Throws ๋ฐ Assert.ThrowsAsync ๋Š” ๋น„๋™๊ธฐ ๋Œ€๋ฆฌ์ž๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๊ฒฉ๋ฆฌ๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ ์ด๋Ÿฐ๊ฑฐ์•ผ?

@fluffynuts ์˜ค๋ž˜์ „์— ๋‚ด๊ฐ€ Assert.Catch ์ฒ˜์Œ ์ผ์„ ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋ฟ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋ณ€๊ฒฝ๋˜์–ด ๋” ์ด์ƒ Assert.Throws ํ•ด๋‹นํ•˜๋Š” "์ค‘๋ฆฝ"์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ํ•˜๋‚˜๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Assert.Throws ์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์€ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ๋™๊ธฐ ์ฝ”๋“œ๋งŒ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ Assert.Throws ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ๋กœ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```C#
๊ณต๊ฐœ ์ •์  ๋ฌดํšจ ์˜ˆ์™ธ SafelyCatchAnNUnitException(TestDelegate ์ฝ”๋“œ)
{
์˜ˆ์™ธ catchException = null;

using (new TestExecutionContext.IsolatedContext())
{
    try
    {
        code();
    }
    catch (Exception ex)
    {
        caughtException = ex;
    }

    return caughtException;
}

}
```

์ด ๋ฉ”์„œ๋“œ๋Š” NUnit์˜ assert ๋ฉ”์„œ๋“œ๊ฐ€ ๋‚จ๊ธด ์˜ค๋ฅ˜์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•˜์—ฌ throw๋œ ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ์—์„œ ๋” ๋†’์€ ์ˆ˜์ค€์—์„œ IsolatedContext() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ฐธ์กฐ ์—†์ด ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์ˆ˜์ค€์—์„œ ์™„์ „ํžˆ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” NUnit์ด ํ˜„์žฌ ์ž์ฒด ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹๋ณด๋‹ค ์šฐ์ˆ˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰