1. ì˜ˆì œ 소스 실행법 (Using C++) ¶
- ë¨¼ì € 프로ì �트를 Managed C++ í�´ëž˜ìФ ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¡œ ë§Œë“ ë‹¤.
- Test Fixture ë� í�´ëž˜ìФì�˜ 앞ì—�는 TestFixture, 테스트 함수 앞ì—� Test ì�¸ Attribute 를 ë¶™ì�¸ë‹¤.
- �성 페�지 가서 C/C++로 간다�, #using 참조확��다가 NUnit� 깔린 ��� bin ��를 넣어준다.
- 컴파ì�¼í›„ ì§€ì •ë�œ dll 파ì�¼ì�´ ìƒ�긴다.
- NUnitì�´ 깔린 í�´ë�”ì�˜ bin안ì—� ë³´ë©´ NUnit-gui.exeì�„ 실행한다. 컴파ì�¼í•´ì„œ 나온 dllì�„ ë¡œë”©í•´ì£¼ê³ run하면 테스트들ì�„ 실행해준다.
- ì˜ˆì œëŠ” 아무 ìƒ�ê°�ì—†ì�´ ë§Œë“¤ì—ˆê³ , 테스트 í• í•„ìš”ë�„ 없는 거지만.. 그냥 사용법ì�„ 보는 거니까 ì‹ ê²½ì“°ì§€ 마세요.
// NUnit6.h
#pragma once
#using <nunit.framework.dll>
using namespace System;
using namespace NUnit::Framework;
namespace NUnitSamples
{
[TestFixture]
public __gc class Calculator
{
int a, b;
public:
[SetUp] void Init();
[Test] void Add();
[Test] void Sub();
[Test] void Mul();
[Test] void Div();
};
}
// NUnit6.cpp
#include "stdafx.h"
#include "NUnit6.h"
namespace NUnitSamples {
void Calculator::Init() {
a = 5;
b = 7;
}
void Calculator::Add() {
Assertion::AssertEquals(12, a+b);
}
void Calculator::Sub() {
Assertion::AssertEquals(-2, a-b);
}
void Calculator::Mul() {
Assertion::AssertEquals(35, a*b);
}
void Calculator::Div() {
Assertion::AssertEquals(1.4, a/b);
}
}
2. 사족 ¶
- í—¤ë�”ì—�다 다 구현해ë�„ ë�œë‹¤. 하지만 ê°™ì�€ ì�´ë¦„ì�˜ cpp파ì�¼ì�„ 만들어줘야 하는것같다. 안그러면 Testì—†ë‹¤ê³ ì•ˆë�œë‹¤.
- namespace 귀찮으면 안만들어� �다.
- ê°„ê²° ë²„ì ¼
// NUnit6.h
#pragma once
#using <nunit.framework.dll>
using namespace System;
using namespace NUnit::Framework;
[TestFixture]
public __gc class Calculator
{
int a, b;
public:
[SetUp]
void Calculator::Init() {
a = 5;
b = 7;
}
[Test]
void Calculator::Add() {
Assertion::AssertEquals(12, a+b);
}
[Test]
void Calculator::Sub() {
Assertion::AssertEquals(-2, a-b);
}
[Test]
void Calculator::Mul() {
Assertion::AssertEquals(35, a*b);
}
[Test]
void Calculator::Div() {
Assertion::AssertEquals(1.4, a/b);
}
};
// NUnit6.cpp #include "stdafx.h" #include "NUnit6.h"
3. MFCì—�서 사용하기 ¶
VC++ 7.0� MFC�서 NUnit� �보�. �것보다 좋� 방법� 있�듯한�... �수군� �방법밖�는 만들어내지 못했다.
- ì�¼ë‹¨ MFC 프로ì �트를 ë§Œë“ ë‹¤. ì�´ê²ƒì�„ ë©”ì�¸í”„로ì �트ë�¼ê³ 하ìž�.
- ì „ì²´ 솔루션ì—� Managed C++ Library 프로ì �트를 새로 추가한다. ì�´ê²ƒì�„ 테스트프로ì �트ë�¼ê³ 하ìž�.
- 테스트 프로ì �트ì�˜ ì†�성으로 들어가서 #using 참조ì—� nunit\biní�´ë�”를 넣어준다.
- 테스트 프로ì �트ì�˜ ì†�성으로 들어가서 í�¬í•¨ ë””ë ‰í† ë¦¬ì—� 위ì�˜ ë©”ì�¸í”„로ì �트ì�˜ í�´ë�”를 넣어주ìž�.
- ë©”ì�¸í”„로ì �트ì�˜ ì†�성íƒì—� 가서 Managed C++ Extensionì�„ ì²´í�¬í•´ì¤€ë‹¤.
ë©”ì�¸í”„로ì �트ì—�서 ë§Œë“ ìƒˆ í�´ëž˜ìŠ¤ë¥¼ 테스트 프로ì �트ì—�서 í…ŒìŠ¤íŠ¸í•˜ê³ ì‹¶ë‹¤. 어떻게 í•´ì•¼í• ê¹Œ? 순진한 ì�¸ìˆ˜êµ°ì�€ #include <domain.h> ì�´ë ‡ê²Œ í•˜ê³ , 테스트 í�´ëž˜ìФì—� .hëž‘ .cpp 참조 넣어주면 ë� 줄 알았다. ì�´ê²ƒë•œì—� ì–´ì œë°¤ë¶€í„° 삽질했다. ì�´ë ‡ê²Œë§Œ 하면 안ë�˜ê³ ... 새로 ë§Œë“ í�´ëž˜ìŠ¤ë¥¼ ì�¼ë‹¨ ë³´ìž�.
#pragma once
class CDomain
{
public:
CDomain(void);
~CDomain(void);
int add(int a, int b);
int mult(int a, int b);
};
í�‰ì†ŒëŒ€ë¡œ 하ìž�ë©´ ì�´ë ‡ê²Œ 하면 ë� 것ì�´ë‹¤. 하지만 현재 프로ì �트는 Managed C++ Extensionsì�´ë‹¤. ì�´ê²ƒì�€ C++ì�„ ì�´ìš©í•´ì„œ .Netì�„ Platform위ì—�서 프로그래ë°�ì�„ 하기 위하여 Microsoftì—�서 C++ì�„ 확장한 형태ì�˜ 문법ì�„ ì œì•ˆë�œ 추가 문법ì�„ ì •ì�˜í•´ 놓았다. ì�´ë¥¼ ì�´ìš©í•´ì•¼ NUnitì�´ C++ 코드ì—� ì ‘ê·¼í• ìˆ˜ 있다. ì�´ê²½ìš° NUnit ì—�서 ê²€ì¦�í• í�´ëž˜ìФì—� ì ‘ê·¼í•˜ê¸° 위해 다ì�Œê³¼ ê°™ì�´ í�´ëž˜ìФ 앞ì—� __gc 를 붙여서 ì„ ì–¸í•´ì•¼ 한다.
#pragma once
public __gc class CDomain
{
public:
CDomain(void);
~CDomain(void);
int add(int a, int b);
int mult(int a, int b);
};
__gcì�˜ ê°€ 부여하는 ëŠ¥ë ¥ê³¼ ì œì•½ 사í•ì—� 대해서는 __gc ì�„ ì°¸ê³ í•˜ìž�. NUnit ìƒ�ì—�서 테스트ì�˜ 대ìƒ� í�´ëž˜ìŠ¤ëŠ” 무조건 í�¬ì�¸í„°í˜•으로 ì ‘ê·¼í• ìˆ˜ 있다. ì�´ì œ 테스트 í�´ëž˜ìФì�˜ ë‚´ìš©ì�„ ë³´ìž�.
// TestCase.h
#pragma once
#using <nunit.framework.dll>
using namespace System;
using namespace NUnit::Framework;
#include "Domain.h" // í�¬í•¨ ë””ë ‰í† ë¦¬ì—� ë©”ì�¸í”„로ì �트ì�˜ í�´ë�”를 넣어놨으므로 가능
namespace TestCase
{
[TestFixture]
public __gc class Class1
{
private:
CDomain* m_pD; // Only Pointer
public:
[SetUp]
void init() {
m_pD = new CDomain; // delete 필요없다.
}
[Test]
void testAdd() {
Assertion::AssertEquals(7, m_pD->add(3,4));
}
[Test]
void testMult() {
Assertion::AssertEquals(12, m_pD->mult(3,4));
}
};
}
ì�´ë ‡ê²Œ 해주면 ë�œë‹¤. ì�´ê±° 알아내ëŠ�ë�¼ ì—„ì² ì‚½ì§ˆí–ˆë‹¤. 그런 ì�˜ë¯¸ë¡œ... NUnit ë§Žì�´ ì• ìš©í•´ 달ë�¼. 혹시나 ë�” ê°„ë‹¨í•˜ê³ ì¢‹ì�€ 방법 있으면 ì˜¬ë ¤ 주세요.ì�´ 경우 Unmanaged C++ 코드ì—� 대해서 ì �ìš©í• ìˆ˜ 없다. 즉, MFC로 완성ë�œ 프로그램ì�´ë�¼ë�„, .Net Platform ì�´ 없는 ê³³ì—�서는 ìž‘ë�™í• 수 없다. (로ì§�ì—� __gc ê°€ 존재하므로)
류ìƒ�민ì�€ NUnit ê³¼ Unmanged C++ì�˜ ì—°ê²°ì�„ ì™„ì „í•˜ê²ŒëŠ” 하지 못했다. Managed C++프로ì �트와 Unmanged C++ 프로ì �트 ë‘�개를 만들어 Managed C++ 코드ì—�서 NUnit ì�„ ì�´ìš©í•´ Unmanaged C++ ì—� ì ‘ê·¼í•´ 테스트 코드를 작성했다. 하지만, .Net Platformì—� 미숙과, Managed C++ Extensionì�˜ 몰ì�´í•´, 프로ì �트 관리와 ì�˜ì¡´ì„± ë¬¸ì œì—� 봉착해 ê³§ ë²½ì—� 부딪쳤다. ì�´ 둘ì�€ í˜¼ìš©í• ìˆ˜ ì—†ì�Œì�„ 알았다.
Unmanaged C++ì—�서 가장 좋왔ë�˜ 방법ì�€ Unmanaged C++ Project ë‘�개를 만들어서, 한쪽으로 ì�˜ì¡´ì‹œí‚¨í›„ assert 를 ì�´ìš©í•´ ìž�ì²´ì �ì�¸ Test Framework ì�„ 작성해서 사용하는 방법ì�´ì—ˆë‹¤.
--NeoCoin
--NeoCoin
ì•„.. gc를 ì“°ë©´ ë‹·ë„· 플랫í�¼ì—†ëŠ” ê³³ì—�서는 쓸 수가 ì—†ê² ë„¤ìš”. 그러면 ì�´ë°©ë²•ì�€ 어떤가요? ì�¼ë‹¨ í…ŒìŠ¤íŠ¸í• ë•ŒëŠ” í…ŒìŠ¤íŠ¸í• í�´ëž˜ìФì—� __gc를 ë¶™ì�´ìž–ì•„ìš”? 나중ì—� ë°°í�¬í• 때는 __gc를 ì—†ì• ëŠ” ê²�니다. ë¬¼ë¡ Managed C++ Extensionsì�˜ 문법ì�„ ì“°ë©´ 안ë�˜ê² ì£ .(gcë¹¼ê³ ) 매í�¬ë¡œë¥¼ 잘 ì“°ë©´ 어떻게 ë� ê±° 같기ë�„ 한ë�°... --ì�¸ìˆ˜
현재는 Managed C++ì—� 깊히 공부해 ë³´ì§€ 않아서, 잘 ëª¨ë¥´ê² ë‹¤. ì�´ê²ƒì�´ __gc를 붙였다 때었다 하는 ë¬¸ì œì�¸ì§€ í™•ì‹ í• ìˆ˜ê°€ 없다.
그것ì�„ ë– ë‚˜ì„œ, MFC를 쓰면서 테스트를 하는 것ì�´ ì�˜ë¯¸ 있어 ì§€ë ¤ë©´, MFC 로 작성한 프로그램ì�´ ì •ìƒ� ë�™ìž‘하면서, 테스트를 í• ìˆ˜ 있어야 하는ë�°, MFC Frameworks ì�´ Managed C++ 모드로 컴파ì�¼ì�´ 잘ë�˜ê³ , 잘 ë�Œì•„가는지, ì�´ê²ƒì�´ ì�˜ë¬¸ì�´ë‹¤. ë�œë‹¤ë©´, MSì—�서 ëª¨ë“ MFC class앞ì—� __gcê°€ ë¶™ì�´ê¸°ë�¼ë�„ 한걸까? 혹ì�€ ì�´ë¯¸ 해당 매í�¬ë¡œê°€ 존재하지 않ì�„까?
그래서 MFC ì˜ˆì œëŠ” 네가 작성한 첫번째 ì˜ˆì œì™€ ë�™ì�¼í•œ 수준으로 쓸수 있는 것ì�´ ì•„ë‹�까 ìƒ�ê°�한다. 길ì�„ 열어줘
--NeoCoin
--NeoCoin










