문제

대규모 MFC UI 애플리케이션을 어떻게 단위 테스트합니까?

우리는 수년 동안 개발해온 몇 가지 대규모 MFC 애플리케이션을 보유하고 있으며 일부 표준 자동화 QA 도구를 사용하여 기본 스크립트를 실행하여 기본 사항, 파일 열기 등을 확인합니다.이는 일일 빌드를 게시하는 QA 그룹에 의해 실행됩니다.

그러나 우리는 개별 개발자가 일일 빌드에 코드를 제출하기 전에 애플리케이션의 대화 상자, 메뉴 및 기타 시각적 요소에 대해 테스트를 빌드하고 실행할 수 있는 절차를 도입하고 싶습니다.

디버그 빌드에만 나타나는 대화 상자의 숨겨진 테스트 버튼과 같은 기술에 대해 들었습니다. 이에 대한 표준 툴킷이 있습니까?

환경은 C++/C/FORTRAN, MSVC 2005, Intel FORTRAN 9.1, Windows XP/Vista x86 & x64입니다.

도움이 되었습니까?

해결책

앱이 어떻게 구성되어 있는지에 따라 다릅니다.로직과 GUI 코드가 분리된 경우(MVC) 로직 테스트가 쉽습니다.마이클 페더스(Michael Feathers)를 살펴보세요 "겸손한 대화 상자" (PDF).

편집하다:당신이 그것에 대해 생각한다면 :앱이 그런 식으로 구성되어 있지 않으면 매우 신중하게 리팩터링해야 합니다.논리를 테스트하는 다른 기술은 없습니다.클릭을 시뮬레이트하는 스크립트는 단지 수박 겉핥기 수준일 뿐입니다.

실제로는 매우 쉽습니다.

사용자가 버튼을 클릭할 때 컨트롤/창/무엇이든 목록 상자의 내용을 변경하고 클릭 후 목록 상자에 올바른 내용이 포함되어 있는지 확인하려고 한다고 가정합니다.

  1. 목록 상자에 표시할 항목이 포함된 별도의 목록이 있도록 리팩터링합니다.항목은 목록에 저장되며 데이터의 출처가 어디든 추출되지 않습니다.목록 상자 목록을 만드는 코드는 새 목록에 대해서만 알고 있습니다.
  2. 그런 다음 논리 코드를 포함할 새 컨트롤러 개체를 만듭니다.버튼 클릭을 처리하는 메서드는 mycontroller->ButtonWasClicked()만 호출합니다.목록 상자나 다른 것에 대해서는 알지 못합니다.
  3. MyController::ButtonWasClicked()는 의도한 논리에 대해 수행해야 할 작업을 수행하고 항목 목록을 준비하며 컨트롤에 업데이트를 지시합니다.이것이 작동하려면 컨트롤에 대한 인터페이스(순수 가상 클래스)를 생성하여 컨트롤러와 컨트롤을 분리해야 합니다.컨트롤러는 컨트롤이 아닌 해당 유형의 개체만 알고 있습니다.

그게 다야.컨트롤러에는 논리 코드가 포함되어 있으며 인터페이스를 통해서만 제어를 알 수 있습니다.이제 컨트롤을 조롱하여 MyController::ButtonWasClicked()에 대한 일반 단위 테스트를 작성할 수 있습니다.내가 무슨 말을 하는지 모르겠다면 Michaels의 기사를 읽어보세요.두 배.그리고 그 후에 다시.
(자신에게 메모:그렇게 많이 떠들지 않는 법을 배워야 해)

다른 팁

MFC를 언급하셨기 때문에 자동화된 테스트 환경에서 사용하기 어려운 애플리케이션이 있다고 가정했습니다.코드를 작성하면서 테스트를 빌드하면 단위 테스트 프레임워크의 최고의 이점을 확인할 수 있습니다.하지만 테스트 가능하도록 설계되지 않은 애플리케이션에 테스트 기반 방식으로 새로운 기능을 추가하려고 합니다.힘든 일이고 매우 실망스러울 수 있습니다.

