๋ชจ๋์ ๋ฉํ ๋ชจ๋ธ์ Fixture ๋ด์์ ๋ณ๋ ฌํํ ๋ ํ ์คํธ ์ผ์ด์ค๋ณ๋ก ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ๊ฒ ๊ฐ์ต๋๋ค(https://github.com/nunit/nunit/issues/2105, https://github.com/nunit/nunit/issues). /2252, https://github.com/nunit/nunit/issues/2573) ์ด๋ฌํ ๊ฒฝ์ฐ๋ ์์์ง๋ง. ์ ๋ ํญ์ ์ ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ค ๋ฉด์์ ๋ ํ๋ถํ ๊ฒฝํ์ ์ ๊ณตํ๋ ์ผํ์ฉ ์ค์ฒฉ ์กฐ๋ช ๊ธฐ ํด๋์ค๋ฅผ ์ ์ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒฝํฅ์ด ์์ง๋ง( ์์ ), ๋ชจ๋ ์ฌ๋์ด ์ํ๋ ๊ฒ์ ์๋ ์๋ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฝ๊ฐ์ ๋จ์ ์ ์ฉ์ด์ ์ ์ ํด๋์ค๊ฐ NUnit์ด ๊ณ ์ ์ฅ์น๋ก ๊ฐ์ฃผํ๋ ๊ฒ์ด์ง๋ง ์ค์ ๊ณ ์ ์ฅ์น๋ ์ค์ฒฉ ํด๋์ค๋ผ๋ ๊ฒ์ ๋๋ค.
ํ๋์ ํ
์คํธ๊ฐ ๋ค๋ฅธ ํ
์คํธ์ ์ํ์ ์ก์ธ์คํ ์ ์์ด์ผ ํ๋ ๋น๋ณ๋ ฌ ๊ณ ์ ์ฅ์น๊ฐ ์ค๋จ๋๊ธฐ ๋๋ฌธ์ ํ
์คํธ ์ผ์ด์ค๋น ์ธ์คํด์ค๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ ์ต์
์ด ์๋๋๋ค. [Order]
์์ฑ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์๋ง๋ ์ด๊ฒ์ด ์ํฅ์ ๋ฏธ์น ์ ์๋ ์ ์ผํ ์ฌ๋๋ค์ผ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ์๊ฐํ ์ ์๋ ๋ชจ๋ ์์ ์ข
์ ํ
์คํธ๋ฅผ ์์ ํ ๊นจ๋จ๋ฆด ๊ฒ์
๋๋ค.
๋๋ Charlie์ ์ ์์ ์ข์ํฉ๋๋ค.
- ํ ์คํธ ํฝ์ค์ฒ๊ฐ ๋จ์ผ ์ธ์คํด์ค ๋๋ ํฝ์ค์ฒ๋น ์ธ์คํด์ค๋ก ์์ฑ๋๋ ๋ฐฉ์์ ์ค์ ํ ์ ์๋ ์ด์ ๋ธ๋ฆฌ ๋ ๋ฒจ ์์ฑ์ ๋๋ค.
- ๋จ์ผ ์ธ์คํด์ค๋ ์ง๊ธ์ฒ๋ผ ์๋ํฉ๋๋ค.
- ํฝ์ค์ฒ๋น ์ธ์คํด์ค๋ ๊ฐ ํ ์คํธ์ ๋ํด ์ ํฝ์ค์ฒ๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ฐ ํ ์คํธ์ ๋ํด ์ผํ์ฑ ์ค์ ๋ฐ ๋ถํด ํ๋์ ์ํํ๊ฑฐ๋(์ฆ, ๋ ์ด์ "์ผํ์ฑ"์ด ์๋) OneTimeSetUp ๋ฐ OneTimeTearDown์ ์ค๋ฅ ํ๋๊ทธ๊ฐ ์ง์ ๋๋๋ก ํฉ๋๋ค.
๊ฐ๋ฅํ ํ์ฅ:
- ์ด ํด๋์ค ๋ ๋ฒจ๋ ๋ง๋ค์ด ๊ฐ๋ณ ์ค๋น๊ฐ ์๋ก ๋ค๋ฅธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง ์ ์๋๋ก ํฉ๋๋ค.
- ๋ณ๋ ฌ๋ก ์คํ๋๋ ํ๋ ์ด์์ ํ ์คํธ๊ฐ ํฌํจ๋ ๊ณ ์ ์ฅ์น์ ๋ํด ๋ณ๋์ ์ธ์คํด์ค๋ฅผ ์๋์ผ๋ก ์คํํ๋ ์ธ ๋ฒ์งธ ์ด์ ๋ธ๋ฆฌ ์์ค ์ค์ ์ด ์์ต๋๋ค. (ํญ์ ๋ฏธ๋ฆฌ ์๊ธฐ๋ ๊น๋ค๋ก์)
๊ทธ๋ฌ๋ ๋จผ์ ๊ธฐ๋ณธ์ ์ํํ๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
์ง๊ธ ๋น์ฅ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ธ์คํด์ค ์ํ๊ฐ ์๊ณ ํฝ์ค์ฒ๊ฐ ์์ฒด์ ์ผ๋ก ๋ณ๋ ฌ๋ก ์คํ๋๋ ๊ฒฝ์ฐ ๋ฒ๊ทธ๊ฐ ๋ณด์ฅ๋๋ฏ๋ก, ํฝ์ค์ฒ์ ํ
์คํธ ์ผ์ด์ค๊ฐ ์คํ๋๋๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ ํ
์คํธ ์ผ์ด์ค๋น ์ธ์คํด์ค๋ก ์ ํํ๋ Auto ์ต์
์ ๊ฐ์ง ์ ์์ต๋๋ค. ๋ณ๋ ฌ๋ก ์ฐ๊ฒฐํ๊ณ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ํผํ์ญ์์ค . Auto๊ฐ ํผ๋์ค๋ฌ์ธ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ๋ชจ๋ ์ฌ๋์ด ์ผ์์ ์ธ ๋ฌธ์ ๋ก [assembly: InstancePerTestCase]
๋ฅผ ์ถ๊ฐํ์ง ์๋๋ก ํ๋ ๊ฐ์ฅ ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ์ผ ์๋ ์์ต๋๋ค.
๋๋ ๊ฐ๋๋ ์ผ์ ์ฐฌ์ฑํฉ๋๋ค. ํฝ์ค์ฒ๊ฐ ํ ์คํธ ์ผ์ด์ค๋น ์ธ์คํด์ค๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ OneTimeSetUp ๋ฐ OneTimeTearDown์ ์ค๋ฅ ํ๋๊ทธ๊ฐ ์ง์ ๋์ด์ผ ํฉ๋๋ค. ์๋ง๋ ์ ์ ์ด ์๋ ํ?
ํ์ฌ, (1) ์์ฑ์ ๋๋ ์ผํ์ฑ ์ค์ ์์ ์ํ๋ฅผ ์ค์ ํ๊ณ (2) ์ด๋ค ํ ์คํธ์์๋ ๋ณ๊ฒฝํ์ง ์๋ ๋ณ๋ ฌ ํ ์คํธ ๊ฐ์ ์ํ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ์ํ๊ฐ ํ ์คํธ ๋๋ ์ค์ ์์ ์์๋ก ์ค์ ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ค์ ํ์ง ์๋ ํ ์ด๋ค ๊ฒฝ์ฐ์๋ ํต๊ณผํ ์๋ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ํํ๋ ์ผ๋ถ NUnit ํ ์คํธ๊ฐ ์๋ค๊ณ ์๊ฐํ์ง๋ง ํ์๋ icky์ ๋๋ค.
์ ์๊ฐ์๋ ๊ธฐ๋ณธ๊ฐ์ ์กฐ๋ง๊ฐ ๋ณ๊ฒฝํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํ๊ฐ ์๋ค๊ณ ํด์ ํ์ฌ ๋ฒ๊ทธ๊ฐ ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. ์ค์ ๋ก ๋ณ๊ฒฝํ๋ฉด ๋ฒ๊ทธ์ผ ๋ฟ์ด๋ฉฐ ์ฝ๋ ๋ถ์์ ํ์ง ์๋ ํ ์ ์ ์์ต๋๋ค.
ํ ์คํธ ๋๋ ์ค์ ๋๋ ๋ถํด ๋ด์์ ์ธ์คํด์ค ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด ์์๋์ง ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ํ ์คํธ๊ฐ ์์ฒด์ ์ผ๋ก ๋ณ๋ ฌ๋ก ์คํ๋ ์ ์๋ ํ ์ด๋ฏธ ๊ณ ์ฅ๋ ๊ฒ์ ๋๋ค. ๋ด๊ฐ ์๊ฐํ ์ ์๋ ๋น์ ์ด ๋ถ์์ง์ง ์์ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ์ฌ์ฉ์์ ๋ณต์ก์ฑ์ด "ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ" ๊ฒฐ๊ณผ์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ๋ ๊ฒฝ์ฐ ์๋ ์ต์ ์ ๋ํ ์ ๋นํ์ ๋๋ค.
๋น์ ์ ์์ ์ด ์์ง๋ง ๋๋ ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ๊ฒฐ์ ํ ํ์๊ฐ ์๋ ์ ์ฌ์ ์ธ ์ฐ์ฅ์ด๋ผ๊ณ ๊ณ์ ์นํธํ ๊ฒ์ ๋๋ค. ์ง๊ธ ๋ชจ๋ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ค๊ณ ํ์ง ๋ง๊ณ ์ด ์์ ์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํด ๋ณด๊ฒ ์ต๋๋ค.
์ ๋ @CharliePoole ๊ณผ ํจ๊ป
๋ชจ๋ ์ค๋ ๋์ ๋ํด ๊ณต์ ๋๋ ์ธ์คํด์ค๊ฐ ์๋๋ผ ์ค๋ ๋๋น ์ธ์คํด์ค๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๊ณ ์ ์์ค ์์ฑ์ผ ์ ์์ต๋๋ค.
@BlythMeister ๊ฑฑ์ ํ์ง ๋ง์ธ์! ๊ธฐ์กด ์ฝ๋๊ฐ ์์๋๊ธฐ ์์ํ ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ณ ๋ คํ์ง ์์ต๋๋ค.
์ด๊ฑด ์ฌ๋ฏธ ์๋ค. ๋๋ instance-per-test-case๊ฐ instance-per-thread๋ณด๋ค ๋ง์์ ๊ฐ์ธ๋ ๊ฒ์ด ๋ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ ์คํธ๊ฐ ์ค๋ ๋์ ํ ๋น๋๋ ๋ฐฉ์์ ์ ๋ขฐํ ์ ์์ผ๋ฏ๋ก ์ธ์คํด์ค๋น ํ ์คํธ ์ผ์ด์ค์ ๋นํด ์ด๋ค ์ด์ ์ด ์๋์ง ์๊ฐํ ์ ์์ต๋๋ค.
๋ค, ๋ณ๋ ฌ ์คํ์ ์๋ฏธํ๊ธฐ ์ํด ์ค๋ ๋๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ค ์ ํํ์ง ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค.
XP์ ๊ด์ ์์(๊ทธ๋ฆฌ๊ณ ๋ชจ๋๊ฐ ๊ทธ๊ฒ์ด ํญ์ ๋ด ๊ด์ ์ด๋ผ๋ ๊ฒ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค) ์๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ธ ๊ฐ์ง ์ด์ผ๊ธฐ๊ฐ ์์ต๋๋ค...
์ฌ์ฉ์๋ ์ด์ ๋ธ๋ฆฌ์ ๋ชจ๋ ๊ณ ์ ์ฅ์น์ ๋ํด ์ ์ญ์ ์ผ๋ก ํ ์คํธ ์ผ์ด์ค๋น ์ธ์คํด์ค ๋์์ ์ง์ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ์๋ ํฝ์ค์ฒ์์ ํ ์คํธ ์ผ์ด์ค๋น ์ธ์คํด์ค ๋์์ ์ง์ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ์๋ ๋ณ๋ ฌ๋ก ์คํ๋ ์ ์๋ ํ ์คํธ๋ฅผ ํฌํจํ๋ ๊ณ ์ ์ฅ์น์ ๋ํด ํ ์คํธ ์ผ์ด์ค๋น ์ธ์คํด์ค ๋์์ ์ง์ ํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ์์ (1)์ด ์์ ํ ๊ตฌํ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ๋น๋ถ๊ฐ์ (2)๋ฅผ ๋จธ๋ฆฌ์์ ๋นผ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ ์ด๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ถ๋ถ์์๋ ์ ์ธํด์ผ ํฉ๋๋ค. (3)์ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ๋ค๋ฅธ ๋ฌธ์ ์์ ์ด๋ฏธ ์ ํ ๋ช ๊ฐ์ง ํจ์ ์ด ์์ต๋๋ค. (ํฝ์ค์ณ๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ๋ณ๋ ฌ๋ก ์คํ๋๋์ง ์ฌ๋ถ๋ฅผ ์์ง ๋ชปํฉ๋๋ค!) (1)๊ณผ (2)๊ฐ ์๋ฃ๋๊ณ ๋ณํฉ๋ ํ์ 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
+ }
}
์ด์ ๋ํ ๋ด ์๊ฐ์ ์ ์ด๋ ์๋ก์ด ํ๋ ์์ํฌ์ ๋งฅ๋ฝ์์ ์ฝ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค.
์ด์ ๊ฐ ๋์์ ๋ํด ํ๋์ฉ ๋ ๊ฐ์ ํด๋์ค ์์ค ์์ฑ์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. TestFixture๊ฐ ํ ์คํธ๋น ์ธ์คํด์ค์ ์๋ํ๋๋ก ํ๊ณ Shared Fixture๊ฐ ํ์ฌ NUnit์ฒ๋ผ ์๋ํ๋๋ก ํฉ๋๋ค. ๋ถ๋ช ํ ์ด๊ฒ์ NUnit์ ๋งฅ๋ฝ์์ ํ๊ธฐ์ ์ธ ๋ณ๊ฒฝ์ด์ง๋ง ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
@CharliePoole [TestFixture(FixtureOptions.PerTestCase)]
์ข์ ๊ตฌ๋ฌธ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ด์
๋ธ๋ฆฌ ์์ค ์์ฑ๋ ๊ฐ๋ ฅํ๊ฒ ์ํ๋ฏ๋ก ๋ชจ๋ ํ
์คํธ ํ๋ก์ ํธ์ ์ตํธ์ธํ ์ ์์ต๋๋ค. ์ด์
๋ธ๋ฆฌ ์์ค ์์ฑ์ด ์ด๋ป๊ฒ ์๊ฒผ์ผ๋ฉด ํฉ๋๊น?
๋ง์ต๋๋ค. ๊ทธ๋์ ์ ๋ ์๋ก์ด ํ๋ ์์ํฌ์์ ๋ฌด์์ ํ ๊ฒ์ธ์ง์ ๋ํด ์์ฝ WRT๋ฅผ ํํํ์ต๋๋ค. ๊ทธ๋ฌ๋ NUnit์ ๊ฒฝ์ฐ TestFixture
์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ง ์์ ๊ฒ์ด๋ฉฐ ์ฌ๋ก๋ณ ๋์์ ๋ํด ์ ๋ง ์ข์ ์ด๋ฆ์ด ์๊ฐ๋์ง ์์ต๋๋ค. ๋ ๊ฐ์ ์ด๋ฆ์ด ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ์กฐ๋ช
๊ธฐ์์ ์ํ๋ ๋์์ ์ป๊ธฐ ์ํด ํด์ผ ํ ์ผ์ ์์ค ํ์ผ์ ์ ์ญ ํธ์ง์ ์ํํ๋ ๊ฒ์
๋๋ค.
์ด์ ๋ธ๋ฆฌ ์์ค์ ์ ์ญ ์ค์ ์ AssemblyInfo ํ์ผ์ ์ค์ ๋ ๋ด์ฉ์ ์์ง ๋ชปํ๋ ์ผ๋ถ ๊ฐ๋ฐ์๋ฅผ ํผ๋์ค๋ฝ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ซ์ดํฉ๋๋ค. ํ์ฌ๋ ๋ช ๊ฐ๋ง ํ์ฉํ๋ฏ๋ก ํ๋ ๋ ์ถ๊ฐํด๋ ํฐ ๋ฌธ์ ๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์ ๋ธ๋ฆฌ์ ๋ชจ๋ ๊ณ ์ ์ฅ์น์ ๋ํ ์ต์ (๊ธฐ๋ณธ๊ฐ?)์ ์ค์ ํ๊ณ ์์์ ์ ๋ฌํด์ผ ํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ์ด์ ๋ธ๋ฆฌ ์์ค ์์ฑ์ ์ด๋ฆ์ ๋ํด ์๋ฌด ์๊ฐ์ด ์์ต๋๋ค.
๋๋ ๋น์ ์ด ์ธ๊ธํ ๋ฐ๋ก ๊ทธ ์ด์ ๋ก ์ด์ ๋ธ๋ฆฌ ์์ค์ ๊ธฐ๋ณธ๊ฐ๋ ์ด๋ ์ ๋ ์ซ์ดํฉ๋๋ค. ํ์ฌ ์์ฑ์ด ์๋ ๊ฐ ๊ณ ์ ํด๋์ค์ ์ ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ์ด์ ๋ธ๋ฆฌ ์์ค ์์ฑ์ด ์ ํธํ๋ ๊ฒฝ๋ก์ ๋๋ค.
@nunit/framework-team ์ด๋ป๊ฒ ์๊ฐํ์ธ์? ๊ธฐ๋ฅ์ ์ด๊ธฐ ๋์ :
์์ฑ ์๋ ์กฐ๋ช ๊ธฐ ํด๋์ค์ ๋ํ ์ข์ ์ ์ ๋๋ค.
๋๋ ์, ์, ์๋์ค, ์๋์ค๋ผ๊ณ ๋งํ ๊ฒ์ ๋๋ค
๋๋ Charlie์ ๋ง์ ๋์ํฉ๋๋ค. 'fixture-level'์ด 'class-level'์ ์๋ฏธํ๋ค๋ ์ค๋ช ์ ๋์ํฉ๋๋ค. (์๋ฅผ ๋ค์ด ํ ์คํธ ์ผ์ด์ค ์์ค ๋ฐฉ๋ฒ๊ณผ ๋ฐ๋์ ๋๋ค. ๐)
๋์์ด ๋ฉ๋๋ค! ๋ฐ๋ผ์ [TestFixture(FixtureCreationOptions.PerTestCase)]
์ ๋ฌธ์ ๋ ๋์ผํ ํด๋์ค์์ ์ฌ๋ฌ TestFixture ์์ฑ์ด ํ์ฉ๋๊ณ ์๋ก ๋ชจ์๋ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด์
๋ธ๋ฆฌ์ ํด๋์ค์ ์ ์ฉํ ์ ์๋ ์๋ก์ด ๋ช
๋ช
๋ ํน์ฑ์ ๊ฐ๋ ๊ฒ์ด ๋ ์ข๊ณ ๊ฐ๋จํฉ๋๊น?
```c#
[์ด์
๋ธ๋ฆฌ: ShareFixtureInstances(๊ฑฐ์ง)]
[ShareFixtureInstances(๊ฑฐ์ง)]
๊ณต๊ฐ ํด๋์ค 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);
+ }
}
์ ๋ค๋ฆฐ๋ค. ์ด๊ฒ์ ์์ ๋์์ ๋ฌด์์ ๋๊น? ์์ฒด ํ ์คํธ์ ํจ๊ป ๊ธฐ๋ณธ ํด๋์ค์ ํน์ฑ์ด ์๊ณ ํด๋น ํด๋์ค์์ ์์ํ๋ ๊ฒฝ์ฐ? ๐
์๋ง๋ 'ํด๋์ค' ์์ฑ์ด๋ฏ๋ก ๋ฌธ์ ์ ํ ์คํธ๊ฐ ์คํ๋๋ ์ค์ ํด๋์ค์ ์์ด์ผ ํฉ๋๊น?
๋ํ, ๋๋ ๊ทธ ์ด๋ฆ์ ์์ ํ ๊ด์ฌ์ด ์์ต๋๋ค. ๊ณ ์ ์ฅ์น๊ฐ ํญ์ ๋จ์ ์ฉ์ด๋ก ํด๋์ค๊ฐ ์๋๊ธฐ ๋๋ฌธ์ (์: testcasesource์ ๋ชจ๋ ํ ์คํธ - 'suite'์ 'fixture'๊ฐ ๋ ๊ฐ๋ ฅํ ์๋ฏธ๋ฅผ ๊ฐ์ง ์๋ ํ) ์๊ฐํ์ง ์์ต๋๋ค. Nunit ์ฉ์ด๋ก ์๊ฐ๋ณด๋ค ์๋ฏธ!)
InstancePerTest์ ๋ผ์ธ์ ๋ฐ๋ผ ...ํ์ง๋ง ๋ ๋์ ์ด๋ฆ์ ๊ฐ์ง ๊ฒ์ ์ด๋ป์ต๋๊น?
์ด์
๋ธ๋ฆฌ ๋ฐ ํด๋์ค ์์ค์ ๋ํด ๋์ํ์ง๋ง ๋ ์ด์์ ์๋๋๋ค. ๋๋ ๋ํ @ChrisMaddock ์ ์ ์ ClassInstancePerTest(bool)
๋ผ์ธ์ ๋ฐ๋ผ ๋ฌด์ธ๊ฐ๋ฅผ ์ ํธํฉ๋๋ค. ๋ํ ํด๋์ค ์์ค์ ํน์ฑ์ด ์ด์
๋ธ๋ฆฌ ์์ค์ ์ฌ์ ์ํ๊ณ ์์๋ ๊ฒ์ผ๋ก ์์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์์์ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ๊ฒฐํฉ๋ ํด๋์ค์ ๊ตฌ์ฑ์์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ
์คํธ๋น ์ธ์คํด์ค๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ ํด๋์ค์ ์๋์ผ๋ก ์ ์ฉ๋๊ธฐ๋ฅผ ์ํ ๊ฒ์
๋๋ค.
ํ ์คํธ ํฝ์ค์ฒ ์ ํ์ด ๊ตฌ์ฑ ๊ฐ๋ฅํ ๊ฒฝ์ฐ NUnit์ด ํ ์คํธ๋น ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๋๋ค๋ ์ฌ์ค์ ์ ๋ง ๋๋์ต๋๋ค. ์ ๋ ํญ์ ๋จ์ ํ ์คํธ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋จ์ ํ ์คํธ๋ฅผ ์๊ฐํ์ต๋๋ค. ์ค์บํด๋ฉ์ ์ค์ ํ๊ณ ํ ์คํธ๋ฅผ ์คํํ๋ฉด ์ค์บํด๋ฉ์ด ์ฌ๋ผ์ง๋๋ค. ํ ์คํธ ๊ฐ์ ์๋ํ์ง ์์ ์ํ ์ ์ก์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค. @jnm2 ์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ
์คํธ๋ฅผ ์๋์ผ๋ก ์ธ์คํด์คํํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ
์คํธ๊ฐ ์๋ฅผ ๋ค์ด ํ์ผ์ ์์ฑํ๊ณ ์ญ์ ํ ๋ ์ผ์ด์ค ๋ฌ๋๋ ์ ๋ง ๋ณต์กํด์ง๋๋ค. IDisposable์ด์ด์ผ ํฉ๋๋ค. ๋ ์ด์ ๋ง๋ฒ ๊ฐ์ [TearDown]
๋ ์์ต๋๋ค. :( ์ค์บํด๋ฉ ์ค๋ฅ์์ ํ
์คํธ ์ค๋ฅ๋ฅผ โโ๊ตฌ๋ณํ๋ ์ผ๊ด๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ์ด๊ฒ์ ์ ๋ง ๊ณ ํต์ค๋ฌ์ด ์ฌ์ฉ ์ฌ๋ก์
๋๋ค.
๋์์ธ์ ๋ผ์ด๋ค ์ ์๋ค๋ฉด @CharliePoole ๊ณผ ํจ๊ป yes, yes, no, no์ ๋๋ค.
PerTestInstance
, InstancePerTest
๋๋ ์ด์ ์ ์ฌํ ์ด๋ฆ์ด ShareFixtureInstances
๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค. ๋๋ F# ์ฝ๋๋ฅผ ํ
์คํธํ ๋ ์ ํ ์ธ์คํด์ค๊ฐ ํด๋์ค ๋ผ๊ณ ์๊ฐํ์ง ์๊ธฐ ๋๋ฌธ์ ์์ฑ ์ด๋ฆ์ Class
๋ผ๋ ๋จ์ด๋ฅผ ์ฝ๊ฐ ์ซ์ดํฉ๋๋ค. ํ์ง๋ง ๋ด๊ฐ ๊ทธ๊ฑธ๋ก ์ด ์ ์๋ค๋ ๊ฒ์ ํ์คํฉ๋๋ค! :)
์ค, ์ด ๊ธฐ๋ฅ์ด ๊ธฐ๋๋ฉ๋๋ค!
@kkm000 "class" ์ฌ์ฉ์ ๋์ํฉ๋๋ค. NUnit์ ์ผ๋ฐ์ ์ผ๋ก ๊ตฌํ๊ณผ ๊ตฌ๋ณ๋๋ ์ด๋ฆ์ ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๋๋ ์ฌ๋๋ค์ ์ถ์ธก์ ํ์ง๋ง ๊ทธ๋ฐ ์ผ์ ํผํ๋ ๊ฒ์ด ์ผ๊ด์ฑ์ด ์๋ ๊ฒ์ด ์ข๋ค.
๋ด๊ฐ ๋งํ๋ ๊ฒ์ ์: Test, TestFixture, SetUpFixture, Worker(์ค๋ ๋ ์๋) ๋ฑ. ์์น์ ์ผ๋ก __could__ ํด๋์ค๋ ๊ณ ์ ์ฅ์น๊ฐ ์๋ ๋จ์ผ ํ ์คํธ๋ฅผ ๋ํ๋ ๋๋ค... ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒ ํ๊ฑฐ๋ ์ฌ์ง์ด๋ ํด์ผ ํ์ง๋ง __ํ ์ ์์ต๋๋ค__.
@kkm000
๋๊ธ ๊ฐ์ฌํฉ๋๋ค! ๋น์ ์ ์ ํ ๋ผ์ด๋ค์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๋ฅํ ํ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์๋ ๋์์ธ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
C#์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ ์ธ์ class
๋ผ๋ ๋จ์ด์ ๋ํ ๋ ๋ค๋ฅธ ์ ์: ์ธ์ ๊ฐ ์ฐ๋ฆฌ๊ฐ ํด๋์ค๊ฐ ์๋ ์ค๋น๋ฅผ ์ง์ํ๋ค๋ฉด?
[InstancePerTestCase]
๋ ๋ฌธ์ ๋ฅผ ํํผํ์ง๋ง ์ง๊ด์ ์ธ ๋ช
ํ์ฑ์ ์์ ์ ์์ต๋๋ค.
์ค๋๋ ๋นํ๊ณผ ํด๋์ค๋ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ง๋ง ๋ง์ฝ ๊ทธ๋ค์ด ๊ฐ๋ผ์ง๋ค๋ฉด ์ด ์์ฑ์ ํด๋์ค๊ฐ ์๋ ๊ณ ์ ๋ฌผ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ํ์ ํฉ๋๋ค.
์ค์ํธ๋ ์ผ๋ฐ์ ์ธ ์กฐ์ง ๊ฐ๋
์ธ ๋ฐ๋ฉด ๊ณ ์ ์ฅ์น๋ ์ค์ /ํด์ ๋
ผ๋ฆฌ ๋ฐ ํ
์คํธ ์ํ๋ฅผ ๋ณด์ ํ๊ณ ํ
์คํธ ๋ฉ์๋์ ์ ๋ฌ๋๋ ๊ฒ์
๋๋ค(ํ์ฌ ์ธ์คํด์ค ๋ฉ์๋์ this
์ธ์๋ก). ์ค๋น๊ฐ ์กฐ์ง ๊ณ์ธต์ ์ผ๋ถ์ผ ํ์๋ ์์ต๋๋ค. ํด๋์ค์ ๊ฐ๋
์์ ๋ฒ์ด๋๊ณ ํ
์คํธ ์ค์ํธ์ ๊ฐ๋
์์ ๋ฒ์ด๋๋ ํฝ์ค์ฒ๋ฅผ ์์ํด ๋ด
์๋ค.
```c#
public static class SomeTestSuite // ๊ณ ์ ์ฅ์น๊ฐ ์๋: ์ค์ /ํด์ ๋
ผ๋ฆฌ ๋ฐ ํ
์คํธ ์ํ ์์
{
[Test] // ๋งค๊ฐ๋ณ์ํ๋ ์ค์ํธ๊ฐ ์๋ ๋จ์ผ ํ
์คํธ;
// ๊ณ ์ ๋ฌผ์ ์์์ this ๋งค๊ฐ๋ณ์ ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ฃผ์
๋ฉ๋๋ค.
๊ณต๊ฐ ์ ์ ๋ฌดํจ SomeTest(SomeFixture ๊ณ ์ ์ฅ์น)
{
๊ณ ์ .SomeService.SomeProperty = true;
๊ณ ์ .SomeAction();
๊ณ ์ .AssertSomething();
}
}
[ํ
์คํธํฝ์ค์ฒ]
๊ณต๊ฐ ๊ตฌ์กฐ์ฒด SomeFixture : IDisposable
{
๊ณต๊ฐ SomeService SomeService { ๊ฐ์ ธ์ค๊ธฐ; } // ์ํ
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
๊ฐ ์๋ ๋ ๋ค๋ฅธ ์์ฑ)๋ก ์ฅ์ํ๋ ๊ฒ์ด๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ณด์
๋๋ค. Fixture๋ผ๋ ๋จ์ด๋ฅผ ์ฌ์ฉํ๋ _consistent_ ์ต์
.
(ํ ๋ก ํด์ผ ํ ์ค์ํด ๋ณด์ด๋ ์์ ์ ๊ฐ์ ธ์ค๊ณ ์์ง๋ง ์ด๋ฆ์ด ๋ฌด์์ธ์ง์ ๋ํด์๋ ๋ณ๋ก ๊ด์ฌ์ด ์์ต๋๋ค.)
@jnm2 Suite์ Fixture์ ๊ฐ๋ ์ ๋ถ๋ฆฌํ ์ ์๋ค๋
๋ด๊ฐ ์๋ ํ xunit.net์ ํฝ์ค์ฒ๋ฅผ ํ ์คํธ ์์ ๊ณ์ธต ๊ตฌ์กฐ์์ ๋ถ๋ฆฌ๋ ์ํฐํฐ๋ก ๋ง๋ ์ต์ด์(์ ์ผํ?) ํ๋ ์์ํฌ์์ต๋๋ค.
๋งค๊ฐ๋ณ์ํ๋ ํ ์คํธ๋ฅผ ๋ง๋ค ๋ TestCaseSource๋ฅผ ๋ณ๋์ "ํฝ์ค์ฒ"๋ก ๋์ ํ ์ ์์์ต๋๋ค. ๋๋ ๊ทธ๋ ๊ฒ ํ์ง ์์๊ณ ๋ค์ ์คํํ๊ธฐ ์ํด ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ด ์ง๊ธ ๊นจ์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฌ๋๋ค์ด ๊ฐ๋(๋ณ๋ ฌํ ์ด์ ์) ์ฌ๋ก๋ณ ๋์์ ๋ํด ๋ฌป๋ ์ด์ ๋ ๋ค๋ฅธ ํ๋ ์์ํฌ๊ฐ ํ๋ ์ผ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋น์ทํ ์ด์ ๋ก ๊ทธ๋ค์ ๋ถ๋ฆฌ ๊ฐ๋ฅํ ๋นํ์ ์๊ตฌํ์ง __ํ์ง ์์์ต๋๋ค__.
๊ฒฐ๋ก ์ ์ผ๋ก ์ ์๊ฐ์ ์ด๋ ์ต๋๋ค...
ํ ์คํธ ์ผ์ด์ค ๋์๋ง๋ค ์ธ์คํด์ค๊ฐ ํ์ํฉ๋๋ค.
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ๋๋ฌธ์ ๊ธฐ๋ณธ๊ฐ์ด ๋ ์ ์์ต๋๋ค.
๋ถ๋ฆฌ ๊ฐ๋ฅํ ๊ณ ์ ์ฅ์น๋ ๋ฉ์ง ์์ด๋์ด์ด์ง๋ง ๋ณ๊ฐ์ ๋ฌธ์ ์ด๊ธฐ๋ ํฉ๋๋ค.
๋ถ๋ฆฌ ๊ฐ๋ฅํ ๊ณ ์ ์ฅ์น๋ ์ต์ํ ์ธ์คํด์ค ๊ณ ์ ์ฅ์น๋งํผ ๊ตฌํํ๊ธฐ๊ฐ ๋ณต์กํด ๋ณด์ ๋๋ค. ๋ฌผ๋ก ์ด ๊ฒฝ์ฐ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ ์ฝ์ต๋๋ค.
3๋ฒ๊ณผ 4๋ฒ ํญ๋ชฉ์ ๋ํด ํ์ธํ๊ธฐ ์ํด ์ฝ๋ ์ํ์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ์ ์์ด ์๋๋ผ ์ด ์์ฑ์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ด๋ฆ์ ์ฐพ๋ ๋ฐ ๋์์ด ๋๋ ์ฌ๊ณ ์คํ์ผ๋ก ์๋ํ์ต๋๋ค. ์ฌ๊ณ ์คํ์ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ์ฐ์ฐํ ์ผ์นํ๋๋ผ๋ ํด๋์ค๋ ์ค์ํธ๊ฐ ์๋๋ผ ๊ณ ์ ์ฅ์น์ ์์ด๋์ด์ ์ ๋ง๋ก ์ง์คํ๊ณ ์์์ ์๋ ค์ค๋๋ค.
์ด๋ค ํํ๋ฅผ ์ทจํ๋ ์กฐ๋ช
๊ธฐ๋ ์ค์ /ํด์ฒด/์ํ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ ์์
๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋จ์ด์ ์๋ฏธ๋ผ๊ณ ๋ฏฟ์ต๋๋ค. Fixture instance(setup/teardown/state์ ๋ฐ์)๋ ์ฐ๋ฆฌ์ ์๋ก์ด ์์ฑ์ด ํ
์คํธ ์ผ์ด์ค ๊ฐ์ ๊ณต์ ํ๊ฑฐ๋ ๊ณต์ ํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ๋ ๊ฒ์
๋๋ค. ์ด๋ฆ์ ์ด๋๊ฐ์ FixtureInstances
์์ผ๋ฉด ์ต๋์ ๋ช
๋ฃ์ฑ์ ์ป์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ด ๋ชจ๋ ์ฌ๋์๊ฒ ์ณ์ ๊ฒ ๊ฐ์ต๋๊น? ๊ทธ๋ ์ง ์๋ค๋ฉด ์ด๋ค ๋ค๋ฅธ ์ ์ ๊ณ ๋ คํ ์ ์์ต๋๊น?
์! ์ฃ์กํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๊ณผ๋๋ ๋งค์ฐ ์ข์ ์ ์ ์ง์ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ๋น๋๊ฐ ๊ฒ์ ์๋๊น ๊ฑฑ์ ๋ ๋ฉ๋๋ค. :์ฝ๊ฐ_์ฐก๊ทธ๋ฆฐ_์ผ๊ตด:
์ ์ฒด ์ด๋ฆ(๋ฌด์์ ์ ๋ ฅํ๋ ์ง)์๋ Fixture์ Instance๊ฐ ๋ชจ๋ ํฌํจ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ํ ๋ฐฉ๋ฒ์ ์์ฑ ์ด๋ฆ ๋๋ ๊ตฌ์ฑ์ ์ฌ์ฉ๋ ์ด๊ฑฐํ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ ์ค ํ๋์ ์ ์ฐฉํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
๋ค, ์ข์ ์ง์ ์ ๋๋ค.
์ด๊ฑฐํ์ ํ๋ฉด ์
๋ ฅํ๋ ์๊ฐ์ด ๊ธธ์ด์ง๋๋ค. ์ด๊ฒ์ ์ด์
๋ธ๋ฆฌ ๋์ ์์ฑ๋ณด๋ค ํด๋์ค ๋์ ์์ฑ์ ๋ ์ค์ํฉ๋๋ค. ๋์ผํ ํด๋์ค์์ ์ฌ๋ฌ TestFixtureAttributes๊ฐ ํ์ฉ๋๊ณ ํ๋์ ๋งค๊ฐ๋ณ์๊ฐ ๋ค๋ฅธ ํ๋์ ๋งค๊ฐ๋ณ์์ ๋ชจ์๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฑฐํ์ TestFixtureAttribute
๋งค๊ฐ๋ณ์๋ก ์ถ๊ฐํ์ง ์์์ผ ํฉ๋๋ค. ํ
์คํธ ์๊ฐ ์ค๋ฅ๋ฅผ ํตํด ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์๋ชป๋ ์ํ๋ฅผ ํํํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ช ๊ฐ์ง ์ต์
์ ์ค์ ํ๊ณ ๊ฑฐ๊ธฐ์์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ง๊ด์ฑ, NUnit์ ์คํ์ผ๊ณผ์ ์ผ๊ด์ฑ, ์ ์ ํ ์์ ์ ์ฐ์ฑ ์ฌ์ด์์ ๊ท ํ์ ์ด๋ฃจ๋ ๊ฒ์ ์ฐพ๊ณ ์์ต๋๋ค. (๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๋ฌํ ๋ด์ฉ์ ์ด๋ฏธ ์ค๋ณต๋์ด์ผ ํฉ๋๋ค. ๐)
```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#
[์ด์
๋ธ๋ฆฌ: FixtureInstancePerTestCase]
[FixtureInstancePerTestCase(๊ฑฐ์ง)]
ํด๋์ค SomeFixture
{
}
```
์ฅ์ : ์๋ชป๋ ์ํ๋ ํํํ ์ ์์ต๋๋ค.
์ฅ์ : ์คํดํ๊ธฐ ์ด๋ ต์ต๋๋ค(ํ์ง๋ง ์ ๋ ์ ๊ท ์ฌ์ฉ์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ๋งน์ ์ด ์์ต๋๋ค)
๋จ์ : ๊ธด ์ด๋ฆ
์๋ง๋ con: ์ต์
๊ณผ ๊ฐ์ ๋ชจ๋ ์ง์ ํ ์ ์๋ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ์ด๋ฆ์
๋๋ค. (ํ์ง๋ง ๋ด๊ฐ ์ข์ํ๋ [NonParallelizable]
๋ ์์ต๋๋ค.)
(๋์ฒด ์ ์ ํ์ํฉ๋๋ค!)
์ด์ ๋ธ๋ฆฌ์ ๋ํ ์์ฑ๊ณผ ํด๋์ค ์์ฒด์ ๋ํ ์์ฑ์ด๋ผ๋ ๋ ๊ฐ์ง ์์ฑ์ด ์์ด์ผ ํฉ๋๋ค.
์ฅ์ : ์ปจํ
์คํธ์์ ๋ค๋ฅธ ๋์์ ๊ฐ์ง ํ๋์ ์์ฑ๋ณด๋ค ๋ ๊ฐ์ ๊ฐ๋จํ ์์ฑ์ ๊ตฌํํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. (ParallelizableAttribute์์ ๋ฐฐ์ด ๊ตํ)
์ฅ์ : ๊ฐ๊ฐ์ ์ด๋ฆ์ ์ ์ ํ๊ฒ ์ง์ ํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด์
๋ธ๋ฆฌ ์์ค์๋ "๊ธฐ๋ณธ๊ฐ"์ด๋ผ๋ ๋จ์ด๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค.
๋จ์ : ๊ธฐ์ตํด์ผ ํ ๋ ๊ฐ์ง ์์ฑ.
๊ฐ๊ฐ์ ๋์์ ์ฌ์ฉํ์ฌ ์ ๊ทผ:
```C#
[์ด์
๋ธ๋ฆฌ: DefaultFixtureOptions(InstancePerTestCase = true)]
[FixtureOptions(InstancePerTestCase = false)]
ํด๋์ค SomeFixture
{
}
[์ด์ ๋ธ๋ฆฌ: DefaultFixtureOptions(FixtureCreationOptions.PerTestCase)]
[FixtureOptions(FixtureCreationOptions.Singleton)]
ํด๋์ค SomeFixture
{
}
[์ด์ ๋ธ๋ฆฌ: DefaultFixtureInstancePerTestCase]
[FixtureInstancePerTestCase(๊ฑฐ์ง)]
ํด๋์ค SomeFixture
{
}
```
๊ธฐํ ์๊ฒฌ:
BTW, ๋๋ ์ข ์ข ์ด์ ๋ธ๋ฆฌ ๋ฐ ๊ณ ์ ์ฅ์น ์์ค์ ๋ํด DefaultTestCaseTimeOut์ ์ฌ์ฉํ๊ณ Timeout์ ๋ฉ์๋๋ก๋ง ์ ์งํ์ผ๋ฉด ํ์ต๋๋ค.
์ข์ต๋๋ค. ์ด๋ฌํ ๊ฐ๋ฅ์ฑ์ ์ ์ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ง๊ธ ์ ๋ฅผ ๊ดด๋กญํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ด ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์์ง ์๋๋ผ๋ ์ด๊ฒ์ด ์ด๋ก ์ ์ผ๋ก ์๋ฏธ๊ฐ ์์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
c#
[DefaultFixtureOptions(InstancePerTestCase = true)]
class SomeFixture
{
[FixtureOptions(InstancePerTestCase = false)]
public void SomeTest()
{
}
}
์ด๊ฒ์ด ์ค์ ๋ก ์คํ๋๋ ๋ ๋ฒจ์ ์กฐ๋ช
๊ธฐ ๋ ๋ฒจ ์์ฒด๊ฐ ์๋๋ผ ํ
์คํธ ์ผ์ด์ค ๋ ๋ฒจ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
์๋ฅผ ๋ค์ด ํ์๋ ํฝ์ค์ฒ๋ ๊ธฐ๋ณธ ํฝ์ค์ฒ์ ์ค์ ์ ์ฌ์ ์ํ ์ ์์ง๋ง ์ค์ ๋ก ํ๋ ์ผ์ ํ์๋ ํด๋์ค์ ์ํด ์์ฑ๋ ๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ค์ ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์
๋๋ค.
๋๋:
```c#
[์ด์
๋ธ๋ฆฌ: DefaultFixtureOptions(InstancePerTestCase = true)]
// ์ด๊ฒ์ด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ์ฃผ๋์ด์๋ ์ ๋๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
[DefaultFixtureOptions(InstancePerTestCase = true)]
๊ณต๊ฐ ์ถ์ ํด๋์ค BaseFixture
{
}
๊ณต๊ฐ ๋ด์ธ ํด๋์ค SomeFixture : BaseFixture
{
}
```
Default
๋ฅผ ์ฌ์ฉํ์ง ๋ง์์ผ ํ ๋์ ์ฌ์ฉํ์ง ๋ง์์ผ ํ ๋์ ๋ํ ๊ทผ๊ฑฐ๋ ์ด๋ป๊ฒ ์ฐพ๋์?
๊ฐ ํ ์คํธ ์ผ์ด์ค์์ ์ด ์์ฑ์ ๊ตฌํํ๋ฉด ์์ ์ด์ ์ผ๋ก ๋ง์ ๋ณต์ก์ฑ์ด ๋์ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
"์ผ๋ฐ" ํ ์คํธ ํฝ์ค์ฒ์ ๊ฒฝ์ฐ ํ ์คํธ ํฝ์ค์ฒ์ ์ฐ๊ฒฐ๋ ๋ช ๋ น ์ฒด์ธ์ ์ผ๋ถ๋ก ์ธ์คํด์ค๋ฅผ ๊ณ์ ์ธ์คํด์คํํฉ๋๋ค. ํ ์คํธ๋ณ ํฝ์ค์ฒ์ ๊ฒฝ์ฐ ์ธ์คํด์คํํ์ง ์๊ณ ํ ์คํธ ์ฒด์ธ์ ์ผ๋ถ๋ก ์ ๋ช ๋ น์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ด ๋ช ๋ น์ ํ์ฌ ํฝ์ค์ฒ ์ฒด์ธ์์ ์ํ๋๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋์ผํ ์์ ์ ์ํํฉ๋๋ค.
๊ณ ์ ์ฅ์น์ ๋ ๊ฐ์ง ์ ํ์ ํ ์คํธ๊ฐ ๋ชจ๋ ํฌํจ๋ ์ ์๋ ๊ฒฝ์ฐ ๊ฐ ๋ชจ๋ธ์ ๋ํด ํ ๋ฒ์ฉ ๋ ๋ฒ ์คํํด์ผ ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ํ ์คํธ๋ฅผ ๋ณ๋์ ๊ณ ์ ์ฅ์น๋ก ๋ถํ ํ์ฌ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฒ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์์ ๋ณด์ ๋๋ค. ํฝ์ค์ฒ๋ ๊ฒฐ๊ตญ NUnit ์ํฐํฉํธ์ด๋ฉฐ ์ฌ์ฉ์์๊ฒ ๋์ผํ ํฝ์ค์ฒ ๋์์ด ํ์ํ ํ ์คํธ๋ฅผ ๋์ผํ ํฝ์ค์ฒ์ ๋ฃ๋๋ก ์๊ตฌํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
"๊ธฐ๋ณธ๊ฐ"์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๊ด๋ จํ์ฌ... ์ด๋ค TestFixxture์์๋ __not__ ์ฌ์ฉํ๊ณ ์ด์ ๋ธ๋ฆฌ ์์ค์์๋ง ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ฑ์ ์์ ๋๋ถ์ ํ์๋ ํด๋์ค์์ ์ค์ ๋ก ๋ฐ๊ฒฌ๋๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ํด๋์ค๋ ์์ธ๋ ์๋๋๋ค. ๋ฐ๋ผ์ ๋ฒ ์ด์ค์์ ํน์ ๋์์ ์ค์ ํ๋ ๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ด ์๋๋๋ค. ์คํ๋ ค ๊ทธ๊ฒ์ ๊ทธ ํด๋์ค์ ๊ทธ๊ฒ์์ ํ์๋ ๋ชจ๋ ๊ฒ์ ๋ํ ์ค์ ์ ๋๋ค. ํ์ฌ ์์๋ ์์ฑ์ ๋ชจ๋ ๊ฒฝ์ฐ์์์ ๊ฐ์ด ๋ชจ์๋๋ ์ฌ์์ ์ค๋ฅ๋ฅผ ์ผ์ผํค๊ฑฐ๋ ๋ฌด์ํด์ผ ํฉ๋๋ค. ์ฆ, ๊ธฐ๋ณธ ํด๋์ค์ ์์ฑ A๋ฅผ ๋ฐฐ์นํ๊ณ ํ์ ํด๋์ค์ B๋ฅผ ๋ฐฐ์นํ๋ ๊ฒ์ ๊ธฐ๋ณธ ํด๋์ค์ ์ง์ A ๋ฐ B๋ฅผ ๋ฐฐ์นํ๋ ๊ฒ๊ณผ ๊ตฌ๋ณ๋์ง ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์์ ์ ์ํํ๋ฉด ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ์ค๊ณํ์ต๋๋ค.
WRT ์ค์ ํฝ์ค์ฒ, btw, ๊ฑฐ๊ธฐ์์ ์ธ์คํด์คํ ์ต์ ์ ์ง์ ํ๋ ค๋ฉด ๋ฐํ์ ์ค๋ฅ๊ฐ ์์ฑ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. 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]
๋ ๋ ์์ฐ์ค๋ฌ์ ๋ณด์ธ๋ค(๊ทธ์ sesquipedalian ์ด๋ฆ์ ์ ์ธํ๊ณ ๋, ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋จ์ง ์๊ฒฌ์ผ ๋ฟ์ด๋ฉฐ ๋ฏธํ์ ์ผ๋ก ์ ๋นํ๋ ์ ์์). ํ๋์ ์์ฑ, ํ๋์ ํน์ฑ. ์๋ง๋ ์ด๊ฒ์ ๋งค๊ฐ๋ณ์๋ ์ ํ์ ์ผ๋ก ์ค์ ๊ฐ๋ฅํ ์์ฑ์ด ํ์ํ์ง ์์ ๊ฒ์
๋๋ค.
๋ํ ์ฌ์ฉ์๋ก์ ์ด๋ฆ์ด ๋ค๋ฅธ ๋ ๊ฐ์ ์์ฑ์ด ์๋ค๋ ์ฌ์ค์ด ๋๋์ต๋๋ค. ํ๋๋ ์ด์
๋ธ๋ฆฌ ์์ค์์๋ง ์ ์ฉํ ์ ์๊ณ ( DefaultSomething
) ๋ค๋ฅธ ํ๋๋ ์ ํ ์์ค์์๋ง ์ ์ฉํ ์ ์์ต๋๋ค(๋จ์ง Something
). . ๋น์ฐํ ๋๋ @CharliePoole ์ด Parallelizable ์์ฑ์ ๊ดํด ์ธ๊ธํ "ํ์ต๋ ๊ตํ"์ด ๋ฌด์์ธ์ง ์ดํดํ์ง ๋ชปํ์ง๋ง , ์ฌ์ ์ด์ชฝ์์ (์ด ์ฌ์ฉ์์ ํผ์์ ์ธ ์๊ฐ์์) ์ํํ ์์น๋ฅผ ๋ฐฐ์ฐ๋ ํ ์์ ์์ฑ์ ๋นํน์ค๋ฌ์ ๋ณด์
๋๋ค.
@kkm000 ๋จ์ผ ํน์ฑ์ ๋ํ๋ด๋ ์์ฑ์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ๋์ํฉ๋๋ค.
๋ค๋ฅธ ์์ค์์ "๋์ผํ" ํน์ฑ์ ๋ํด ๋ ๊ฐ์ง ๋ค๋ฅธ ์์ฑ์ WRTํฉ๋๋ค. ์ค์ ๋ก ๋์ผํ๋ค๊ณ ์๊ฐํ๋ค๋ฉด ๋์ํ ๊ฒ์ ๋๋ค. ํ์ง๋ง ๊ทธ๋ ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด Timeout์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
ํ ์คํธ ๋ฐฉ๋ฒ์ ์๊ฐ ์ด๊ณผ๊ฐ ์๋ ๊ฒฝ์ฐ "์ด ํ ์คํธ ๋ฐฉ๋ฒ์ ์คํํ๋ ๋ฐ ์ง์ ๋ ์๊ฐ(๋ฐ๋ฆฌ์ด)๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ์๊ฐ์ด ์ด๊ณผ๋ฉ๋๋ค."๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฌ๋ Timeout์ด ์ค๋น ๋๋ ์ด์ ๋ธ๋ฆฌ์ ๋ฐฐ์น๋๋ฉด "์ด ํญ๋ชฉ์ ํฌํจ๋ ๋ชจ๋ ํ ์คํธ ์ผ์ด์ค์ ๊ธฐ๋ณธ ์๊ฐ ์ด๊ณผ๋ ์ง์ ๋ ๋ฐ๋ฆฌ์ด ์์ ๋๋ค."๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค. ๋ฌผ๋ก ๊ทธ ๊ธฐ๋ณธ๊ฐ์ ๋ ๋ฎ์ ์์ค์์ ์ฌ์ ์๋ ์ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ ๊ฐ์ง ๋ณ๋์ ๊ตฌํ์ด ์๋ ๋ ๊ฐ์ง ๋ค์ ๋ค๋ฅธ ์๋ฏธ. ์ฒซ ๋ฒ์งธ๋ ํ์๋๋ ํ ์คํธ์ ์๊ฐ ์ด๊ณผ๋ฅผ ์ ์ฉํฉ๋๋ค. ๋ ๋ฒ์งธ๋ ํฌํจ๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ๋ฐ์ํ์ ๋ ๋ฐ๊ฒฌ๋๊ณ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ ํ ์คํธ ์ปจํ ์คํธ์ ๊ธฐ๋ณธ๊ฐ์ ์ ์ฅํฉ๋๋ค. ParallelizableAttribute๋ ์ ์ฌํ๊ฒ ์๋ํฉ๋๋ค.
์ด ํน์ ๊ฒฝ์ฐ์ ํฝ์ค์ฒ์ ๋ฐฐ์น๋ ์์ฑ์ "ํ ์คํธ ์ผ์ด์ค๋น ํ ๋ฒ ์ด ํฝ์ค์ฒ๋ฅผ ์ธ์คํด์คํํฉ๋๋ค."๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด์ ๋ธ๋ฆฌ ์์ค์์ "๋ฌ๋ฆฌ ์ง์ ํ์ง ์๋ ํ ์ด ์ด์ ๋ธ๋ฆฌ์์ ๊ณ ์ ์ฅ์น๋น ํ ๋ฒ ํ ์คํธ ๊ณ ์ ์ฅ์น๋ฅผ ์ธ์คํด์คํํฉ๋๋ค."๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด ํน์ ๊ฒฝ์ฐ์ ํฝ์ค์ฒ์ ๋ฐฐ์น๋ ์์ฑ์ "ํ ์คํธ ์ผ์ด์ค๋น ํ ๋ฒ ์ด ํฝ์ค์ฒ๋ฅผ ์ธ์คํด์คํํฉ๋๋ค."๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด์ ๋ธ๋ฆฌ ์์ค์์ "๋ฌ๋ฆฌ ์ง์ ํ์ง ์๋ ํ ์ด ์ด์ ๋ธ๋ฆฌ์์ ๊ณ ์ ์ฅ์น๋น ํ ๋ฒ ํ ์คํธ ๊ณ ์ ์ฅ์น๋ฅผ ์ธ์คํด์คํํฉ๋๋ค."๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ง์ง๋ง ๋ฌธ์ฅ์์ ๋ง์ ์๋ชปํ๋ค๊ณ ๊ฐ์ ํ๋ฉด -- "๋ฌ๋ฆฌ ์ง์ ํ์ง ์๋ ํ ~ํฝ์ค์ฒ~ ํ ์คํธ ์ผ์ด์ค ๋น ํ ๋ฒ ์ด ์ด์ ๋ธ๋ฆฌ์ ํ ์คํธ ํฝ์ค์ฒ๋ฅผ ์ธ์คํด์คํํฉ๋๋ค."_ ์๋ํ์ต๋๊น? ์๋๋ฉด ๋ฒ์์ ์๋๋ฅผ ์ฌ๊ฐํ๊ฒ ์คํดํ๊ณ ์์ต๋๊น?
๋ด๊ฐ ์ฌ์ฉ์๊ฐ ์๋๋ผ๊ณ ๊ฐ์ ํ๋ฉด ์๋ฏธ ์ฒด๊ณ๋ ์ ํ ๋ค๋ฅด๊ฒ ๋ณด์ด์ง ์์ต๋๋ค. " ์์ฑ์ผ๋ก ํ์๋ ๋ฒ์ ๋ด์์ ํ ์คํธ๋น ํด๋์ค๋ฅผ ์ธ์คํด์คํํฉ๋๋ค." ๊ทธ๊ฒ์ ์ค์ ๋ก ๊ทธ๋ฌํ ๋ด๋ถ ๋ฒ์์ ๋๋ค.โ ๊ณ ์ ๋ฌผ์ด๋ ์ด์ ๋ธ๋ฆฌ์ด๋ . ๋ด ์๊ฒฌ์ด์ง๋ง ๋ ๊ฐ์ง ์์ฑ์ด ์ฝ๊ฐ ํผ๋์ค๋ฌ์ ๋ณด์ ๋๋ค. ๊ทธ๋ฅ ์ ์๊ฐ์ผ์๋ ์๋๋ฐ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ ๊ฐ์ ๊ฐ๋ณ ๊ตฌํ
์ ๋์ฝ๊ณผ ๋ฌด์ง๊ฐ์ gedankenworld์์ ๊ตฌํ์ ์ฌ์ฉ์ ๋๋ฉด ์ธก๋ฉด์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ(๋น์ ๊ณผ NUnit์ ์ฌ์ฉ์ ์ค ํ ๋ช )๋ ๋ชจ๋ ์์ง๋์ด์ด๋ฉฐ ์์ง๋์ด๋ง์ ๋ชจ๋ ํํ์ ๊ดํ ๊ฒ์ ๋๋ค. ์๋ก ๋ค๋ฅธ ๋ฒ์์ ๋ํด ํ๋์ ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ ๋ก ๋ด๋ถ์ ์ธ ๋ฒ๊ฑฐ๋ก์๊ณผ ์ ์ง ๊ด๋ฆฌ ๋ถ๋ด์ผ๋ก ์ด์ด์ง๋ค๋ฉด ์ ํ ๋ฌธ์ ๊ฐ ๋์ง ์์ ๊ฒ์ ๋๋ค. :)
๊ฒฐ๊ตญ ๋์๊ฒ ์ด๊ฒ์ ์ฌ์ํ ๋ฌธ์ ์ด๊ณ ๋๋ ๊ฐ์ ์์ฑ์ ๋ํด ๊ฐํ๊ฒ ๋๋ผ์ง ์์ผ๋ฉฐ ์ด๋ ์ชฝ์ด๋ ์ ๋ ฌ๋ ์์ฑ์ผ๋ก ์ด ์ ์์ต๋๋ค.
@kkm000 ์, "ํ ์คํธ ์ผ์ด์ค๋น ํ ๋ฒ"์ ์๋ํ์ต๋๋ค.
์ผ๋ จ์ ์ค์ฒฉ ๋ฒ์๋ก ์๊ฐํ๋ฉด ์ด ๋ชจ๋ ๊ฒ์ด ์๋ฒฝํ๊ฒ ์ดํด๋๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ฌ์ฉ์๋ (a) ํญ์ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์๊ฑฐ๋ (b) ๋ฒ์ ์ ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ค์ฒฉ ํด๋์ค์ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ๋ ๋ค NUnit์์ ํ ์คํธ ๋ชฉ์ ์ผ๋ก ์ค์ฒฉ๋ "๋ฒ์"๋ก ์ฒ๋ฆฌ๋์ง ์์ง๋ง ์ฌ์ฉ์์๊ฒ๋ ๊ทธ๋ ๊ฒ ๋ณด์ผ ์ ์์ต๋๋ค.
Timeout / DefaultTimeout์ ๋ํด ์ธ๊ธํ ๋ฌธ์ ๊ฐ ์ข ๋ ์ฌ๊ฐํ๋ค๋ ์ ์ ์ธ์ ํ๊ฒ ์ต๋๋ค. ํฝ์ค์ฒ์ Timeout์ ์ ์ฒด ํฝ์ค์ฒ์ ํ์์์์ด ์ ์ฉ๋๋ค๋ ๊ฒ์ ์ฝ๊ฒ ์๋ฏธํ ์ ์์ง๋ง ๋ฌผ๋ก ๊ทธ๋ ์ง๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ ๋ฌธ์ ์ ๋ํด ์ด์ ๋ธ๋ฆฌ์ ์๊ฐ ์ด๊ณผ๋ ์ ์ฒด ์ด์ ๋ธ๋ฆฌ์ ์ ์ฉ๋ ์ ์์ง๋ง ์ ์ฉ๋์ง ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ ์ด๋ฆ์ "per test case"๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ ์ชฝ์ด๋ ์ฝ๊ฒ ๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ๋ชจํธ์ฑ์ด ๋ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ด์จ๋ ๊ทธ๊ฒ์ ๋ํด ์ผํ๊ณ ์์ง ์๋ค. :์๋ค:
์๊ฐํด ๋ณด์ธ์. Timeout์ด TestCaseTimeout์ด๋ผ๊ณ ํ๋ค๋ฉด ๋ ์ข์์ ๊ฒ์ ๋๋ค!
[FixtureInstancePerTestCase]
1๊ฐ๋ก ๋ง์กฑํฉ๋๋ค. ์ฌ์ฉ์์ ์ ์ ์ ๋ถ๋ด์ด ๊ฐ์ฅ ์ ์ ๊ฒ ๊ฐ์ต๋๋ค.
@nunit/framework-team https://github.com/nunit/nunit/issues/2574#issuecomment -426347735์์ ์๋๋ก ํ์ด๋ณด๊ณ ๋ฐฉํฅ์ ์ ํ๋๋ก ๋์์ฃผ์๊ฒ ์ต๋๊น?
[FixtureInstancePerTestCase]
๋ ๋ด๊ฐ ๊ฐ์ฅ ์ซ์ดํ๋ ์ต์
์
๋๋ค. ๐ ํ์ฅ์ฑ์ด ์๋ค๋ ๊ฒ์ด ์ ์ผํ ๋จ์ ์
๋๋ค.
[FixtureOptions]
๋ฌธ์ ๊ฐ ๋ง์์ ๋ค์ง ์์ต๋๋ค. ๋๋ฌด ํผ๋์ค๋ฌ์ด ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ด์
๋ธ๋ฆฌ์ ํด๋์ค ๋ชจ๋์ ๋ํด ๋จ์ผ ์์ฑ์ ์ ํธํฉ๋๋ค. ์ด์ ์ Timeout ๋ฐ Parallelizable์ ๋ํด ๋ฌธ์ ๋ฅผ ์ผ์ผํจ ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์์ฑ์ ์ด๋ฆ์ "Fixture"๊ฐ ์์ผ๋ฉด ๋ ๋ชจํธํด ๋ณด์
๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก enum ์ต์ ์ด ๋ง์์ ๋ ๋ค๊ณ ์ธ์ฉํ์ต๋๋ค. ๋ค๋ง ์ด๋ฆ์ ์ ์ ํ๊ฒ ์ง์ ํ์ฌ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๊ฐํ ์ ์๋ค๋ ์ ๋ง ๋นผ๋ฉด์!
์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
๋ชจ๋ ์ ๋ฐ์ดํธ๋ ์ด ๋ฌธ์ ์ ๊ฒ์๋ฉ๋๋ค.
๋๊ตฐ๊ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๊น??
ํ์ฌ ๋ชจ๋ ํ
์คํธ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ํํด์ผ ํฉ๋๋ค.
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 ์ ๋ ์ด ๋ฌธ์ ์ ์ง๋ฉด ํ์ง๋ง [ThreadStatic]
์์ ์ด๊ธฐํ๋๋ ํ
์คํธ ์ ์ฉ ํ๋๋ฅผ ๋ง๋ค์๊ณ ์ ๋๋ก ์๋ํฉ๋๋ค.
@dfal
์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ ๊ฐ์ฌํฉ๋๋ค!
๋๋ ์ด๊ฒ์ ์ข์ํ ๊ฒ์ด๋ค. ํ์ฌ ๊ณต์ ์ํ๋ก ์ธํด ์ฝ๊ฒ ๋ณ๋ ฌํํ ์ ์๋ nunit์์ ์คํ๋๋ ์์ฒ ๊ฐ์ ํ ์คํธ๊ฐ ์๋ ๊ธฐ์กด ํ ์คํธ ์ ํ๊ตฐ์ด ์์ต๋๋ค. ์ด ์ต์ ์ด ์ ๊ณต๋๋ฉด ํ ์คํธ ์ค์ํธ๋ฅผ ํจ์ฌ ๋ ์ฝ๊ฒ ๋ณ๋ ฌํํ ์ ์์ต๋๋ค.
์ฌ๊ณ ์คํ์ผ๋ก TestFixture๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋จ์ํ ๋ณ๊ฒฝํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ์ด๊ฒ์ ๋ฌด์์ ๊นจ๋จ๋ฆด๊น์?
์์๋ฅผ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ํ ์คํธ์ ์ํฅ์ ์ฃผ๊ธฐ ์ํด ํ ํ ์คํธ์์ ์ํํ ์ํ ๋ณ๊ฒฝ์ ์์กดํ๋ ๋ชจ๋ ํ ์คํธ์ ๋๋ค. ์ด๊ฒ์ (์๋ง๋) ๋ ๋ฆฝ์ ์ธ ๋จ์ ํ ์คํธ์ ๊ฒฝ์ฐ์ ๋งค์ฐ ๋์ ์ต๊ด์ ๋๋ค. ์ฐ๋ฆฌ๋ ํญ์ ์ฌ๋๋ค์๊ฒ ์ด๊ฒ์ ํ์ง ๋ง๋ผ๊ณ ๊ฒฝ๊ณ ํด์๊ณ ๋๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋จ์ผ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ ๊ฒ์ ์์กดํ๋ ํ ์คํธ(๋ฌผ๋ก ๋ฉ์์ง์ ํจ๊ป)๋ฅผ ๊นจ๋ ๊ฒ์ ์ ๊ฒฝ์ฐ์ง ์์ ๊ฒ์ ๋๋ค.
์ผํ์ฑ ์ค์ ๋ด์์ ์ํ๋๋ ์์ ์ ๋ฐ๋ผ ๊ฐ๋ณ ์กฐ๋ช ๊ธฐ ์ธ์คํด์ค๊ฐ ๋ณ๋ ฌ๋ก ์คํ๋์ง ์์ ์ ์์ต๋๋ค. ๋ณ๊ฒฝ์ ๋๊ธฐ๋ ๊ณ ์ ์ฅ์น๊ฐ ๋ณ๋ ฌ๋ก ์คํ๋๋๋ก ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์์ด๋ฌ๋ํฉ๋๋ค! ์ด๊ฒ์ ์ด๋ฏธ ๋ณ๋ ฌ๋ก ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ์ ํ์๋ก ํ๋ ์ฌ๋๋ค์ ์ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ง๋ง ๋ณ๋ ฌํ ๋ถ๊ฐ๋ฅํ 'OneTimeSetUp' ์ดํ์ ๋ณ๋ ฌ๋ก ํ ์คํธ๋ฅผ ์คํํ๋ ๊ฒ์ ์ด๋ฏธ ์์กดํ๊ณ ์๋ ์ฌ๋๋ค์๊ฒ๋ ์ค์ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค.
๋ชจ๋ ์กฐ๋ช
๊ธฐ ๋ ๋ฒจ OneTimeSetUp
๋ ์ด์ ์ฌ๋ฌ ๋ฒ ์คํ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ผํ์ฑ ์ค์ ์ผ๋ก ์ธํ ํจ์จ์ฑ ํฅ์์ด ์ ๊ฑฐ๋๊ณ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๋ฏธ ์ฒด๊ณ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ํนํ ์ด๊ธฐํ๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ) ์ ์ญ ์ํ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋์๊ฒ ์ฉ๋ฉํ ์ ์๋ ํ์์ฒ๋ผ ๋ณด์
๋๋ค.
๋๋ ์ด ์ฌ๊ณ ์คํ์ด ํฝ์ค์ณ์ ํ ์คํธ ์ผ์ด์ค๋น ์ธ์คํด์คํ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๋ ๋ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. NUnit 3์ ๋์ ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ด ์๋ ์๋ก์ด ๊ธฐ๋ฅ์ด์ด์ผ ํฉ๋๋ค. NUnit 4 ๋๋ ๋ค๋ฅธ ์ ํ๋ ์์ํฌ(์: TestCentric)์ ๊ฒฝ์ฐ ์ ๋์์ด ์ฝ๊ฒ ๊ธฐ๋ณธ์ด ๋ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก ์ ๋ MSTest์ TestClass
๋ฐ TestMethod
๋ฅผ ๊ฐ๊ฐ TestFixture
๋ฐ Test
๊ต์ฒดํ์ผ๋ฉฐ ์ฌ๊ธฐ์ NUnit๊ณผ MSTest๊ฐ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค. MSTest๋ ๊ฐ ํ
์คํธ์ ๋ํด ์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ฌ๊ธฐ์์ ์ด ๊ธ์ ์ฝ๋ ๋ชจ๋ ์ฌ๋๋ค์ ์๊ณ ์์ ๊ฒ์
๋๋ค. NUnit์ TestFixture ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
์ด ๋ง์ด๊ทธ๋ ์ด์
์ ์ฝ๊ฒ ํ๊ธฐ ์ํด TestFixture(lifeCycle = OneTestPerInstance)]
๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ธ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
_edit:_ ์ฌ์ค, Setup
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ
์คํธ๋ฅผ ํฌํ
ํ ํ ์ค์ ๋ก ๊ธฐ์กด ์ฝ๋ ์ด๊ธฐํ ํ๋ก๊ทธ๋จ/์ด์ /๋ถํด ์ฝ๋๊ฐ MSTest์์ ์๋นํ ๊ณ ์ด๋ฅผ ๊ฒช์๊ณ ์ด์ ๊ฐ๋จํ ์์ฑ ์ด๊ธฐํ ์์ฑ์์์ ์ ์ ์์ต๋๋ค. ํจ์ฌ ๋ฉ์ง๊ณ ์์ฑ๋๊ฐ ๋์์ ๋ฒ์ญ์ ํด์ ๊ธฐ์ฉ๋๋ค. ๊ทธ๋๋ ํธํ์ฑ์ ๋ฌธ์ ๋ก ์์ผ๋ฉด ์ข์ ๊ฒ์
๋๋ค.
@์ฐฐ๋ฆฌํ
์์๋ฅผ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ํ ์คํธ์ ์ํฅ์ ์ฃผ๊ธฐ ์ํด ํ ํ ์คํธ์์ ์ํํ ์ํ ๋ณ๊ฒฝ์ ์์กดํ๋ ๋ชจ๋ ํ ์คํธ์ ๋๋ค.
์, ๋ค, ์ด ํ ์คํธ๋ฅผ ๊นจ๊ณ , ๊นจ์ฃผ์ธ์, ์ ๋ฐ!!! ๐คฃ ๊ทธ๊ฒ์ ๋ด๊ฐ ์๊ฐํ ์ ์๋ ๋จ์ ํ ์คํธ ํ๋ ์์ํฌ์ ์ต์ ์ ๋จ์ฉ์ ๋๋ค.
๋ชจ๋ ์กฐ๋ช ๊ธฐ ๋ ๋ฒจ
OneTimeSetUp
์ด, ๋๋ ์ด๊ฒ์ด ํ๋ก์ธ์ค ๋น ํ ๋ฒ ์คํ๋๋ค๊ณ ํญ์ ์๊ฐํ์ต๋๋ค. ๋๋ ํญ์ ์ ์ ์ ์ด์ง ์์์ง ๊ถ๊ธํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์, ์ฑ๋ฅ๋ ๋งค์ฐ ์ ํจํ ํฌ์ธํธ์ ๋๋ค.
์ด ๊ธฐ๋ฅ์ด ๋ ผ์๋ ์ง 2๋ ์ด ๋์์ต๋๋ค. ๋ถ์พํ๊ฒ ๋ค๋ฆด ์๊ฐ์ ์์ง๋ง ๊ฐ๊น์ด ์ฅ๋์ ์ค์ ๋ก ๊ตฌํํ ๊ตฌ์ฒด์ ์ด๊ณ ํ์ค์ ์ธ ๊ณํ์ด ์์ต๋๊น?
์ฐ๋ฆฌ ํ์ด ๋ค๋ฅธ ํ๋ ์์ํฌ๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ณํํด์ผ ํ๋์ง ์๋๋ฉด ์์ผ๋ก ๋ช ๋ฌ ์์ ํด๊ฒฐ๋ ๊ฒ์ธ์ง ์๊ณ ์ถ์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ฐ๋ฆฌ์๊ฒ ๊ฐ์ฅ ์ค์ํ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๊ฒ์ ํ ์คํธ ์คํ ๋ฐฉ๋ฒ์ ๋ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด๋ฉฐ ํ์ฌ ๊ธฐ๋ฅ์ ์์กดํ๋ ์ฌ๋๋ค์ ์์ ํ ์์์ํค์ง ์๋๋ก ์ ์ฒด ์ํฅ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ "ํด๊ฒฐ"ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ํ
์คํธ ํด๋์ค๋ฅผ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ๊ฒ ๋ง๋๋ ๊ฒ์
๋๋ค. ์ข์ ๋ค์ค ์ค๋ ๋ ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค๋ ๋ ์์ ์ฑ์ด ๊ฐ์ฅ ์ค์ํด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ค์ ๋ฉ์๋์์ ์ค์ ํ ๋ค์ ๋ง์ ํ
์คํธ ๋ฉ์๋์์ ์ฌ์ฉํ๋ ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋์ค๋ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ์ง ์์ต๋๋ค . ๊ทธ๊ฒ์ NUnit์ ๊ฒฐํจ์ด ์๋๋๋ค. ์ค๋ ๋๋ก๋ถํฐ ์์ ํ์ง ์์ ์ฑ๊ธํค์ ์์ฑํ์ต๋๋ค.
๊ฐ ํ
์คํธ์ ์ผ๋ถ๋ก ์์ฑํ ์ปจํ
์คํธ ์ ๋ณด๋ฅผ ๋ณด์ ํ๋ TestFixture ๋ด๋ถ์ ํ์ ํด๋์ค๋ฅผ ์์ฑํ๋ฉด ์ฑ๊ธํค TestFixture๊ฐ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ์ง ํ์ธํ๊ณ ...๋ฐ๋ผ์...๋ฌธ์ ๋ฅผ "ํด๊ฒฐ"ํฉ๋๋ค.
๋ฐ๋ผ์ "๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ๋ง์ด๊ทธ๋ ์ด์
"ํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋ด๋ ๊ฒ๋ณด๋ค ์ฑ๊ธํค TestFixtures๋ฅผ ์ค๋ ๋์ธ์ดํํ๊ฒ ๋ง๋๋ ๋ฐ ๊ทธ ์๊ฐ์ ํ ์ ํ๋ค๊ณ ์ ์ํ ์ ์์ต๋๋ค.... ํจ์ฌ ๋ ๋น ๋ฅธ ์ฐ์ต์์ ์๊ฒ ๋ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด, NUnit TestFixture๊ฐ ์ฑ๊ธํค์ด๋ผ๋ ์ฌ์ค์ ์ฒ์ ์๊ฒ ๋์์ ๋ 500๊ฐ ์ด์์ ํ ์คํธ๊ฐ ํฌํจ๋ 100๊ฐ ์ด์์ ํ ์คํธ ํฝ์ค์ฒ๋ฅผ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ๊ฒ ๋ณํํ์ต๋๋ค. ์ ๋ ์ฝ 4์ฃผ(์์งํ Rhino -> Moq๊ฐ ๋๋ถ๋ถ์ ์๊ฐ์ ์์ํ์ต๋๋ค!)
์์น์ ์ผ๋ก๋ 100% ์ณ์ต๋๋ค. ํ์ง๋ง ~7000๊ฐ ์ด์์ ๋จ์ ํ ์คํธ๋ก ๊ตฌ์ฑ๋ ๊ธฐ์กด ํ ์คํธ ์ ํ๊ตฐ์ด ์๋ ๊ฒฝ์ฐ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ๋๋ก ๋ค์ ์์ฑํ๋ ๊ฒ์ ์์ฒญ๋ ํฌ์์ ๋๋ค.
๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ์ด๋ํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ํฌ์์ธ์ง ํ์คํ์ง ์์ง๋ง(์๋ํํ๋ ๋๊ตฌ๊ฐ ์์ ์ ์์) ์ด ๊ธฐ๋ฅ ์์ฒญ์ ์์น์ ์ผ๋ก ํ๊ธฐํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. IMO
์ด ๊ธฐ๋ฅ์ ๋ณด์ง ๋ง์์ผ ํ๋ค๊ณ ์นํธํ๋ ๊ฒ์ ์๋๋๋ค.
๊ทธ๋ฌ๋ nunit์ด ์๋ํ๋ ๋ฐฉ์์ ๋ํ ์ด๋ฌํ ํฐ ๋ณํ๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ(๋งค์ฐ ์ด๋ ค์ธ ์ ์์) ๋๋ ์๋ก์ด ์ฃผ์ ๋ฒ์ (์์ ์์ ์ด ์๋)์ ๊ณ ๋ คํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ nunit์ ์ฌ์ฉ์๊ฐ ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ์คํ๋๋๋ก ์ค๋ ๋์ธ์ดํ๋ฅผ ์์ฑํ๋ ์ฝ๋๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋ ์ฌ์ด ํํ์ ์์ ์ด๋ผ๊ณ ์ ์ํฉ๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค.
์ ๋ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ์ ๊ธฐ์ฌํ ์ฌ๋์ด ์๋๋ฏ๋ก ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ํ ์ปจํ ์คํธ๊ฐ ์์ต๋๋ค. ๊ทธ ๋๋ฌธ์ ์ด๊ฒ์ ๋งค์ฐ ์์งํ ๊ฒ์ผ ์ ์์ง๋ง ์ด๊ฒ์ ์ ํ์ ์ค์์น๋ก ๊ตฌํํ๋ ๊ฒ์ ๊ฐ๋ฅํ์ง ์์๊น์? ์ด๊ฒ์ด ์๋ฌด๊ฒ๋ ๊นจ์ง์ง ์๋๋ก?
์ด ์ ์ฒด ๋ฌธ์ ๋ ์ ํ์ ์ค์์น๋ฅผ ๊ตฌํํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํ๊ณ ์์ต๋๋ค. ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ด๊ฒ์ ์ ์ ์ผ๋ก ์์ ๋ด์ฌ์๋ค๋ก ๊ตฌ์ฑ๋ ์คํ ์์ค ํ๋ก์ ํธ์ ๋๋ค. ๊ธฐ๋ฅ์ด ์๋ฝ๋๋ฉด ํ์ด๋ ์ธ๋ถ์ ๋๊ตฐ๊ฐ๊ฐ ๊ธฐ๋ฅ์ ์ ํํ์ฌ ์ํํ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. ๋๊ตฌ์๊ฒ๋ ์์ ์ ํ ๋นํ๋ "๋ณด์ค"๋ ์์ต๋๋ค. ์ค์ ๋ก ๊ทธ๊ฒ์ ์๋ฃํ๋ ๋ฐ ์ ๋ ํ ์๊ฐ์ด ์๋ค๋ฉด ์๋ฌด๋ ๊ทธ๋ ๊ฒ ํ์ง ์์ ๊ฒ์ ์ข์ ์ผ์ ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ฅ๋ ฅ๊ณผ ๊ด์ฌ์ด ์๋ ์ฌ๋์ด๋ผ๋ฉด ๋๊ตฌ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
PR์ ํญ์ ํ์ํ์ง๋ง NUnit์ ๋ค๋ฅธ ๋ง์ ๊ฒ๋ค์ ๊นจ๋จ๋ฆด ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋๊ตฐ๊ฐ์๊ฒ ์ด๊ฒ์ ์๋ง๋ ์ฒ์ ๊ธฐ์ฌ๊ฐ ์๋ ๊ฒ์ ๋๋ค. ์ด์จ๋ ๋ด ์๊ฒฌ.
๋๋ ๋ ์ด์ ๊ณผ๊ฑฐ์ฒ๋ผ ์ ๊ทน์ ์ผ๋ก ๊ธฐ์ฌํ์ง ์๊ณ ์์ต๋๋ค. ๊ทธ๋์ ๋ด๊ฐ ์ด๋ป๊ฒ ํด์ผ ํ๋์ง์ ๋ํ ๋ด ์๊ฒฌ์ ๊ทธ๊ฒ์ ์ ํํ๋ ์ฌ๋์ ์ํ ์กฐ์ธ์ผ๋ก ์ฃผ์ด์ก์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ ์ ๋์ ์ฃผ๋ณ์ ์์๋ค๋ ๋ฐ ๋์ํ๋ฉฐ ์ง์ ์ํํ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
@BlythMeister ์ ์๊ฐ์๋ ์ค์์น๊ฐ ๊ทธ๊ฒ์ ์กฐ๊ธ ์ง๋์น๊ฒ ๋จ์ํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์๋ค์ํผ ๋ค๋ฅธ ์ฌ๋๋ค์ ๊ทธ๋ ์ง ์์ ์๋ ์์ต๋๋ค.
๋ฌผ๋ก ์ค์์น์ง๋ง ์ ๊ตฌ๋ง ์ผ๋ ๊ฒ์ด ์๋๋๋ค. ๋ผ๋์ค๋ฅผ AM์์ FM์ผ๋ก ์ ํํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. ์์ ํ ์๋ก์ด ํ๋ก๊ฐ ์๋ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ๊ด๋ จ๋ ๊ฒ์ ํ ์คํธ ์คํ์์ ์์ ํ ์๋ก์ด ์๋ช ์ฃผ๊ธฐ์ด๋ฏ๋ก ์๋นํ ์์ ์ฝ๋๋ฅผ ๊ต์ฒดํด์ผ ํฉ๋๋ค. ์์ ์ผ์ด ์๋๋๋ค. ์ํ์ ์๋ก์ด "ํ๋ก"๊ฐ ์ด๋ค ์์ผ๋ก๋ ๊ธฐ์กด ํ๋ก์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํ๋ ๋ฐ ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. "์ค์์น"๊ฐ ๊ฐ๋จํ์ง ์์ ์ด์ ์ ๋ํ ์ค๋ช ์ด ๋ชจํธํ์ต๋๋ค!
@BlythMeister ์ ๋ ์ค์ ๋ก Selenium ํ ์คํธ ์ฅ์น๋ฅผ ๊ตฌ๋ํ๊ธฐ ์ํด ํ ์คํธ ์ค์ ์ํ๋ฅผ ์ถ์ ํ ๋ค์ ํ ์คํธ๊ฐ ์๋ฃ๋ ํ ํ๊ธฐํ๊ธฐ ์ํด ์ผํ์ฉ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ค๋ช ํ ๋๋ก ์ ํํ๊ฒ ์ํํ์ต๋๋ค. ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ํ ๊ฐ์ง ์ฃผ์ ๋ฌธ์ ๋ ๊ตญ๊ฐ๊ฐ ํด์ฒด๋ฅผ ์ง์ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ํ ์คํธ ์ํ๊ฐ ํ ์คํธ ๋ฉ์๋ ์์ฒด ๋ด์์ ํ์ธ๋์ง ์๊ณ ๋ถํด ์ค์๋ง ํ๊ฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์คํจํ ํ ์คํธ(์คํฌ๋ฆฐ์ท, ๋ก๊ทธ ๋๋ ๊ธฐํ ์ํ ์กฐ๊ฐ ์บก์ฒ)์ ๋ํด ์กฐ๊ฑด๋ถ๋ก ์์ ์ ์คํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ํ ๊ฐ์ฒด๋ ํ ์คํธ๋ฅผ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ๊ฒ ๋ง๋๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ด์ง๋ง ๋ถํดํ๋ ๋์ ํ ์คํธ ๊ฒฐ๊ณผ๋ก ์์ ์ ์ํํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์๋ํฉ๋๋ค.
ํ ์คํธ ๊ฒฐ๊ณผ๋ก ์์ ์ ์ํํ๋ ๊ฒ์ TearDown์ด ์ค๊ณํ ๊ฒ์ด ์๋๋ผ๋ ์ ์ ์ผ๋์ ๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฌผ๋ก ๋ง์ ์ฌ๋๋ค์ด ๊ทธ๋ฐ ์์ผ๋ก ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๊ณ ๋๊ธฐ๋ฅผ ์ดํดํ์ง๋ง ๋ณธ์ง์ ์ผ๋ก TearDown์ด ํ ์คํธ์ ์ผ๋ถ์ด๊ณ ๋๋ ๋๊น์ง ๋๋ ๊ฒ์ด ์๋๋ผ๋ ์ฌ์ค๋ก ๊ท๊ฒฐ๋๋ ๊น๋ค๋ก์ด ์ฝ๋ ์ผ์ด์ค๊ฐ ๋ง์ด ์์ต๋๋ค.
NUnit 3๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ์์ง ํ์ฅ์ ์ฌ์ฉํ์ฌ ํ๋ ์์ํฌ ์ธ๋ถ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฌํ๋ ๋ ๋ง์ ์ฌ์ฉ์๋ฅผ ๋ณด๊ธฐ๋ฅผ ํฌ๋งํ์ง๋ง ํ ์คํธ ์์ฒด ๋ด์์ ์์ ํ๋ ๊ฒ์ด ๋ ์น์ํ๊ณ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.
@์ฐฐ๋ฆฌํ
- ๋ชจ๋ ์กฐ๋ช ๊ธฐ ๋ ๋ฒจ
OneTimeSetUp
๋ ์ด์ ์ฌ๋ฌ ๋ฒ ์คํ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ผํ์ฑ ์ค์ ์ผ๋ก ์ธํ ํจ์จ์ฑ ํฅ์์ด ์ ๊ฑฐ๋๊ณ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๋ฏธ ์ฒด๊ณ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ํนํ ์ด๊ธฐํ๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ) ์ ์ญ ์ํ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋์๊ฒ ์ฉ๋ฉํ ์ ์๋ ํ์์ฒ๋ผ ๋ณด์ ๋๋ค.
ํ ์คํธ ์ฌ๋ก๋น ์ธ์คํด์ค ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๊ณ ์ฌ์ ํ OneTimeSetUp์ ํ ๋ฒ๋ง ์คํํ ์ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น(๋ฉ์ธ ์ค๋ ๋๊ฐ ํธ์ถํ๋ ๊ฒ์ ๊ธฐ์ตํ๋๋ก ์ ์ง)?
์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ ๊ธฐ์กด OneTimeSetUp์ด ์์๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค.
๋๋ ์ด๊ฒ์ ๋ชจ๋ ์ค์์น ๊ธฐ๋ฐ ์๋ฃจ์ ์ ๋ฌธ์ ๋ก ๋ด ๋๋ค. ํ ์คํธ ํฝ์ค์ฒ์ ๋ํ ์์ ํ ์๋ก์ด ๋์์ ์ ์ํ๋ฉด ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋นํ ๋งค๋ ฅ์ ์ ๋๋ค.
์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ ๊ธฐ์กด OneTimeSetUp์ด ์์๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค.
"ํ
์คํธ ์ฌ๋ก๋น ์ธ์คํด์ค" ๊ธฐ๋ฅ์ด ํ์ฑํ๋ ๊ฒฝ์ฐ ์ ์ OneTimeSetUp
๋ฐ OneTimeTearDown
๋ฉ์๋๋ง ํ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ๊ทธ๋ ๊ฒ ํ๋ฉด ํด๋น ๋ฉ์๋ ๋ด์์ ์ด๊ธฐํ๋ ๋ฉค๋ฒ๊ฐ ์ ์ ์ผ๋ก ๊ฐ์ ๋๋ฏ๋ก ์กฐ๋ช
๊ธฐ ์ธ์คํด์ค ๊ฐ์ ๋ถ๋ช
ํ ๊ณต์ ๋ฉ๋๋ค.
์ด Github ๋ฌธ์ ์ ์ฃผ์ ๋๊ธฐ๋ ๋ณ๋ ฌํ์ด์ง๋ง _์ต์ํ์ ๋๋ผ์์ ์์น_๊ณผ _์๋ก ์ํฅ์ ๋ฏธ์น๋ ํ ์คํธ๋ก ์ธํ ์ค๋ฅ ๋ฐฉ์ง_๋ ๋๊ธฐ๋ก ์ ์ํ๊ณ ์ถ์ต๋๋ค. (์ด๋ฏธ ๋ค๋ฅธ ๋ถ์ด ์ธ๊ธํ์ จ๋ค๋ฉด ์ฃ์กํฉ๋๋ค.)
์ด ๋ค์ ์ค๋๋ ์ค๋ ๋์์ ์ถฉ๋ถํ ๋ค์ ์ฝ์ง ์์ ๊ฒฝ์ฐ์ ๋๋นํ์ฌ ๋ด ์๊ฒฌ์ ๊ธฐ๋ฅ์ ๋ํด ์ฃผ์ฅํ๋ ๊ฒ์ด ์๋๋ผ ์ ์๋ ํน์ ๊ตฌํ์ ๋ํด ์ฃผ์ฅํ๋ ๊ฒ์ ๋๋ค. ๋๋ TestFixture๋ฅผ ๋ค๋ฅด๊ฒ ์๋ํ๋ ์์ ํ ์๋ก์ด ์ ํ์ ๊ณ ์ ์ฅ์น๋ก ๊ต์ฒดํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
๋๋ ์ฌ๊ธฐ์ ๋ด๊ฐ ์ต์์ ๋๋ผ์์ ๊ต์ฅ์ ์ ํ๋ค๊ณ ์๊ฐํ๋ค. ์ ๊ณ ์ ์ฅ์น๊ฐ ๋ค๋ฅด๊ฒ ์๋ํ๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ด ์๋๋๋ค.
๋ฐ๋ฉด์ ๊ธฐ์กด ์กฐ๋ช ๊ธฐ๋ฅผ ์ ์ดํ๋ โโํ๋๊ทธ๋ฅผ ์์ฑํ๋ฉด ํ์ฌ ๊ตฌํ์์ ํด๋น ํ๋๊ทธ์์ ๋ถ๊ธฐํด์ผ ํ๋ 5๊ฐ ๋๋ 6๊ฐ์ ๋ค๋ฅธ ์์น๋ฅผ ์๊ฐํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๊ณ ๋ ์กฐ๋ช ๊ธฐ ์ ํ์ด ํน์ ์ฝ๋๋ฅผ ๊ณต์ ํ์ง ์์ ์ ์๋ค๋ ๋ง์ ์๋๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ฌ์ฉ์์ ๊ด์ ๋ฐ์ผ ๊ฒ์ ๋๋ค.
@fschmied BTW, ์ฐ๋ฆฌ๊ฐ ์๋ก์ด ํ๋ ์์ํฌ(๋๋ NUnit 4)๋ฅผ ๋ง๋ค๊ณ ์๋ค๋ฉด ๋๋ ๋ค๋ฅด๊ฒ ์ฃผ์ฅํ ๊ฒ์ ๋๋ค... NUnit 2์ 3์์ ํ ์คํธ๊ฐ ์๋ก ๊ฐ์ญํ๋ ๊ฒ์ ํจ์ฌ ๋ ์ด๋ ต๊ฒ ๋ง๋ค์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ , NUnit 3์์ ๋ณ๊ฒฝํ๋ ํ ํธํ์ฑ ๊ท์น์ ์๊ฐํฉ๋๋ค.
๋๋ TestFixture๋ฅผ ๋ค๋ฅด๊ฒ ์๋ํ๋ ์์ ํ ์๋ก์ด ์ ํ์ ๊ณ ์ ์ฅ์น๋ก ๊ต์ฒดํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
[...]
๋๋ ์ฌ๊ธฐ์ ๋ด๊ฐ ์ต์์ ๋๋ผ์์ ๊ต์ฅ์ ์ ํ๋ค๊ณ ์๊ฐํ๋ค. ์ ๊ณ ์ ์ฅ์น๊ฐ ๋ค๋ฅด๊ฒ ์๋ํ๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ด ์๋๋๋ค.
๋น์ ๋ง์ด ๋ง์์. ๋ด๊ฐ ์๋ฏธํ๋ ๋ฐ๋ ์๋ ์ข ๋ฅ์ ํ ์คํธ ํฝ์ค์ฒ์ ๊ฒฝ์ฐ ๋์์ด ์ฌ์ ํ ๋๋ถ๋ถ์ ์ฌ๋๋ค์๊ฒ ๋๋ผ์ธ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค. (2์ฃผ ์ ์ ๋๋ฃ๊ฐ ๋ค๋ฅธ ํ ์คํธ์ ์ํฅ์ ์ฃผ๋ ํ ์คํธ ์ฌ๋ก๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋๋์ต๋๋ค. ๊ทธ๋ 2013๋ ๋ถํฐ NUnit์ ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ฅผ ์ฐพ์๋ดค์ต๋๋ค.)
๊ทธ๋ฌ๋ ๋ฌผ๋ก ํ์ ํธํ์ฑ, ๊ตฌํ ๋ณต์ก์ฑ ๋ฐ ์์ฃ๋ฅผ ์์ ํ๋ ค๋ ๋ฐ๋ ์ฌ์ด์ ์ ์ถฉ์ ์ ๋๋ค[1].
OneTimeSetUp
๋ฌธ์ ๋ก ๋์๊ฐ์ : ํ
์คํธ ํฝ์ค์ฒ ํด๋์ค๊ฐ ํ
์คํธ๋ณ๋ก ์ธ์คํด์คํ๋๋๋ผ๋ ํ
์คํธ ํฝ์ค์ฒ๋น OneTimeSetUp
๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ฌ์ ํ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. OneTimeSetUp
๊ฐ ์ธ์คํด์ค ์ํ๋ฅผ ์กฐ์ํ๋ ๊ฒฝ์ฐ ํผ๋์ ํผํ๊ธฐ ์ํด OneTimeSetUp
(๋ฐ OneTimeTearDown
)๋ฅผ ํ
์คํธ๋น ์ธ์คํด์ค ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์ ์ ์ผ๋ก ์ ์ฉํ ๊ฒ์ ์ ์ํฉ๋๋ค. (์ค์์น๋ก ๊ตฌํํ๋ ์๋ก์ด ์ข
๋ฅ์ ํ
์คํธ ํฝ์ค์ฒ๋ก ๊ตฌํํ๋ ์๊ด์์ต๋๋ค.)
[1] ์ ์์ค ๋ด์ปคํฌ ๋ ์ด๋ ๊ฒ ์ผ๋ค .
NUnit V2.0์ ์์ฑํ ๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ค ํ๋๋ ํฌํจ๋ ๊ฐ ํ ์คํธ ๋ฉ์๋์ ๋ํด ํ ์คํธ ํฝ์ค์ฒ ํด๋์ค์ ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ์์ ๊ฒ์ ๋๋ค. ๋๋ "์ฐ๋ฆฌ"๋ผ๊ณ ๋งํ์ง๋ง ์ด๊ฒ์ ๋ด ์๋ชป์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ ํ ์คํธ ๋ฐฉ๋ฒ์ ๋ํ ํ ์คํธ ํฝ์ค์ฒ์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ์ํ JUnit์ ์ถ๋ก ์ ์ ์ดํดํ์ง ๋ชปํ์ต๋๋ค.
๊ทธ๋ ๋ํ ๋ค์๊ณผ ๊ฐ์ด ์๋๋ค.
[...] ์ง๊ธ NUnit์ด ์๋ํ๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค. ๋๋ฌด ๋ง์ ์ฌ๋๋ค์ด ๋ถํํ ๊ฒ์ ๋๋ค [...]
:)
์, Jim๊ณผ ์ ๋ ์ด ๋ฌธ์ ์ ๋ํด ์๋ ๊ฐ ๋ ผ์์ ๋ฒ์์ต๋๋ค. :smile: ์ฐ๋ฆฌ๊ฐ ๋์ํ๋ ํ ๊ฐ์ง๋ ๋ง์ง๋ง ๋ฌธ์ฅ์ ๋๋ค. Jim์ ์ ํธํ๋ ์ ๊ทผ ๋ฐฉ์์ ๊ตฌํํ๊ธฐ ์ ์ ์๋ก์ด ํ๋ ์์ํฌ๋ฅผ ์ํํ์ต๋๋ค. ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ์ผ์ ํ๊ณ ์๊ณ SetUp/TearDown์ ๋ด๊ฐ ๋ค๋ฅด๊ฒ ํ ๊ฐ๋ฅ์ฑ์ด ๋์ ๊ฒ ์ค ํ๋์ ๋๋ค.
๊ฝค ๋ง์ ๊ฒฝํ์ ๊ฐ์ง 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 ๋น์ ์ ๋๋ฌด ๋ง์ต๋๋ค. ํผ๋๋ฐฑ๊ณผ ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋๋ ๋ฌผ๊ฑด์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๋์ง ์๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค / ๋ฌด์์ ํ๋์ง ๋ฑ๋ฑ ์ฒ์ฒํ ๊ทธ๋ฌ๋ ํ์คํ๊ฒ
์ฌ๊ธฐ LifeCycle ์ด๊ฑฐํ์ ๋ํ ์ ์ ์์ด ์์ต๋๋ค(๋ํ ๊ทํ์ ์ ์์ผ๋ก ์ ๋ธ๋์น๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค)
/// <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์ ํ์ฌ ๊ธฐ๋ณธ ๋ชจ๋ธ์ด ๋น์ ์ ๋ฌผ์ด๋ฏ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณ๋ ฌ ์๋๋ฆฌ์ค์์๋ง ์ฌ์ฉํ๋ ์ ์ค ์ผ์ด์ค๋ฅผ ์ดํดํฉ๋๋ค. ์ฒ์๋ถํฐ ์ด๋ฌ์ด
SingleInsance/InstancePerTestCase์ ๋จ๊ฒจ๋์ด์ผ ํ ์๋ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ์ง๋ฌธ์ ์ฌ๊ธฐ์์ IDisposable ํจํด์ ์ฒ๋ฆฌํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด SetUp/TearDown์ด ๊ฑฐ์ ์ค๋ณต๋์ง๋ง XUnit ์คํ์ผ๋ก ํจ์ฌ ๋ ์์ฐ์ค๋ฝ๊ฒ ๋๊ปด์ง ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ IDisposable์ ๊ตฌํํ๋ ๋ชจ๋ ํ ์คํธ ์ค๋น๋ฅผ ์ฒ๋ถํฉ๋๋ค. ๊ณ์ ์๋ํ๋์ง ํ์ธํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ข์, ํ ๊ฒ์ด๋ค.
์๋ง๋ ์ค๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์์ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ํต์ฌ ๋ฉ์ปค๋์ฆ ๋๋ฌธ์ InstancePerTestCase๊ฐ ์ผ์ ธ ์์ ๋ ๋์ผํ ์์ ์ด ์๋ํ๋์ง ํ์ธํ๋ ๊ฝค ๋ง์ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์๋ชป๋ ๊ฒฝ์ฐ ์์ ํด ์ฃผ์ธ์.
DisposeFixtureCommand๋ Dispose ํธ์ถ์ ์ฒ๋ฆฌํฉ๋๋ค.
IMO์ ์ฃผ์ ๋ฌธ์ ๋ ํ ์คํธ ํฝ์ค์ฒ์ ๋ํ ์ ์ฒด ๋ช ๋ น ์คํธ๋ฆผ์ด __๊ฐ ํ ์คํธ__์ ๋ํด ํธ์ถ๋๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ง๊ธ๊น์ง ๋ด๊ฐ ๋ณธ ๋ณ๊ฒฝ ์ฌํญ์ ์์ ์ ์ํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋ช ๋ น ์คํธ๋ฆผ์ ์ฌ๋ฐ๋ฅด๊ฒ ์์ฑํ์ง๋ง ํต์ฌ ์ง๋ฌธ์ ๊ฐ ํ ์คํธ ์ฌ๋ก์ ๋ํด ํธ์ถ๋๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. (ํฝ์ค์ฒ์ ๋ช ๋ น ๊ตฌ์กฐ๋ ํ ์คํธ ์ผ์ด์ค์ ๊ตฌ์กฐ์ ๋ค๋ฆ ๋๋ค.) ๋๋ ๋ณตํฉ ์์ ํญ๋ชฉ์ด ์ปจํ ์คํธ์ ๋ฏผ๊ฐํด์ผ ํ๊ณ ๋ช ๋ น์ ์ฌ๋ฐ๋ฅด๊ฒ ํธ์ถํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง(๋น์ ์ด ํ ๊ฒ์ฒ๋ผ) ๊ธฐํ๋ฅผ ์ป์ ์ ์์์ง ํ์ ํ ์ ์์ต๋๋ค. __every__ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด. (๋๋ ์ฝ๋๋ฅผ ์ฝ๋ ์ค์ด๋ฏ๋ก ํ๋ฆด ์ ์์ต๋๋ค.)
@CharliePoole ์ ๋น์ ์ด ๋ง๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ
์คํธ ๋ฐฉ๋ฒ์ ์ ํํ ์คํํ๋ ๊ฒ์ ๋ํด ์ฝ๊ฐ์ ๊ทธ๋ํ๋ฅผ ์์ฑํ์ต๋๋ค.
ํ์ฌ ๋๋ RunChildren ๋ฃจํ์์ ํ
์คํธ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง๋ง ๋ด๊ฐ ๋์น ๋ค๋ฅธ ๋ํผ๊ฐ ์๋์ง/๋๊ตฐ๊ฐ ์ ๋ํผ๊ฐ ํ์ํ์ง ์ฌ๋ถ๋ ๋งํ ๊ฒ๋ ์์ด Retry/Repeat ๋ช
๋ น์๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
TestMethodCommand์ ํจ์ฌ ๋ ๊ฐ๊น์์ผ ํฉ๋๋ค.
๋๋ ์ต์ ๋ณ๊ฒฝ ์ฌํญ์ ์
๋ฐ์ดํธํ์ต๋๋ค.
https://github.com/avilv/nunit/tree/instance-per-test-2
์ ๊ฑฐ๋ InstancePerTestCaseWhenCasesAreParallel
CompositeWorkItem MakeOneTimeSetUpCommand ๊ทธ๊ฒ์ SimpleWorkItem MakeTestCommand ๋ด๋ถ์ ๊ตฌ์ถ / ํ๊ธฐ ์กฐ๋ช
๊ธฐ ์ถ๊ฐ, ์๋ต์ ํตํด ๊ตฌํ FixtureLifeCycle
์ ์๋ํ๋ ๊ฒ ๊ฐ์ผ๋ฉฐ ํ๋ ์์ํฌ๊ฐ ๊ตฌ์ถ๋๋ ๋ฐฉ์์ ๋ ์ ํฉํฉ๋๋ค.
์ด์ ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋ง์ ๋จ์ ํ
์คํธ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ด ๋ค์ ๋ฒ์ ์ด์ ์ ๊ฒํ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น? ๋ฌผ๋ก ๊ฐ์ /๋ณ๊ฒฝ์ ์ํด ์ฌ์ ํ ๋ฉ์ ์
์ด ์ ๊ทผ ๋ฐฉ์์ ๋์๊ฒ ์ข์ ์๋ฆฌ์ด๋ฉฐ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒ ํ ์ ์๋ค๋ฉด ๋ค์ ๋ฆด๋ฆฌ์ค์์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค!
์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๊ฒํ ํ ์ ์๋ ๊ธฐํ๊ฐ ์์ต๋๊น? ์ ๋ง ๊ฐ๊น์์ง ๋๋
์ด ๊ธฐ๋ฅ์ ์ด๋ค ์์ง์์ด ์์๋์ง ๊ถ๊ธํ์ญ๋๊น? @avilv ๊ฐ ๊ฝค ๊ทผ์ ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ค๋ซ๋์ ๊ธฐ๋ํด ์์ผ๋ฉฐ ์ฌ์ฉํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค!
๋ชจ๋ ๊ฐ์ฌํฉ๋๋ค!
์ด ๊ธฐ๋ฅ์ด ์ง๊ธ ์๋ํฉ๋๊น?
@CharliePoole @avilv ์ต์ ๋ฒ์ ์ ๊ฒํ ํด
@janissimson ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ์ ๋ ๋ ์ด์ ์ด ํ๋ก์ ํธ์ ์ฐธ์ฌํ์ง ์์ผ๋ฏ๋ก ์ ๋ฆฌ๋ทฐ์์ ์งํ๋์ง ์์ต๋๋ค. @nunit-framework-team ๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ ๊ฒํ ํ ์ ์์ต๋๊น?
#3427์ ๋ณํฉํ๊ธฐ ์ํด ์ํํ ๋ชจ๋ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. @rprouse ๋ฆด๋ฆฌ์ค์์ ์ด๋ฅผ ์ธ์ ์์ํ ์ ์๋์ง ์ ์ ์์ต๋๊น?
์๋ก์ด ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ์ฌ์ฉํฉ๋๊น? ๋๊ตฐ๊ฐ๊ฐ ์๋ก์ด ์์ฑ๊ณผ ์ด๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ๋จํ ์ค๋ช ์ ์์ฑํ ์ ์์ต๋๊น?
์์ผ๋ก ๋ช ์ฃผ ์์ ์ถ์ํ ๊ณํ์ ๋๋ค. ๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ ์ถ์์ต๋๋ค. NET 5๋ ์ต์ข ๋ฒ์ ์ด๋ฉฐ ๋ฆด๋ฆฌ์ค ์ ์ ์ฝ๊ฐ์ ์ต์ข ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค. ๋ฌธ์ ๊ฐ ์์์ง ์๋ฌธ์ด์ง๋ง ๋๋ฌด ๊ฐ๊น๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ๋ซ์ง ์์๊น ์๊ฐํ์ต๋๋ค.
@rprouse ์ธ์ ์ ๋ฒ์ ์ ์ถ์ํ ์์ ์ด์ ๊ฐ์? ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
@janissimsons ๊ณง. ์ฐ๋ฆฌ๋ .NET 5.0 ๋น๋์ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ฌธ์ ์ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ค์ ๋ฆด๋ฆฌ์คํ๊ฒ ์ต๋๋ค. ์ด ํ๋ก์ ํธ ๋ณด๋์์ ์ํ๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค. https://github.com/nunit/nunit/projects/4
์ด๊ฒ์ ๋ฉ์ง ์์์ ๋๋ค!
์ด๊ฒ์ด NUnit์์ ๋ค์์ ๊ฐ๋ฅํ๊ฒ ํ๋ค๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๊ณ ์์ต๋๊น?
๋ค์์ ๋ชจ๋ ๊ฒฐํฉํฉ๋๋ค.
https://github.com/jawn/dotnet-parallel-parameterized-tests ์์ ๊ณผ๊ฑฐ์ ๋ช ๊ฐ์ง๋ฅผ ์๋ํ์ต๋๋ค.
์ ๋ฆด๋ฆฌ์ค๋ ์ฌ์ ํ .NET Full Framework 4.7.2 ๋๋ ์ต์ 4.8๊ณผ ํธํ๋ฉ๋๊น?
์น์ ํ๋,
๋ฐ์ฌ
@jawn ๋๋ ๋ชจ๋ ๊ฒ์ด ํจ๊ณผ๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. ๊ทธ๋ ์ต๋๋ค. ๋๋ ๊ทธ ๋ชจ๋ ๊ฒ์ ํ ์คํธํ์ง๋ง NUnit์๋ ๋ง์ ๊ธฐ๋ฅ์ด ์์ผ๋ฏ๋ก ์ผ๋ถ ๊ธฐ๋ฅ ์กฐํฉ์ด ์๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ต๋๋ค. ์ผ๊ฐ NuGet ํจํค์ง๋ฅผ ์์ ๋กญ๊ฒ ๊ฐ์ ธ์ ํ ์คํธํด ๋ณด์ธ์! ์ถ์ํ๊ธฐ ์ ์ ๋ ๋ง์ ํ ์คํธ์ ํผ๋๋ฐฑ์ ์ํฉ๋๋ค.
@drauch ์, 3.13 ๋ฆด๋ฆฌ์ค๋ ์ฌ์ ํ .NET 3.5๋ฅผ ์ง์ํฉ๋๋ค.
@avilv ์๊ณ ํ์
จ์ต๋๋ค !!
๊ทธ๋ฐ๋ฐ ์ด๋ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ ๋ฉ์ง ํ๋ฆ๋๋ฅผ ๋ง๋์
จ์ต๋๊น?
๊ฐ์ฌ ํด์
@rprouse ์ด ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํด ์ฃผ์๊ฒ ์ต๋๊น? ๊ฐ์ฌ ํด์!
@janissimsons ๋ฆด๋ฆฌ์ค์ฉ ๋ฌธ์๋ฅผ ์
๋ฐ์ดํธํ ๊ณํ์
๋๋ค. ์งง์ ๋ฒ์ ์ [FixtureLifeCycle(LifeCycle.InstancePerTestCase)]
๋ฅผ ํ
์คํธ ํด๋์ค์ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. ์๋ง๋ [Parallelizable(ParallelScope.All)]
์ ํจ๊ป ํ
์คํธ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ํด๋์ค ๋ด์์ ์คํ๋๋ ๊ฐ ํ
์คํธ์ ๋ํด ์ธ์คํด์คํ๋ ๊ฒ์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ค๋ฅธ ํ
์คํธ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ณ ๋ณ๋ ฌ ํ
์คํธ ์คํ์์ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@LirazShay ์คํฌ๋ฆฐ์ท์ ๋ค์ด์ด๊ทธ๋จ์ Visual Studio Enterprise์์ ์์ฑ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์๋ฃจ์ ํ์๊ธฐ์์ ์ ํ ํญ๋ชฉ์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ์ผ๋ก ํด๋ฆญํ๊ณ "์ฝ๋ ๋งต์ ํ์"๋ฅผ ์ ํํ ์ ์์ต๋๋ค. https://docs.microsoft.com/en-us/visualstudio/modeling/map-dependencies-across-your-solutions ReSharper์๋ ์ ์ฌํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
@jnm2 ๊ฐ์ฌํฉ๋๋ค!!!
๋๋ VS ์ํฐํ๋ผ์ด์ฆ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋งค์ฐ ๋์์ด ๋ ์ ์๋ ์ด ๊ธฐ๋ฅ์ ๋ํด ์์ง ๋ชปํ์ต๋๋ค.
ํ ๋๋ฌด ๊ฐ์ฌํฉ๋๋ค
์ด๊ฒ์ด ๋ฆด๋ฆฌ์ค๋์์ผ๋ฉฐ 3.13 ๋ฆด๋ฆฌ์ค์ ์ผ๋ถ๋ผ๋ ๊ฒ์ด ๋ง์ต๋๊น?
์ด๊ฒ์ด ๋ฆด๋ฆฌ์ค๋์์ผ๋ฉฐ 3.13 ๋ฆด๋ฆฌ์ค์ ์ผ๋ถ๋ผ๋ ๊ฒ์ด ๋ง์ต๋๊น?
ํนํ #3720์ ์ด์ ๋ธ๋ฆฌ ์์ค ์์ฑ ์ ์ฉ๊ณผ ๊ด๋ จํ์ฌ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ๊ด์ฐฐ ๋ฐ ์์ ๋์๋ค๊ณ ์๊ฐํ๋ฉฐ ํ์ฌ 3.13.1์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
NUnit 3.13.1์ด ์ถ์๋์์ต๋๋ค.
๋ ์ด์ ๋ฌธ์ ๊ฐ ๋จ์ ์์ต๋๊น?
์๋ ๊ทธ๊ฒ์ด ํ์ ๋ ์ด์ ์ ๋๋ค @andrewlaser
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๊ฒํ ํ ์ ์๋ ๊ธฐํ๊ฐ ์์ต๋๊น? ์ ๋ง ๊ฐ๊น์์ง ๋๋