굉장히 하찮아보이는 메서드 중에 하나인 .ToString() 메서드는, 사실 NUnit에서 굉장히 중요한 역할을 해냅니다. 바로 NUnit GUI를 좀 더 편리하게 쓰는 비법이 여기에 숨어 있습니다. (Java에서도 비슷한 일을 해낼 수 있을 것입니다.)

NUnit GUI는 어셈블리 코드를 호스팅하는 일반 프로세스이기때문에 표준 출력의 내용을 가져올 수 있습니다. 이 점을 효과적으로 활용하려면 Console.WriteLine / Console.Write 메서드의 특성을 잘 알아야 하는데, 지금 말한 두 개의 메서드는 Object 형식을 받으면 자동으로 ToString() 메서드를 호출하여 출력할 내용을 결정합니다.

ToString() 메서드를 구현하면서 사용하면 효과적인 클래스도 있습니다. 바로 StringBuilder 클래스입니다. 표현해야 할 정보가 많아서 문자열이 길어진다고 생각되면 그저 String을 더하기만 하지 말고 StringBuilder를 이용하는 것이 좋습니다. 특히, 이진 데이터의 표현이 필요하다면 StringBuilder는 필수입니다!

만약 이진 데이터를 NUnit GUI를 통하여 출력하길 원한다면 ToString() 메서드를 잘 구현하도록 합니다. 이진 데이터를 프레젠테이션하는 방법은 Programming Windows with C# (Charles Petzold 저, Microsoft Press)의 OLE 관련 Chapter에 서술되어있으며 Code Project나 Code Guru에서 찾으셔도 좋습니다.

ToString() 메서드의 구현이 잘 되었다면 테스트 루틴 안에서 Console.WriteLine 이나 Console.Write 메서드를 호출하여 테스트도중 변경되는 변수의 내용이나 데이터, 객체의 내용을 조사할 수 있게됩니다.

보너스 하나 더: ToString() 메서드를 잘 구현해두면 디버거에서도 그 역할을 톡톡히 다 해냅니다. 디버거는 요약 정보를 표현하기 위하여 마찬가지로 ToString() 메서드를 이용합니다. :-)
Creative Commons License
Creative Commons License
남정현 이 작성.

당신의 의견을 작성해 주세요.

[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다

NUnit을 좀 더 일반적으로 사용하기 위해서 꼭 짚고 넘어가야 할 부분이 하나 있습니다. 바로 NUnit GUI와 Windows Forms의 ActiveX Interop 기능 사이의 충돌입니다. 그저 다음처럼 코드를 작성하고 테스트를 실행하게 되면 "빨간 막대"를 만납니다.

[CODE]
[Test]
public void Test()
{
  Form f = new Form();
  f.Controls.Add(new WebBrowser());
  f.ShowDialog();
}
[/CODE]

NUnit GUI는, 아직 자세히 살펴보지는 않았지만, 모든 실행 루틴을 다중 스레드에 의하여 실행하는 것처럼 보입니다. 위와 같은 테스트 코드는 빨간 막대를 만나지만 결코 의미있는 빨간 막대가 될 수 없습니다. 왜냐면, 아무런 진행이 되지 않기 때문이죠. 구체적으로, 위와 같은 코드를 NUnit GUI 상에서 실행하게되면, ActiveX 컨트롤의 인스턴스를 스레드 모델 규정에 따르자면 만들 수 없다는 이야기를 하게 됩니다. 그러면, 방법이 없는걸까요? 아닙니다! 아래 코드는 .NET Framework 2.0을 기준으로 설명하는 것입니다.

[CODE]
[Test]
public void Test()
{
  Thread t = new Thread(delegate (object o)
  {
       Form f = new Form();
       f.Load += new new EventHandler(m_oTestForm_Load);
       Application.Run(f);
  }

  t.TrySetApartmentState(ApartmentState.STA);
  t.Start(null);
  t.Join();
}

private void m_oTestForm_Load(object sender, EventArgs e)
{
  Form f = (Form)sender;
  f.Controls.Add(new WebBrowser());
}
[/CODE]

이처럼 코드를 고치면 Windows Forms의 스레드는 NUnit GUI의 스레드가 아닌 새로운 스레드에서 인스턴스를 만들게 되며, 이 때 만난 새로운 스레드는 STA 모드이므로 Windows Forms를 비롯하여 Web Browser 컨트롤이 정상적으로 생성될 수 있는 환경이 됩니다. 그리고 NUnit GUI가 실행하게될 테스트 메서드의 마지막에 위치한 Join 메서드로 폼이 닫히기 전까지 테스트를 동결시킬 수 있습니다. 만약, 동결이 필요하지 않다면 Join 메서드를 사용하지 않으면 되겠지요. :-)

Creative Commons License
Creative Commons License
남정현 이 작성.

당신의 의견을 작성해 주세요.

[로그인][오픈아이디란?]
오픈아이디로만 댓글을 남길 수 있습니다