이제 내가 제안하려는 것은 확실히 힘든 일..그러나 어느 정도의 규율과 인내가 있다면 곧 그 효과를 보게 될 것입니다.

  • 먼저 새로운 수정 사항이 조금 더 오래 걸리려면 관리 지원이 필요합니다.모두가 이유를 이해했는지 확인하세요.
  • 다음으로 사본을 구입하세요. 웰크 도서.시간이 있거나 급할 경우 색인을 스캔하여 앱에서 나타나는 증상을 찾아보세요.이 책에는 좋은 조언이 많이 포함되어 있으며 기존 코드를 테스트 가능하게 만들려고 할 때 꼭 필요한 것입니다.alt text
  • 그런 다음 새로운 수정/변경이 있을 때마다 시간을 들여 작업할 영역을 이해하십시오.현재 동작을 연습하려면 원하는 xUnit 변형(무료로 사용 가능)으로 몇 가지 테스트를 작성하세요.
  • 모든 테스트가 통과하는지 확인하세요.필요한 동작이나 버그를 실행하는 새로운 테스트를 작성하세요.
  • 이 마지막 테스트를 통과하는 코드를 작성하세요.
  • 디자인을 개선하기 위해 테스트 중인 영역 내에서 무자비하게 리팩토링하세요.
  • 여기부터 시스템에 적용해야 하는 모든 새로운 변경 사항에 대해 반복합니다.이 규칙에는 예외가 없습니다.
  • 지금 약속의 땅:머지않아 잘 테스트된 코드의 섬이 점점 더 많이 표면화되기 시작할 것입니다.점점 더 많은 코드가 자동화된 테스트 제품군에 속하게 되며 변경이 점점 더 쉬워질 것입니다.그 이유는 기본 디자인이 천천히 그리고 확실하게 테스트 가능해지기 때문입니다.

쉬운 방법은 이전 답변이었습니다.이것은 어렵지만 올바른 탈출구입니다.

나는 이것이 오래된 질문이라는 것을 알고 있지만 여전히 MFC로 작업하는 우리에게는 VS2012의 Microsoft C++ 단위 테스트 프레임워크가 잘 작동합니다.

일반 절차:

  1. MFC 프로젝트를 정적 라이브러리로 컴파일
  2. 솔루션에 새 기본 단위 테스트 프로젝트를 추가합니다.
  3. 테스트 프로젝트에서 MFC 프로젝트를 참조로 추가합니다.
  4. 테스트 프로젝트의 구성 속성에서 헤더 파일에 대한 포함 디렉터리를 추가합니다.
  5. 링커에서 입력 옵션은 MFC.lib;nafxcwd.lib;libcmtd.lib를 추가합니다.
  6. '특정 기본 라이브러리 무시' 아래에 nafxcwd.lib;libcmtd.lib를 추가합니다.
  7. 일반에서 MFC에서 내보낸 lib 파일의 위치를 ​​추가합니다.

그만큼 https://stackoverflow.com/questions/1146338/error-lnk2005-new-and-delete-already-define-in-libcmtd-libnew-obj nafxcwd.lib 및 libcmtd.lib가 필요한 이유에 대한 좋은 설명이 있습니다.

레거시 프로젝트에서 확인해야 할 또 다른 중요한 사항입니다.일반 구성 속성에서 두 프로젝트가 동일한 '문자 세트'를 사용하고 있는지 확인하세요.MFC가 멀티바이트 문자 세트를 사용하는 경우 MS 테스트도 필요합니다.

완벽하지는 않지만 제가 찾은 최고는 AutoIt입니다. http://www.autoitscript.com/autoit3

"AutoIt v3은 Windows GUI 및 일반 스크립팅을 자동화하도록 설계된 프리웨어 BASIC과 유사한 스크립팅 언어입니다.다른 언어에서는 불가능하거나 신뢰할 수 없는 방식으로 작업을 자동화하기 위해 시뮬레이션된 키 입력, 마우스 이동 및 창/컨트롤 조작의 조합을 사용합니다(예:VBScript 및 SendKeys).AutoIt은 또한 매우 작고 독립적이며 성가신 "런타임"이 필요 없이 기본적으로 모든 버전의 Windows에서 실행됩니다!"

