<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=NUnit%2FC%2B%2B%EC%98%88%EC%A0%9C</id>
	<title>NUnit/C++예제 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=NUnit%2FC%2B%2B%EC%98%88%EC%A0%9C"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=NUnit/C%2B%2B%EC%98%88%EC%A0%9C&amp;action=history"/>
	<updated>2026-05-14T21:20:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=NUnit/C%2B%2B%EC%98%88%EC%A0%9C&amp;diff=34789&amp;oldid=prev</id>
		<title>imported&gt;qa22ahj at 01:31, 3 December 2013</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=NUnit/C%2B%2B%EC%98%88%EC%A0%9C&amp;diff=34789&amp;oldid=prev"/>
		<updated>2013-12-03T01:31:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
=== 예제 소스 실행법 (Using C++) ===&lt;br /&gt;
* 먼저 프로젝트를 Managed C++ 클래스 라이브러리로 만든다.&lt;br /&gt;
* Test Fixture 될 클래스의 앞에는 TestFixture, 테스트 함수 앞에 Test 인 Attribute 를 붙인다.&lt;br /&gt;
* 속성 페이지 가서 C/C++로 간다음, #using 참조확인에다가 NUnit이 깔린 폴더의 bin 폴더를 넣어준다.&lt;br /&gt;
* 컴파일후 지정된 dll 파일이 생긴다.&lt;br /&gt;
* NUnit이 깔린 폴더의 bin안에 보면 NUnit-gui.exe을 실행한다. 컴파일해서 나온 dll을 로딩해주고 run하면 테스트들을 실행해준다.&lt;br /&gt;
&lt;br /&gt;
* 예제는 아무 생각없이 만들었고, 테스트 할 필요도 없는 거지만.. 그냥 사용법을 보는 거니까 신경쓰지 마세요.&lt;br /&gt;
 // NUnit6.h&lt;br /&gt;
 #pragma once&lt;br /&gt;
 &lt;br /&gt;
 #using &amp;amp;lt;nunit.framework.dll&amp;amp;gt;&lt;br /&gt;
 using namespace System;&lt;br /&gt;
 using namespace NUnit::Framework;&lt;br /&gt;
 &lt;br /&gt;
 namespace NUnitSamples&lt;br /&gt;
 {&lt;br /&gt;
 	[TestFixture]&lt;br /&gt;
 	public __gc class Calculator&lt;br /&gt;
 	{&lt;br /&gt;
 		int a, b;&lt;br /&gt;
 	public:&lt;br /&gt;
 		[SetUp] void Init();&lt;br /&gt;
 		[Test] void Add();&lt;br /&gt;
 		[Test] void Sub();&lt;br /&gt;
 		[Test] void Mul();&lt;br /&gt;
 		[Test] void Div();&lt;br /&gt;
 	};&lt;br /&gt;
 }&lt;br /&gt;
 // NUnit6.cpp&lt;br /&gt;
 #include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;NUnit6.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 namespace NUnitSamples {&lt;br /&gt;
 	void Calculator::Init() {&lt;br /&gt;
 		a = 5;&lt;br /&gt;
 		b = 7;&lt;br /&gt;
 	}&lt;br /&gt;
 	void Calculator::Add() {&lt;br /&gt;
 		Assertion::AssertEquals(12, a+b);&lt;br /&gt;
 	}&lt;br /&gt;
 	void Calculator::Sub() {&lt;br /&gt;
 		Assertion::AssertEquals(-2, a-b);&lt;br /&gt;
 	}&lt;br /&gt;
 	void Calculator::Mul() {&lt;br /&gt;
 		Assertion::AssertEquals(35, a*b);&lt;br /&gt;
 	}&lt;br /&gt;
 	void Calculator::Div() {&lt;br /&gt;
 		Assertion::AssertEquals(1.4, a/b);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
=== 사족 ===&lt;br /&gt;
* 헤더에다 다 구현해도 된다. 하지만 같은 이름의 cpp파일을 만들어줘야 하는것같다. 안그러면 Test없다고 안된다.&lt;br /&gt;
* namespace 귀찮으면 안만들어도 된다.&lt;br /&gt;
* 간결 버젼&lt;br /&gt;
 // NUnit6.h&lt;br /&gt;
 #pragma once&lt;br /&gt;
 &lt;br /&gt;
 #using &amp;amp;lt;nunit.framework.dll&amp;amp;gt;&lt;br /&gt;
 using namespace System;&lt;br /&gt;
 using namespace NUnit::Framework;&lt;br /&gt;
 &lt;br /&gt;
 [TestFixture]&lt;br /&gt;
 public __gc class Calculator&lt;br /&gt;
 {&lt;br /&gt;
 	int a, b;&lt;br /&gt;
 public:&lt;br /&gt;
 	[SetUp]&lt;br /&gt;
 	void Calculator::Init() {&lt;br /&gt;
 		a = 5;&lt;br /&gt;
 		b = 7;&lt;br /&gt;
 	}&lt;br /&gt;
 	[Test]&lt;br /&gt;
 	void Calculator::Add() {&lt;br /&gt;
 		Assertion::AssertEquals(12, a+b);&lt;br /&gt;
 	}&lt;br /&gt;
 	[Test]&lt;br /&gt;
 	void Calculator::Sub() {&lt;br /&gt;
 		Assertion::AssertEquals(-2, a-b);&lt;br /&gt;
 	}&lt;br /&gt;
 	[Test]&lt;br /&gt;
 	void Calculator::Mul() {&lt;br /&gt;
 		Assertion::AssertEquals(35, a*b);&lt;br /&gt;
 	}&lt;br /&gt;
 	[Test]&lt;br /&gt;
 	void Calculator::Div() {&lt;br /&gt;
 		Assertion::AssertEquals(1.4, a/b);&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 // NUnit6.cpp&lt;br /&gt;
 #include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;NUnit6.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== MFC에서 사용하기 ===&lt;br /&gt;
VC++ 7.0의 MFC에서 NUnit을 써보자. 이것보다 좋은 방법이 있을듯한데... 인수군은 이방법밖에는 만들어내지 못했다. &lt;br /&gt;
# 일단 MFC 프로젝트를 만든다. 이것을 메인프로젝트라고 하자.&lt;br /&gt;
# 전체 솔루션에 Managed C++ Library 프로젝트를 새로 추가한다. 이것을 테스트프로젝트라고 하자.&lt;br /&gt;
# 테스트 프로젝트의 속성으로 들어가서 #using 참조에 nunit\bin폴더를 넣어준다.&lt;br /&gt;
# 테스트 프로젝트의 속성으로 들어가서 포함 디렉토리에 위의 메인프로젝트의 폴더를 넣어주자.&lt;br /&gt;
# 메인프로젝트의 속성탭에 가서 Managed C++ Extension을 체크해준다.&lt;br /&gt;
일단 준비는 됐다. 시작해 보자.&lt;br /&gt;
&lt;br /&gt;
메인프로젝트에서 만든 새 클래스를 테스트 프로젝트에서 테스트하고 싶다. 어떻게 해야할까? 순진한 인수군은 #include &amp;lt;domain.h&amp;gt; 이렇게 하고, 테스트 클래스에 .h랑 .cpp 참조 넣어주면 될줄 알았다. 이것땜에 어제밤부터 삽질했다. 이렇게만 하면 안되고... 새로 만든 클래스를 일단 보자.&lt;br /&gt;
 #pragma once&lt;br /&gt;
 &lt;br /&gt;
 class CDomain&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 	CDomain(void);&lt;br /&gt;
 	~CDomain(void);&lt;br /&gt;
 	int add(int a, int b);&lt;br /&gt;
 	int mult(int a, int b);&lt;br /&gt;
 };&lt;br /&gt;
평소대로 하자면 이렇게 하면 될것이다. 하지만 현재 프로젝트는  [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmxspec/html/vcmanagedextensionsspec_16_2.asp Managed C++ Extensions]이다. 이것은 C++을 이용해서 .Net을 Platform위에서 프로그래밍을 하기 위하여 Microsoft에서 C++을 확장한 형태의 문법을 제안된 추가 문법을 정의해 놓았다. 이를 이용해야 NUnit이 C++ 코드에 접근할수 있다. 이경우 NUnit 에서 검증할 클래스에 접근하기 위해 다음과 같이 클래스 앞에 [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmxspec/html/vcmanagedextensionsspec_16_2.asp __gc] 를 붙여서 선언해야 한다.&lt;br /&gt;
 #pragma once&lt;br /&gt;
 &lt;br /&gt;
 public __gc class CDomain&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 	CDomain(void);&lt;br /&gt;
 	~CDomain(void);&lt;br /&gt;
 	int add(int a, int b);&lt;br /&gt;
 	int mult(int a, int b);&lt;br /&gt;
 };&lt;br /&gt;
__gc의 가 부여하는 능력과 제약 사항에 대해서는  [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmxspec/html/vcmanagedextensionsspec_4.asp  __gc] 을 참고하자. NUnit 상에서 테스트의 대상 클래스는 무조건 포인터형으로 접근할수 있다.  이제 테스트 클래스의 내용을 보자.&lt;br /&gt;
 // TestCase.h&lt;br /&gt;
 &lt;br /&gt;
 #pragma once&lt;br /&gt;
 &lt;br /&gt;
 #using &amp;amp;lt;nunit.framework.dll&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using namespace System;&lt;br /&gt;
 using namespace NUnit::Framework;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;Domain.h&amp;quot; // 포함 디렉토리에 메인프로젝트의 폴더를 넣어놨으므로 가능&lt;br /&gt;
 &lt;br /&gt;
 namespace TestCase&lt;br /&gt;
 {&lt;br /&gt;
 	[TestFixture]&lt;br /&gt;
 	public __gc class Class1&lt;br /&gt;
 	{&lt;br /&gt;
 	private:&lt;br /&gt;
 		CDomain* m_pD; // Only Pointer&lt;br /&gt;
 	public:&lt;br /&gt;
 		[SetUp]&lt;br /&gt;
 		void init() {&lt;br /&gt;
 			m_pD = new CDomain; // delete 필요없다.&lt;br /&gt;
 		}&lt;br /&gt;
 		[Test]&lt;br /&gt;
 		void testAdd() {&lt;br /&gt;
 			Assertion::AssertEquals(7, m_pD-&amp;amp;gt;add(3,4));&lt;br /&gt;
 		}&lt;br /&gt;
 		[Test]&lt;br /&gt;
 		void testMult() {&lt;br /&gt;
 			Assertion::AssertEquals(12, m_pD-&amp;amp;gt;mult(3,4));&lt;br /&gt;
 		}&lt;br /&gt;
 	};&lt;br /&gt;
 }&lt;br /&gt;
이렇게 해주면 된다. 이거 알아내느라 엄청 삽질했다. 그런 의미로... NUnit 많이 애용해 달라. 혹시나 더 간단하고 좋은 방법 있으면 올려 주세요.&lt;br /&gt;
----&lt;br /&gt;
이 경우 Unmanaged C++ 코드에 대해서 적용할수 없다. 즉, MFC로 완성된 프로그램이라도, .Net Platform 이 없는 곳에서는 작동할 수 없다. (로직에 __gc 가 존재하므로) &lt;br /&gt;
&lt;br /&gt;
[[류상민]]은 NUnit 과 Unmanged C++의 연결을 완전하게는 하지 못했다. Managed C++프로젝트와 Unmanged C++ 프로젝트 두개를 만들어 Managed C++ 코드에서 NUnit 을 이용해 Unmanaged C++ 에 접근해 테스트 코드를 작성했다. 하지만, .Net Platform에 미숙과, Managed C++ Extension의 몰이해, 프로젝트 관리와 의존성 문제에 봉착해 곧 벽에 부딪쳤다. 이 둘은 혼용할수 없음을 알았다.&lt;br /&gt;
&lt;br /&gt;
Unmanaged C++에서 가장 좋왔던 방법은 Unmanaged C++ Project 두개를 만들어서, 한쪽으로 의존시킨후 assert 를 이용해 자체적인 Test Framework 을 작성해서 사용하는 방법이었다.&lt;br /&gt;
--NeoCoin&lt;br /&gt;
----&lt;br /&gt;
아.. __gc를 쓰면 닷넷 플랫폼없는 곳에서는 쓸 수가 없겠네요. 그러면 이방법은 어떤가요? 일단 테스트할때는 테스트할 클래스에 __gc를 붙이잖아요? 나중에 배포할때는 __gc를 없애는 겁니다. 물론 Managed C++ Extensions의 문법을 쓰면 안되겠죠.(__gc빼고) 매크로를 잘 쓰면 어떻게 될거 같기도 한데... --[[인수]]&lt;br /&gt;
----&lt;br /&gt;
현재는 Managed C++에 깊히 공부해 보지 않아서, 잘 모르겠다. 이것이 __gc를 붙였다 때었다 하는 문제인지 확신할수가 없다. &lt;br /&gt;
&lt;br /&gt;
그것을 떠나서, MFC를 쓰면서 테스트를 하는 것이 의미 있어 지려면, MFC 로 작성한 프로그램이 정상 동작하면서, 테스트를 할수 있어야 하는데, MFC Frameworks 이 Managed C++ 모드로 컴파일이 잘되고, 잘 돌아가는지, 이것이 의문이다. 된다면, MS에서 모든 MFC class앞에 __gc가 붙이기라도 한걸까? 혹은 이미 해당 매크로가 존재하지 않을까? &lt;br /&gt;
&lt;br /&gt;
그래서 MFC 예제는 네가 작성한 첫번째 예제와 동일한 수준으로 쓸수 있는 것이 아닐까 생각한다. 길을 열어줘 :) &lt;br /&gt;
--NeoCoin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[NUnit]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;qa22ahj</name></author>
	</entry>
</feed>