<?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=GuiTestingWithMfc</id>
	<title>GuiTestingWithMfc - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=GuiTestingWithMfc"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=GuiTestingWithMfc&amp;action=history"/>
	<updated>2026-05-15T06:20:00Z</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=GuiTestingWithMfc&amp;diff=32022&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=GuiTestingWithMfc&amp;diff=32022&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:20Z</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;CppUnit 을 이용한 MFC 에서의 GuiTesting (시도중. 결과는?)&lt;br /&gt;
&lt;br /&gt;
=== Dialog Based 에서의 테스트 ===&lt;br /&gt;
Dialog Based 의 경우 Modal Dialog 를 이용하게 된다. 이 경우 Dialog 내에서만 메세지루프가 작동하게 되므로, DoModal 함수로 다이얼로그를 띄운 이후의 코드는 해당 Dialog 가 닫히기 전까지는 실행되지 않는다. 고로, CppUnit 에서의 fixture 를 미리 구성하여 쓸 수 없다.&lt;br /&gt;
&lt;br /&gt;
그래서, 테스트를 시도할때 Modaless Dialog 로 만들고 실험을 하였다.&lt;br /&gt;
&lt;br /&gt;
http://zeropage.org/pub/GuiTesting/GuiTest1.gif&lt;br /&gt;
&lt;br /&gt;
원하는 작동 모습은 이렇다.&lt;br /&gt;
# Editbox 에 아무 글을 넣고&lt;br /&gt;
# Add 버튼을 누르면&lt;br /&gt;
# List box 에 Editbox 에 쓴 글이 순서대로 처음부터 채워지고&lt;br /&gt;
# List box 에서의 커서는 채워진 글에 위치한다.&lt;br /&gt;
# List box 에 값이 채워지고 난 뒤, Editbox 의 글은 지워진다.&lt;br /&gt;
&lt;br /&gt;
=== 1. GUI Runner Setting ===&lt;br /&gt;
이는 App 클래스의 InitInstance 함수에서 해준다.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;GuiTestingOne.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;GuiTestingOneDlg.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;cppunit\ui\mfc\TestRunner.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;GuiTestCase.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #ifdef _DEBUG&lt;br /&gt;
 #define new DEBUG_NEW&lt;br /&gt;
 #undef THIS_FILE&lt;br /&gt;
 static char THIS_FILE[] = __FILE__;&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 BEGIN_MESSAGE_MAP(CGuiTestingOneApp, CWinApp)&lt;br /&gt;
 	//{{AFX_MSG_MAP(CGuiTestingOneApp)&lt;br /&gt;
 		// NOTE - the ClassWizard will add and remove mapping macros here.&lt;br /&gt;
 		//    DO NOT EDIT what you see in these blocks of generated code!&lt;br /&gt;
 	//}}AFX_MSG&lt;br /&gt;
 	ON_COMMAND(ID_HELP, CWinApp::OnHelp)&lt;br /&gt;
 END_MESSAGE_MAP()&lt;br /&gt;
 &lt;br /&gt;
 CGuiTestingOneApp::CGuiTestingOneApp()&lt;br /&gt;
 {&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 CGuiTestingOneApp theApp;&lt;br /&gt;
 &lt;br /&gt;
 BOOL CGuiTestingOneApp::InitInstance()&lt;br /&gt;
 {&lt;br /&gt;
 	AfxEnableControlContainer();&lt;br /&gt;
 &lt;br /&gt;
 	CppUnit::MfcUi::TestRunner runner;&lt;br /&gt;
 	runner.addTest (GuiTestCase::suite());&lt;br /&gt;
 	runner.run();&lt;br /&gt;
 &lt;br /&gt;
 /* --- Test Runner 만 실행되도록, 다이얼로그 띄우는 부분을 일단 막아둔다. 마지막에 실행할때 이 부분의 주석처리 된 부분을 풀어주면 된다.&lt;br /&gt;
 #ifdef _AFXDLL&lt;br /&gt;
 	Enable3dControls();			// Call this when using MFC in a shared DLL&lt;br /&gt;
 #else&lt;br /&gt;
 	Enable3dControlsStatic();	// Call this when linking to MFC statically&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 	CGuiTestingOneDlg dlg;&lt;br /&gt;
 	m_pMainWnd = &amp;amp;amp;dlg;&lt;br /&gt;
 	int nResponse = dlg.DoModal();&lt;br /&gt;
 	if (nResponse == IDOK)&lt;br /&gt;
 	{&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (nResponse == IDCANCEL)&lt;br /&gt;
 	{&lt;br /&gt;
 	}&lt;br /&gt;
 */&lt;br /&gt;
 	return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== 2. Test Case 의 작성 ===&lt;br /&gt;
&lt;br /&gt;
==== 1. 연습 ====&lt;br /&gt;
일단, 제대로 작동하는지 알아보기 위해 연습겸 m_bFlag 변수를 만들어서 테스트를 했다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 테스트&lt;br /&gt;
| 통과시 예상되는 결과&lt;br /&gt;
|-&lt;br /&gt;
| test1One&lt;br /&gt;
| 연습겸 Assert Equals. 10 == 10&lt;br /&gt;
|-&lt;br /&gt;
| test2GuiOne&lt;br /&gt;
| 버튼이 눌러졌을 경우에 CGuiTestingOneDlg::m_bFlag 가 true 상태가 된다.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 #include &amp;amp;lt;cppunit/TestCase.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;cppunit/Extensions/HelperMacros.h&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;stdafx.h&amp;quot;                                  // resource, mfc 를 이용할 수 있다.&lt;br /&gt;
 #include &amp;quot;GuiTestingOneDlg.h&amp;quot;                        // import GuiTestingOneDlg &lt;br /&gt;
 &lt;br /&gt;
 class GuiTestCase : public CppUnit::TestCase {&lt;br /&gt;
 	CPPUNIT_TEST_SUITE(GuiTestCase);&lt;br /&gt;
 	CPPUNIT_TEST ( test1One );&lt;br /&gt;
 	CPPUNIT_TEST ( test2GuiOne );&lt;br /&gt;
 	CPPUNIT_TEST ( test3ListAdd );&lt;br /&gt;
 	CPPUNIT_TEST_SUITE_END();&lt;br /&gt;
 &lt;br /&gt;
 public:&lt;br /&gt;
 	CGuiTestingOneDlg* pDlg;&lt;br /&gt;
 	void setUp () {&lt;br /&gt;
 		pDlg = new CGuiTestingOneDlg();&lt;br /&gt;
 		pDlg-&amp;amp;gt;Create(IDD_GUITESTINGONE_DIALOG);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void tearDown () {&lt;br /&gt;
 		delete pDlg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 public:&lt;br /&gt;
 	void test1One () {&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (10, 10);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void test2GuiOne () {&lt;br /&gt;
 &lt;br /&gt;
 		pDlg-&amp;amp;gt;OnButtonadd();&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (true, pDlg-&amp;amp;gt;m_bFlag);&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
코드 추가&lt;br /&gt;
 void CGuiTestingOneDlg::OnButtonadd() &lt;br /&gt;
 {&lt;br /&gt;
 	// TODO: Add your control notification handler code here&lt;br /&gt;
 	m_bFlag = true;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 2. 텍스트 추가 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 테스트&lt;br /&gt;
| 통과시 예상되는 결과&lt;br /&gt;
|-&lt;br /&gt;
| test1One&lt;br /&gt;
| 연습겸 Assert Equals. 10 == 10&lt;br /&gt;
|-&lt;br /&gt;
| test2GuiOne&lt;br /&gt;
| 버튼이 눌러졌을 경우에 CGuiTestingOneDlg::m_bFlag 가 true 상태가 된다.&lt;br /&gt;
|-&lt;br /&gt;
| test3ListAdd&lt;br /&gt;
| Editbox 에 &amp;quot;Testing...&amp;quot; 을 셋팅. 버튼을 눌렀을 때 Listbox 의 item 갯수가 1개임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| .&lt;br /&gt;
| Listbox 의 첫번째 item 의 스트링이 &amp;quot;Testing...&amp;quot; 임을 확인&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 	void test3ListAdd () {&lt;br /&gt;
 		pDlg-&amp;amp;gt;m_ctlEdit.SetWindowText(&amp;quot;Testing...&amp;quot;);&lt;br /&gt;
 		pDlg-&amp;amp;gt;OnButtonadd();&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (1, pDlg-&amp;amp;gt;m_ctlList.GetCount());&lt;br /&gt;
 		CString str;&lt;br /&gt;
 &lt;br /&gt;
 		pDlg-&amp;amp;gt;m_ctlList.GetText(0, str);&lt;br /&gt;
 		CPPUNIT_ASSERT ( isSameString(str, &amp;quot;Testing...&amp;quot;));&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	bool isSameString (CString&amp;amp;amp; str1, PSTR str2) {&lt;br /&gt;
 		return str1.Compare(str2) == 0;&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
코드 추가&lt;br /&gt;
 void CGuiTestingOneDlg::OnButtonadd() &lt;br /&gt;
 {&lt;br /&gt;
 	// TODO: Add your control notification handler code here&lt;br /&gt;
 	m_bFlag = true;&lt;br /&gt;
 	CString str;&lt;br /&gt;
 	m_ctlEdit.GetWindowText(str);&lt;br /&gt;
 	m_ctlList.AddString(str);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 3. more... ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 테스트&lt;br /&gt;
| 통과시 예상되는 결과&lt;br /&gt;
|-&lt;br /&gt;
| test1One&lt;br /&gt;
| 연습겸 Assert Equals. 10 == 10&lt;br /&gt;
|-&lt;br /&gt;
| test2GuiOne&lt;br /&gt;
| 버튼이 눌러졌을 경우에 CGuiTestingOneDlg::m_bFlag 가 true 상태가 된다.&lt;br /&gt;
|-&lt;br /&gt;
| test3ListAdd&lt;br /&gt;
| Editbox 에 &amp;quot;Testing...&amp;quot; 을 셋팅. 버튼을 눌렀을 때 Listbox 의 item 갯수가 1개임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| .&lt;br /&gt;
| Listbox 의 첫번째 item 의 문자열이 &amp;quot;Testing...&amp;quot; 임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| test4ListAddMore&lt;br /&gt;
| test3 에 추가된 형태. Editbox 에 다시 &amp;quot;Testing2...&amp;quot; 를 셋팅하고, 버튼을 눌렀을 때 Listbox 의 item 갯수가 2개임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| .&lt;br /&gt;
| Listbox 의 두번째 item 의 문자열이 &amp;quot;Testing2...&amp;quot; 임을 확인&lt;br /&gt;
|}&lt;br /&gt;
 	void test4ListAddMore () {&lt;br /&gt;
 		test3ListAdd();&lt;br /&gt;
 		CString str;&lt;br /&gt;
 &lt;br /&gt;
 		pDlg-&amp;amp;gt;m_ctlEdit.SetWindowText(&amp;quot;Testing2...&amp;quot;);&lt;br /&gt;
 		pDlg-&amp;amp;gt;OnButtonadd();&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL (2, pDlg-&amp;amp;gt;m_ctlList.GetCount());&lt;br /&gt;
 		pDlg-&amp;amp;gt;m_ctlList.GetText(1, str);&lt;br /&gt;
 		CPPUNIT_ASSERT ( isSameString(str, &amp;quot;Testing2...&amp;quot;));&lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
====  4. &amp;#039;List box 에서의 커서는 채워진 글에 위치한다&amp;#039; 에 대한 테스트 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 테스트&lt;br /&gt;
| 통과시 예상되는 결과&lt;br /&gt;
|-&lt;br /&gt;
| test1One&lt;br /&gt;
| 연습겸 Assert Equals. 10 == 10&lt;br /&gt;
|-&lt;br /&gt;
| test2GuiOne&lt;br /&gt;
| 버튼이 눌러졌을 경우에 CGuiTestingOneDlg::m_bFlag 가 true 상태가 된다.&lt;br /&gt;
|-&lt;br /&gt;
| test3ListAdd&lt;br /&gt;
| Editbox 에 &amp;quot;Testing...&amp;quot; 을 셋팅. 버튼을 눌렀을 때 Listbox 의 item 갯수가 1개임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| .&lt;br /&gt;
| Listbox 의 첫번째 item 의 문자열이 &amp;quot;Testing...&amp;quot; 임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| test4ListAddMore&lt;br /&gt;
| test3 에 추가된 형태. Editbox 에 다시 &amp;quot;Testing2...&amp;quot; 를 셋팅하고, 버튼을 눌렀을 때 Listbox 의 item 갯수가 2개임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| .&lt;br /&gt;
| Listbox 의 두번째 item 의 문자열이 &amp;quot;Testing2...&amp;quot; 임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| test5ListCursorOne&lt;br /&gt;
| test3 진행시 선택된 Item 이 0 번째 임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| test6ListCursorTwo&lt;br /&gt;
| test4 진행시 선택된 Item 이 1 번째 임을 확인&lt;br /&gt;
|}&lt;br /&gt;
 	void test5ListCursorOne () {&lt;br /&gt;
 		test3ListAdd();&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(0, pDlg-&amp;amp;gt;m_ctlList.GetCurSel());&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	void test6ListCursorTwo () {&lt;br /&gt;
 		test4ListAddMore();&lt;br /&gt;
 		CPPUNIT_ASSERT_EQUAL(1, pDlg-&amp;amp;gt;m_ctlList.GetCurSel());&lt;br /&gt;
 	}&lt;br /&gt;
http://zeropage.org/pub/GuiTesting/GuiTestFail.gif&lt;br /&gt;
&lt;br /&gt;
코드 추가&lt;br /&gt;
 void CGuiTestingOneDlg::OnButtonadd() &lt;br /&gt;
 {&lt;br /&gt;
 	// TODO: Add your control notification handler code here&lt;br /&gt;
 	CString str;&lt;br /&gt;
 	m_ctlEdit.GetWindowText(str);&lt;br /&gt;
 	m_ctlList.AddString(str);&lt;br /&gt;
 	m_ctlList.SetCurSel(m_ctlList.GetCount()-1);&lt;br /&gt;
 	m_bFlag = true;&lt;br /&gt;
 }&lt;br /&gt;
http://zeropage.org/pub/GuiTesting/GuiTestOk.gif&lt;br /&gt;
&lt;br /&gt;
==== 5. edit box 의 내용이 데이터 추가후 초기화 되는지 확인 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 테스트&lt;br /&gt;
| 통과시 예상되는 결과&lt;br /&gt;
|-&lt;br /&gt;
| test1One&lt;br /&gt;
| 연습겸 Assert Equals. 10 == 10&lt;br /&gt;
|-&lt;br /&gt;
| test2GuiOne&lt;br /&gt;
| 버튼이 눌러졌을 경우에 CGuiTestingOneDlg::m_bFlag 가 true 상태가 된다.&lt;br /&gt;
|-&lt;br /&gt;
| test3ListAdd&lt;br /&gt;
| Editbox 에 &amp;quot;Testing...&amp;quot; 을 셋팅. 버튼을 눌렀을 때 Listbox 의 item 갯수가 1개임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| .&lt;br /&gt;
| Listbox 의 첫번째 item 의 문자열이 &amp;quot;Testing...&amp;quot; 임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| test4ListAddMore&lt;br /&gt;
| test3 에 추가된 형태. Editbox 에 다시 &amp;quot;Testing2...&amp;quot; 를 셋팅하고, 버튼을 눌렀을 때 Listbox 의 item 갯수가 2개임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| .&lt;br /&gt;
| Listbox 의 두번째 item 의 문자열이 &amp;quot;Testing2...&amp;quot; 임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| test5ListCursorOne&lt;br /&gt;
| test3 진행시 선택된 Item 이 0 번째 임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| test6ListCursorTwo&lt;br /&gt;
| test4 진행시 선택된 Item 이 1 번째 임을 확인&lt;br /&gt;
|-&lt;br /&gt;
| test7EmptyEditbox&lt;br /&gt;
| test3 진행시 Editbox 의 스트링이 비었는지 확인&lt;br /&gt;
|}&lt;br /&gt;
 	void test7EmptyEditbox () {&lt;br /&gt;
 		test3ListAdd();&lt;br /&gt;
 		CString str;&lt;br /&gt;
 &lt;br /&gt;
 		pDlg-&amp;amp;gt;m_ctlEdit.GetWindowText(str);&lt;br /&gt;
 		CPPUNIT_ASSERT (str.IsEmpty());&lt;br /&gt;
 	}&lt;br /&gt;
&lt;br /&gt;
코드 추가&lt;br /&gt;
 void CGuiTestingOneDlg::OnButtonadd() &lt;br /&gt;
 {&lt;br /&gt;
 	// TODO: Add your control notification handler code here&lt;br /&gt;
 	CString str;&lt;br /&gt;
 	m_ctlEdit.GetWindowText(str);&lt;br /&gt;
 	m_ctlList.AddString(str);&lt;br /&gt;
 	m_ctlList.SetCurSel(m_ctlList.GetCount()-1);&lt;br /&gt;
 	m_ctlEdit.SetWindowText(&amp;quot;&amp;quot;);&lt;br /&gt;
 	m_bFlag = true;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
여기까지로 생각해놓은 테스트들이 전부 완료. 앞에 InitInstance 에 써 넣은 주석을 풀고, 실제로 실행해보자.&lt;br /&gt;
 BOOL CGuiTestingOneApp::InitInstance()&lt;br /&gt;
 {&lt;br /&gt;
 	AfxEnableControlContainer();&lt;br /&gt;
 &lt;br /&gt;
 	CppUnit::MfcUi::TestRunner runner;&lt;br /&gt;
 	runner.addTest (GuiTestCase::suite());&lt;br /&gt;
 	runner.run();&lt;br /&gt;
 &lt;br /&gt;
 #ifdef _AFXDLL&lt;br /&gt;
 	Enable3dControls();			// Call this when using MFC in a shared DLL&lt;br /&gt;
 #else&lt;br /&gt;
 	Enable3dControlsStatic();	// Call this when linking to MFC statically&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 	CGuiTestingOneDlg dlg;&lt;br /&gt;
 	m_pMainWnd = &amp;amp;amp;dlg;&lt;br /&gt;
 	int nResponse = dlg.DoModal();&lt;br /&gt;
 	if (nResponse == IDOK)&lt;br /&gt;
 	{&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (nResponse == IDCANCEL)&lt;br /&gt;
 	{&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	return FALSE;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
http://zeropage.org/pub/GuiTesting/result.gif&lt;br /&gt;
&lt;br /&gt;
=== 문제점 ===&lt;br /&gt;
* 모달리스 다이얼로그인 관계로, 테스트를 run 으로 실행할 때 마다 Dialog 가 켜졌다 꺼졌다 한다. 이에 따른 속도의 지연의 문제. -&amp;gt; CDialog::ShowWindow(SH_HIDE); 로 해결 가능&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[GuiTesting]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>