이는 구동하려는 컨트롤의 리소스 ID 번호를 사용할 수 있기 때문에 구동 중인 애플리케이션의 소스 코드에 액세스할 수 있을 때 잘 작동합니다.이런 방식으로 특정 픽셀에 대한 시뮬레이션된 마우스 클릭에 대해 걱정할 필요가 없습니다.불행하게도 레거시 애플리케이션에서는 리소스 ID가 고유하지 않아 문제가 발생할 수 있다는 사실을 발견할 수 있습니다.하지만.ID를 고유하게 변경하고 다시 빌드하는 것은 매우 간단합니다.

또 다른 문제는 타이밍 문제가 발생한다는 것입니다.나는 이것에 대해 시도되고 진정한 해결책을 갖고 있지 않습니다.시행착오를 사용해 본 적이 있지만 분명히 확장 가능하지 않습니다.문제는 AutoIT 스크립트가 다음 명령을 실행하거나 올바른 응답을 확인하기 전에 테스트 응용 프로그램이 명령에 응답할 때까지 기다려야 한다는 것입니다.때로는 기다리고 시청할 편리한 이벤트를 찾는 것이 쉽지 않습니다.

내 생각에는 새로운 애플리케이션을 개발할 때 "READY" 신호를 보내는 일관된 방법을 고집할 것 같습니다.이는 인간 사용자와 테스트 스크립트 모두에게 도움이 될 것입니다!이는 레거시 애플리케이션의 경우 어려울 수 있지만 문제가 있는 지점에 도입하고 유지 관리가 계속되면서 전체 애플리케이션으로 천천히 확산할 수 있습니다.

UI 측면을 처리할 수는 없지만 Boost Test 라이브러리를 사용하여 MFC 코드를 단위 테스트합니다.시작에 대한 코드 프로젝트 기사가 있습니다.

Boost를 사용하여 견고한 객체 설계

우리 직장에는 이런 거대한 MFC 앱 중 하나가 있습니다.유지하거나 연장하는 것은 엄청난 고통입니다 ...지금은 거대한 진흙 공이지만 돈을 긁어 모으고 있습니다.어쨌든

  • 우리는 사용 합리적인 로봇 연기 테스트 등을 수행합니다.
  • 어느 정도 성공한 또 다른 접근 방식은 작은 제품별 언어를 만들고 스크립트 테스트 VBScript를 사용하고 일부 Control은 감시 마법을 처리합니다.일반적인 작업을 명령으로 전환합니다..예를 들어OpenDatabase는 기본 메뉴 > 파일 > "열기..."를 클릭하는 데 필요한 스크립트 블록을 차례로 삽입하는 명령입니다.그런 다음 일련의 명령인 Excel 시트를 만듭니다.이러한 명령에는 매개변수도 사용할 수 있습니다.FIT 테스트 같은거..하지만 일이 더 많아요.대부분의 일반적인 명령이 식별되고 스크립트가 준비되었습니다.새로운 테스트를 작성하기 위해 스크립트(CommandID로 태그 지정됨)를 선택하고 조합합니다.테스트 실행자는 이러한 Excel 시트를 구문 분석하고 모든 작은 스크립트 블록을 테스트 스크립트로 결합하여 실행합니다.

    1. 오픈데이터베이스 "C: ests\MyDB"
    2. OpenDialog "모델 추가"
    3. AddModel "M0001", "MyModel", 2.5, 100
    4. 확인을 누르세요
    5. 데이터베이스 저장

HTH

실제로 우리는 Rational Team Test와 Robot을 사용해 왔지만 최근 Rational과의 논의에서 .NET에 더 초점을 맞춘 기본 x64 애플리케이션을 지원할 계획이 없다는 것을 발견하여 자동화된 QA 도구를 전환하기로 결정했습니다.이것은 훌륭하지만 라이선스 비용으로 인해 모든 개발자가 이를 활성화할 수는 없습니다.

우리의 모든 응용 프로그램은 VB를 통해 회귀 테스트를 하는 스크립팅을 위한 COM API를 지원하지만 이는 응용 프로그램이 아닌 API를 테스트합니다.

이상적으로는 사람들이 개발자 수준에서 cppunit 및 유사한 단위 테스트 프레임워크를 애플리케이션에 통합하는 방법에 관심이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top