๋ฐฉ๊ธ nunit์ ์๋ก์ด ํด๋ก ์ ์ก๊ณ Windows 10 Professional์์ ์คํ๋๋ ์ต์ NUnit 3 ํ ์คํธ ์ด๋ํฐ(3.10 with Run Tests in Parallel)๋ฅผ ์ฌ์ฉํ์ฌ Visual Studio 2017(์ปค๋ฎค๋ํฐ 15.7.4)์์ ์๋ฃจ์ ์ ์ด๊ณ "Debug-AnyCPU"๋ฅผ ์ ํํ์ต๋๋ค. "ํ๊ณ ๋น๋๋ฅผ ๋๋ฅด์ญ์์ค.
BUILDING.md๋ฅผ ์ฝ์ ํ nunit.framework.tests-* ๋ฐ nunitlite.tests-*์์ ๋ฐ์ํ์ง ์๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋ฌด์ํด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฒ์ดํธ์์ nunit.framework.tests-*์์ 2๊ฐ์ ์คํจ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์ค๋ฅ:
Test Name: TestCaseSourceCanAccessWorkDirectory("C:\\Users\\ace.olszowka\\source\\nunit\\bin\\Debug\\net20")
Test FullName: NUnit.Framework.TestContextTests.TestCaseSourceCanAccessWorkDirectory("C:\\Users\\ace.olszowka\\source\\nunit\\bin\\Debug\\net20")
Test Source: C:\Users\ace.olszowka\source\nunit\src\NUnitFramework\tests\TestContextTests.cs : line 110
Test Outcome: Failed
Test Duration: 0:00:00.001
Result StackTrace: at NUnit.Framework.TestContextTests.TestCaseSourceCanAccessWorkDirectory(String workDirectory) in C:\Users\ace.olszowka\source\nunit\src\NUnitFramework\tests\TestContextTests.cs:line 112
Result Message:
Expected string length 34 but was 50. Strings differ at index 34.
Expected: "C:\\Users\\ace.olszowka\\source\\nunit"
But was: "C:\\Users\\ace.olszowka\\source\\nunit\\bin\\Debug\\net20"
-------------------------------------------------^
์์ค๋ฅผ ๋ณด๋ฉด ์ด ๊ฐ์ด ๋์ผํด์ผ ํ๋ค๊ณ ๋งํ ์ ์๋ ํ ์ด๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ๋์ง ์ ์ ์์ต๋๋ค( _workDirectory
๋ฐ ํ
์คํธ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ TestContext.CurrentContext.WorkDirectory
). ์๋ง๋ ๋ด ์ชฝ์ ์๋ชป๋ ๊ตฌ์ฑ์ผ๋ก ์ธํด ์ผ์ข
์ ๊ฒฝ์ ์กฐ๊ฑด์ด๋ผ๊ณ ์๊ฐํฉ๋๊น?
๋ ๋ฒ์งธ ์ค๋ฅ:
Test Name: StackTracesAreFiltered("WarningInBeginInvoke",4)
Test FullName: NUnit.Framework.Assertions.WarningTests.StackTracesAreFiltered("WarningInBeginInvoke",4)
Test Source: C:\Users\ace.olszowka\source\nunit\src\NUnitFramework\tests\Assertions\WarningTests.cs : line 292
Test Outcome: Failed
Test Duration: 0:00:00.004
Result StackTrace: at NUnit.Framework.Assertions.WarningTests.StackTracesAreFiltered(String methodName, Int32 maxLineCount) in C:\Users\ace.olszowka\source\nunit\src\NUnitFramework\tests\Assertions\WarningTests.cs:line 310
Result Message:
Multiple failures or warnings in test:
1) (Warning message)
2) Expected the number of lines to be no more than 4, but it was 5:
1. at NUnit.TestData.WarningFixture.<>c__DisplayClass45_0.<WarningInBeginInvoke>b__0()
2. at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Object[]& outArgs)
3. at System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage(IMessage msg, IMessageSink replySink)
4. at System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.ThreadPoolCallBack(Object o)
5. at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
(end)
๋๋ ์ด ํ ์คํธ๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ํ๋ ค๊ณ ํ๋์ง ๊ธธ์ ์์ต๋๋ค. ํ์ง๋ง ๋ด ์ ํ๋ ์ดํด์ ๋ฐ๋ฅด๋ฉด ์ด ์ฝ๋๋ ํธ์ถ ์คํ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ๋งค์ฐ ๋ฏผ๊ฐํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ .NET Framework์ ์ต๊ทผ ๋ณ๊ฒฝ ์ฌํญ ๋๋ฌธ์ผ ์ ์์ต๋๊น?
๋ํ NUnitLite.Tests.CommandLineTests์์ ๋ชจ๋ ๋จ์ผ ํ ์คํธ ์ผ์ด์ค๊ฐ ์คํจํฉ๋๋ค. ์์์น ๋ชปํ ์ํฉ์ด ๋ฐ์ํ๋ฉด ๊ธฐ๊บผ์ด ์กฐ์ฌํ๊ฒ ์ต๋๋ค.
๋น๋๊ฐ CI์์ ์ ๋ฌ๋๋ ๊ฒ์ ๋ณผ ๋ ์ด๊ฒ์ ์๋ง๋ ๋ด ์ชฝ์ ๊ตฌ์ฑ ๋ฌธ์ ์ผ ์ ์์ง๋ง BUILDING.md์๋ ์ด์ ๋ํด ์ธ๊ธ๋ ๊ฒ์ด ์์ผ๋ฏ๋ก ๋ณด๊ณ ์๊ฐ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ ๊ณ ๊ฐ์ฌํฉ๋๋ค! ํ
์คํธ ํ์๊ธฐ์์ TestCaseSourceCanAccessWorkDirectory
๋ฐ CommandLineTests
๊ฐ ์๋ํ์ง ์๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ๋ฌ๋์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ก๋ถํฐ ๋
๋ฆฝ์ ์ผ๋ก ๋ง๋ค ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํฉ๋๋ค. @nunit/framework-team ์์ด๋์ด๊ฐ ์์ต๋๊น?
๋ ๋ฒ์งธ ์ค๋ฅ์ ๊ฒฝ์ฐ ๋์ ํ ์คํธ์ ๋๋ค. ๊ทธ๊ฒ์ 5๋ก ์ฌ๋ฆฌ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
๊ณผ๊ฑฐ์๋ ์ฌ๋๋ค์๊ฒ NUnit ํ ์คํธ์ ํ ์คํธ ํ์๊ธฐ๋ฅผ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ํ์ต๋๋ค. ๋ค๋ฅธ ํ์๋ค์ ํ ์คํธ ํ์๊ธฐ๊ฐ ๋ง์ ์ฌ๋๋ค์๊ฒ ํ ์คํธ๋ฅผ ์คํํ๋ ๊ธฐ๋ณธ ๋ฐฉ๋ฒ์ด ๋์๋ค๋ ๋ง์ ๋ฐ๋ฐํ์ต๋๋ค.
ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ํ ์คํธํ ๋ ์ ์ฉํ์ง ์์ ํน์ ๋ฌ๋์ ๋ํ ์ถฉ๋ถํ ์ ๋ก๊ฐ ๋ถ๋ช ํ ์์ต๋๋ค. ํ ์คํธ ์ค์ธ ํ๋ ์์ํฌ๋ฅผ ํ ์คํธํ๋ ๊ฒ์ ๋งค์ฐ ํน๋ณํ ์ํฉ์ด๋ฉฐ ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ๊ฒช๋ ์ํฉ์ด ์๋๋๋ค. OTOH, ํ์ด ์ํ๋ค๋ฉด ์ด๋ํฐ๋ฅผ ํตํด ํ ์คํธ ํ์๊ธฐ์์ ์ฑ๊ณต์ ์ผ๋ก ์คํํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋ชฉํ๋ก ์ผ์ ์๋ ์์ต๋๋ค.
๋น์ ์ด ๋ฌด์์ ํ๋ , ํ ์คํธ ํ์๊ธฐ์์ NUnit ํ ์คํธ๋ฅผ ์คํํ๋ ๊ฒ์ด ํ์ฌ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ์ฌ๋๋ค์๊ฒ ์๋ ค์ฃผ๋ ๋ฌธ์๋ฅผ ์ ์ถํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ ๋งฅ๋ฝ์์ ๊ทธ๋ค์๊ฒ ๊ทธ๊ฒ์ด ์๋ํ๊ฒ ํ๋ ๊ฒ์ด ๋ชฉํ์ธ์ง, ์๋๋ฉด ์ฐ์ ์์๊ฐ ๋ฌด์์ด๋ ๊ฒฐ์ ๋ ๊ฒ์ด ์๋๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค.
์ด๋ํฐ์ ์ฒซ ๋ฒ์งธ ์ ์์ด์ ํ๋ ์์ํฌ์ ๋ค๋ ๊ฐ ๊ธฐ์ฌํ ์ฌ๋์ผ๋ก์ ์ ๋ ํญ์ NUnit ๊ฐ๋ฐ์ ํ ์คํธ ํ์๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋น๋ํ์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ ํ โโ๋ฌธ์ ์ ๋ํ ๋์ ๊ฒฌํด์ ๋๋ค. ์ ์ฅ, ๋๋ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ CI์์ ํ๋ ์์ํฌ๋ฅผ ํ ์คํธํ๊ธฐ ์ํด ์ฝ์์ ์ฌ์ฉํ๋ ๊ฒ์กฐ์ฐจ ์ข์ํ์ง ์๋๋ค!!!
์ด๋ค ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ์ด๋ํฐ๋ก ์ธํ ๊ฒ์ผ ์๋ ์๊ณ ์๋ ์๋ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฌ๋๋ค์ ์ค์ NUnit ๋ฌ๋(NUnitLite ๋๋ ์ฝ์ ๋ฌ๋)๋ก ๊ณ์ ๋ณด๋ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ํฐ๋ NUnit ํ๋ก์ ํธ์ ์๋๋ผ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ๋ฌ๋์ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค.
FWIW์์ ๋ด๋ถ๋ฅผ ๋ฐ๋ผ๋ณด๋ ๊ฒ: ๋ฌธ์ํ๋์ด ์๋ ํ ์๋ฅด๋ ๋ฐฉ์์ ์ ์๊ฒ ์ ๋ง ์ค์ํ์ง ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ๊ฐ๋ฐ์๋ก์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฐฉ์์ ์ฌ์ฉํ๋ ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ฌ์ ๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ ์ผ์ ํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
๊ณผ๊ฑฐ์๋ ์ด๊ฒ์ด ReSharper์ dotCover์์ ๊ฒ์ด์ง๋ง "๋๋ถ๋ถ ์๋ํ๋" ๋ฌด๋ฃ/์คํ ์์ค ์ํํธ์จ์ด ๋์์ด ์๋ ๊ฒฝ์ฐ ๋ผ์ด์ ์ค ๋น์ฉ์ด ์๊ท๋ชจ ์์ /๊ฐ๋ณ ๊ฐ๋ฐ์์๊ฒ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์์ ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค.
ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ ๊ฐ๋ ์๋ ๋ง์ ๋ถ๋ถ์ด ์์ต๋๋ค. ์ํฌํ๋ก์์ ํ์ด๋์ค์ง ์์๋ ๋๋ฏ๋ก ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ด ์๊ฐ์ ๊ด์ฐฎ์ ์ฝ์ ๋ฌ๋(๋๋ ๋ค๋ฅธ ๋ฌ๋)๋ฅผ ์ฌ์ฉํ ๊ฒ์ผ๋ก ์์๋๋ ๊ฒฝ์ฐ ๋ฌธ์ํํ๋ฉด ๋ฉ๋๋ค.
NUnit์์ ๊ฐ๋ฐ ์ค์ด๊ณ ํ๋ ์์ํฌ์์ ์์ ํ๋ ๊ฒฝ์ฐ ํน๋ณํ ๋ฐฉ์์ผ๋ก ์์ ์ ์ํํ๋ ๋ฌ๋(R#, ์์ฒด ์ด๋ํฐ)๋ฅผ ํผํฉํ๋ฉด ๋ฌธ์ ๊ฐ ํผ๋๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฌ๋๋ก ํ ์คํธํ๊ธฐ ์ ์ ํ๋ ์์ํฌ๊ฐ ๊ฒฉ๋ฆฌ๋ ์ํ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ค๋ ๊ฒ์ ์๊ณ ์ถ์ต๋๋ค. ๊ทธ๋์ ์ ์์ ์์๋ nunitlite๋ฅผ ์ฌ์ฉํ์ฌ CI๋ฅผ ๊ฐ๋ฐํ๊ณ ๋ก์ปฌ์์ ์คํํ๋ฉด์ ํ ์คํธํฉ๋๋ค. ํ ์คํธ ํ์๊ธฐ์์ NUnit์ผ๋ก ๊ฐ๋ฐํ๋ ค๋ ์ฌ๋์ ์ฌ์ ํ โโCI๋ฅผ ๋ก์ปฌ์์ ์คํํด์ผ ํ๊ณ ๋ญ๊ฐ ์ด์ํด ๋ณด์ผ ๋ nunitlite ๋๋ nunit3-console๋ก ํด๋ฐฑํด์ผ ํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
ํน์ ๋ฆด๋ฆฌ์ค์์ nunit ํ ์คํธ๋ฅผ ์คํํ๋ ์ฌ๋๋ค์๊ฒ๋ ํจ์ฌ ๋ ๋ง์ ์์ ๋๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ชจ๋ ํ๋ ์์ํฌ ํ ์คํธ์ ๋ํด NUnitLite๋ฅผ ์ฌ์ฉํ๊ณ ์ข ๋จ ๊ฐ ํ ์คํธ์ ๋ํด ์ฝ์, VSTest ์ด๋ํฐ ๋ฐ UWP ์คํ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ CI๋ฅผ ์ ์์ผ๋ก ๋ง๋ค์ด์ผ ํฉ๋๋ค.
CI๊ฐ ๊ฒฌ๊ณ ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด Test Explorer, ReSharper, NCrunch ๋ฐ CI ์คํฌ๋ฆฝํธ ๊ฐ์ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์์ด๋ ๊ด์ฐฎ์ต๋๋ค. ์ด๋ฌํ IDE ๋ด ๋๊ตฌ๋ฅผ ๋ฌด์ํด์ผ ํ๋ค๊ณ ๋งํ๋ ๊ฒ์ ๋ด ์์ ํ๋ฆ๋ ์๋๊ธฐ ๋๋ฌธ์ ๊ธฐ์ฌ์ ๋ํ ์ฅ๋ฒฝ์ด์ ๊ฑฐ์ง์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋์ ์ด์์ ์ธ ์ํฌํ๋ก์ฐ:
.\build.ps1 -t test
๋ฅผ ์คํํ์ฌ ํต๊ณผ ๋ฐ ์คํจ๊ฐ ์์๋๋ก์ธ์ง ํ์ธํฉ๋๋ค.ํ ์คํธ๊ฐ ๋ฌ๋์ ๋ฏผ๊ฐํ ๋๋ฌธ ์๋๋ฆฌ์ค์์๋ ํ ์คํธ๋ฅผ ๋ฌ๋์ ๋ฏผ๊ฐํ์ง ์๊ฒ ๋ง๋๋ ๊ฒ์ด ์ด๋ ค์ด์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ReSharper ๋ฐ NCrunch ์๋ ๋ณต์ฌ๋ณธ์ ํ๋ ฅ์ ์ผ๋ก ๋ง๋ ILMerge์ ๋ํด ์์ฑํ ํตํฉ ํ ์คํธ๋ณด๋ค ๋ ๋์ ์ ์์ต๋๋ค.
@aolszowka ์ ๋ ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ํ๋ ๊ธฐ์ฌ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ์ต์ ์ํ๋ก ์ ์งํจ์ผ๋ก์จ ๊ธฐ์ฌ์์ ์๊ฐ์ ์กด์คํด์ผ ํ๋ค๋ ๊ทํ์ ์๊ฒฌ์ 100% ๋์ํฉ๋๋ค.
@jnm2 ๋๋ ๋น์ ์ "์ ์" ์ ๊ทผ ๋ฐฉ์์ ์ข์ํฉ๋๋ค. ํ ์คํธ ํ์๊ธฐ์์ ๋ชจ๋ ๊ฒ์ด ์ํํ๊ฒ ์๋ํ๋๋ก ํ๋ ๊ฒ์ด ์ฌ์ธ์ง ์๋ฌธ์ด์ง๋ง ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
nunit์์ ์์ ํ๋ ๋ชจ๋ ์ฌ๋์ด ์ธ์ ๋ ๋ฎ์ ์์ค์ ํ ์คํธ๋ก ์ ํํด์ผ ํ๋์ง ์๋ ๊ฒ์ ์ฌ์ ํ โโ์ ์ฉํ๊ณ ํ์์ ์ ๋๋ค.
์ด ์์ด๋์ด๋ฅผ IMO๋ก ๋ฐ์ ์ํค๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ๊ฐ์ฅ ํฐ ์ผ์ ๋ณ๋์ ์์คํ ๊ณผ ํตํฉ ํ ์คํธ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ด ๊ทผ๋ณธ ์์ธ์ผ ์ ์์ต๋๋ค. FrameworkController์์ XML์ ๊ฐ์ ธ์ค๋ ํ
์คํธ๋ฅผ ์์ฑํ๋ ๋์ TestContext.WorkDirectory
๊ฐ C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE
๋ณ๊ฒฝ๋์์์ ์์์ต๋๋ค.
ํธ์ถ ์คํ:
> nunit.framework.dll!NUnit.Framework.Api.DefaultTestAssemblyBuilder.Build(System.Reflection.Assembly assembly, string suiteName, System.Collections.Generic.IDictionary<string, object> options) Line 137 C#
nunit.framework.dll!NUnit.Framework.Api.DefaultTestAssemblyBuilder.Build(string assemblyNameOrPath, System.Collections.Generic.IDictionary<string, object> options) Line 114 C#
nunit.framework.dll!NUnit.Framework.Api.NUnitTestAssemblyRunner.Load(string assemblyNameOrPath, System.Collections.Generic.IDictionary<string, object> settings) Line 154 C#
nunit.framework.dll!NUnit.Framework.Api.FrameworkController.LoadTests() Line 204 C#
TestContext.WorkDirectory
๊ฐ ์ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ํ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฆ, ๋์ ํ
์คํธ๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ํ
์คํธ(!)์์ ๊ณต์ ๋ฉ๋๋ค. WorkDirectory์ ์์กดํ๋ ๋ชจ๋ ํ
์คํธ๊ฐ ์ ํํ๋ ค๋ฉด [NonParallelizable]
๋ก ํ์๋์ด์ผ ํฉ๋๋ค.
๋๋ ์ค๋ ์ ์ ์ด ๋ฌธ์ ๋ฅผ ์ง์ ํ๋ค. ์ด๋๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
NonParallelizable๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๋ง์ NUnit ํ ์คํธ๊ฐ ํ๋ ๊ฒ์ฒ๋ผ ํ ์คํธ๊ฐ WorkDirectory๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ ์ด์ ์์กดํ๋ ๋ค๋ฅธ ํ ์คํธ๊ฐ ์คํจํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
NUnit์์ ์ ์๋์ง ์์ ํ ์คํธ๊ฐ ์คํ๋๋ ์์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
์๋๋ Work ๋๋ ํ ๋ฆฌ๊ฐ ํ ๋ฒ ์ค์ ๋๊ณ ์คํ์ ์ํด ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ์ง๋์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋ฏธ๊ตญ ๋ฒ๊ทธ์ ๋๋ค.
๊ฐ ์คํ ์ปจํ ์คํธ์ ๋ํด ๋ ๋ฆฝ์ ์ธ ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ํ์ฉํ ์ ์๋ ์ด์ ๊ฐ ์์ต๋๊น?
@CharliePoole ์ด๋ป๊ฒ ๊ทธ๊ฒ์ ํ์ค๋ก ๋ง๋ค๊น์? ํ๋ ์์ํฌ ํ ์คํธ๊ฐ ์ปจํธ๋กค๋ฌ ์คํ ๋ด์์ ์คํ๋๋ ์ปจํธ๋กค๋ฌ์ธ FrameworkController๋ฅผ ํ ์คํธํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ํน๋ณํ ์์น์ ์์ต๋๋ค.
ํ
์คํธ๋ฅผ ์ ์ธํ๊ณ WorkDirectory
์ ์๋ฏธ๋ "์คํ์ ์ํ ๋ชจ๋ ์ถ๋ ฅ ํ์ผ์ ์์ ํ๋๋ก ์ฌ์ฉ์๊ฐ ์ค์ ํ ๋๋ ํ ๋ฆฌ"์
๋๋ค. ๋ฐ๋ผ์ ํ
์คํธ๋ ๋ณ๊ฒฝํ ์ ์์ด์ผ ํฉ๋๋ค.
์์ฒด ํ ์คํธ์ ๊ฒฝ์ฐ ์ค์ ํ ์ ์์ด์ผ ํ์ง๋ง ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๋ฉด ํด๋น ์ค์ ์ด ๋ค๋ฅธ ํ ์คํธ์ ์ํฅ์ ๋ฏธ์น์ง ์์์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์๋ง๋ ์ ๋๋ก ํ๊ณ ์์ง ์์ ๊ฒ์ ๋๋ค. ๐
ํ์น์์, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋ง๋ค๊ณ ํ
์คํธ๋ฅผ ์ค์งํ ์ ์์ต๋๋ค. <ducks>
๊ทธ๊ฒ์ ์ค์ ๋ก ๋ฉ์ง ์์ด๋์ด์
๋๋ค. ์ ์ ํ๋๊ฐ ์ค์ ๋์๋์ง ์ถ์ ํ๊ณ ๊ทธ ํ์ ์ค์ ์ ๊ฑด๋๋ฐ๋์? ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ DefaultTestAssemblyBuilder
์ค์ ํ๋์ง ํ์ธํ๋ ํ
์คํธ๊ฐ ํ์๋์ง ์์ผ๋ฏ๋ก ์ํด์ผ ํฉ๋๋ค!
์ด๋ฅผ ๋ณ๊ฒฝํ๋ NUnit ํ ์คํธ๊ฐ ์์ผ๋ฉฐ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋ฉด ์คํจํ ์ ์์ต๋๋ค.
@oznetmaster ๊ฒ์ํ์ง๋ง ์ค์๋ฅผ ์ ์ธํ๊ณ ๊ทธ๊ฒ์ ๋ณ๊ฒฝํ๋ NUnit ํ ์คํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ํธ๋๊ฐ ์๋์?
๋ด ๊ธฐ๋ก ๋ณด๊ด์๋ฅผ ๊ฒ์ํด์ผ ํฉ๋๋ค.
๋ ผ์ํ ๋ด์ฉ์ ์ํํ์ฌ ์ด๋ฏธ CF ๋น๋์ ๋ฌธ์ ๋ฅผ ์์ ํ์ต๋๋ค. ๊ฐ์ ํ ๋ฒ๋ง ์ค์ ํ ์ ์์ต๋๋ค. null์ธ์ง ํ์ธํ๊ณ null์ด๋ฉด ์ค์ ํ๋๋ก ํ์ฉํฉ๋๋ค.
if (options.ContainsKey (FrameworkPackageSettings.WorkDirectory))
TestContext.DefaultWorkDirectory = options[FrameworkPackageSettings.WorkDirectory] as string;
else
if (TestContext.DefaultWorkDirectory == null)
TestContext.DefaultWorkDirectory = Directory.GetCurrentDirectory ();
๋ฌธ์ ๊ฐ ๋ ํ ์คํธ๋ FrameworkPackageSettings.WorkDirectory๊ฐ ํฌํจ๋์ง ์์ ์ต์ ์ผ๋ก DefaultTestAssemblyBuilder.Build๋ฅผ ํธ์ถํ์ฌ TestContext.DefaultWorkDirectory๋ฅผ CurrentDirectory๋ก ๋ฎ์ด์ฐ๊ฒ ํ๋ ํ ์คํธ์์ต๋๋ค. ์ฆ, WorkDirectory๊ฐ ์ต์์ ์คํ์์ ์ค์ ๋ ๊ฒฝ์ฐ ํ ์คํธ์์ ๋ฎ์ด์ฐ์ฌ์ง๊ณ ๋ณต์๋์ง ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ๊ฐ์ ์ ๊ทผ ๋ฐฉ์์ ์ทจํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๊น?
๋๋ฅผ ์ํด ์๋ํฉ๋๋ค. ๋ด CF ๋น๋๋ NUnit ํ ์คํธ๋ฅผ 100% ํต๊ณผํ์ต๋๋ค.
@OmicronPersei ์์ผ๋ก ๋ฉฐ์น ์์ ์ฃผ๋ณ์ ์๋ค๋ฉด @oznetmaster ์ ์์ ํ๋ก๊ทธ๋จ์ ์ค ์ ์์ต๋๊น?
์! ์ค๋ ์ ๋ ์ ์๋ํฉ๋๋ค
๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ nunit3-vs-adapter#528 ๋๋ฌธ์ ์ด ๋ฒ๊ทธ๋ฅผ ์ค์ ๋ก ์ฌํํ ์ ์์ต๋๋ค. ์์ด๋์ด?
@OmicronPersei ์ค. ๋ชจ๋ฅด๊ฒ ์ด์. WorkDirectory
๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋ .runsettings๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์
๋๊น?
์ข์, ๋๋ ๊ทธ๊ฒ์ ์๋ํ๋ค. TestCaseSourceCanAccessWorkDirectory
๋ ์ฑ๊ณตํ์ง๋ง StackTracesAreFiltered
๋ OP์์ ๋์ผํ ๋ฉ์์ง/์คํ ์ถ์ ์ผ๋ก ์คํจํฉ๋๋ค.
StackTracesAreFiltered๋ฅผ 5๋ก ์ฌ๋ ค์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ํ๋ ์์ด ์ถ๊ฐ๋๋์ง ํ์ธํ๊ธฐ ์ํ ๋์ ํ ์คํธ์ด๋ฏ๋ก ์ ์ด๋ฅผ ๋ฒ์ด๋์ง ์์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
TestCaseSourceCanAccessWorkDirectory
๋ ์ด๋ป์ต๋๊น, ์๋๋ฉด ์ฌ์ ํ ์ด PR์ ๋ฒ์์ ์์ต๋๊น?
ForTestCaseCanAccessWorkDirectory, @oznetmaster ์ ์์ ์ผ๋ก ํด๊ฒฐ๋ฉ๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ถ๊ฐ ์กฐ์ฌ๊ฐ ํ์ํฉ๋๋ค.
๋ด ์ปดํจํฐ์์ ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์์ผ๋ฉฐ ๋ฌธ์ ์ ํ ์คํธ๋ ํต๊ณผํฉ๋๋ค.
๊ฑฑ์ ๋ง์ธ์. ๋ค๋ฅธ ์ฌ๋์ด ๊ทธ ์ญํ ์ ํ ์ ์์ต๋๋ค. ์์ PR๋ ์ข์ํฉ๋๋ค.
์ง ์ฒญ์๋ฅผ ํ๋ ค๊ณ ํฉ๋๋ค. ์ด ๋ฌธ์ ๊ฐ ์ฌ์ ํ ์ด๋ ค ์์ด์ผ ํ๋ ์ด์ ๊ฐ ์์ต๋๊น? ์๋๋ฉด ์ด๋ค ์ ํ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ๋ซ์ ์ ์์ต๋๊น? (WONTFIX์ผ์ง๋ผ๋).
์๋์, ์ง์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ํ์.