C # 및 NUnit을 사용하여 GUI 앱에 대한 단위 테스트를 구성하는 방법


16

고객 중 한 사람에게 간단한 응용 프로그램을 제공하기 위해 소규모 프로젝트를 수행하라는 요청을 받았습니다. 일반적으로 백엔드 코드를 작성하여 모든 테스트 요구 사항을 파악했지만 GUI에 대한 테스트 작성에 대한 모호한 즐거움을 아직 얻지 못했기 때문에 설정 방법을 잘 모릅니다. EXE의 테스트 코드 및 도구

첫 번째 본능은 단순히 응용 프로그램 코드와 함께 테스트를 포함시키는 것이었지만, 고객에게 배송하지 않도록 지시 한 여러 테스트 관련 종속성을 제공해야합니다. 또한 목적으로 구축 된 테스트 도구로 현금을 짜낼 수 없으므로 현재 보유하고있는 도구 ( StoryQ , RhinoMocksNUnit) 를 사용해야합니다.), 간단한 GUI 앱의 동작을 테스트하기에 충분해야합니다. 내가 볼 수있는 한, 이것은 디자인을 단순하게 유지하는 것과 테스트를 위해 의도적으로 과도하게 엔지니어링하는 것 사이에서 균형을 잡으려고 노력하게한다. 별도의 라이브러리에서 비즈니스 로직을 사용하여 앱을 빌드하고 평소와 같이 라이브러리를 테스트하거나 응용 프로그램 디자인이하지 않는 추가 모듈을 파괴하지 않고 실행 파일을 허용하는 다른 메커니즘을 찾는 것 같습니다 정말 필요한.

편집 :
이 질문은 DLL과 달리 NUnit과 내 실행 파일 간의 관계를 구성하는 방법에 관한 것이며 프레젠테이션과 비즈니스 논리를 분리하는 방법에 관한 것이 아닙니다.
/편집하다

그래서 내 질문은 :

  1. 내가 가지고있는 도구를 사용하고 과도하게 엔지니어링하지 않고 상태와 동작을 적절히 점검 할 수 있도록 단위 테스트로 간단한 GUI 응용 프로그램을 구성하기위한 구체적 / 권장 방법이 있습니까?
  2. DLL을 테스트하는 대신 EXE를 테스트 할 때 NUnit을 호출 / 구성하는 방법에 대한 근본적인 내용을 놓쳤습니까?
  3. 이 모든 것을 어떻게 달성 할 수 있는지에 대한 예를 제시해 주실 수 있습니까?

이 작업을 수행하는 방법이 두 가지 이상있을 수 있으므로 귀하의 경험을 바탕으로 구체적인 구현 지침을 찾고 있습니다.


NUnit은 GUI를 직접 테스트하도록 설계되지 않았습니다. 뷰를 사용하지 않고 뷰에 들어가는 내용을 테스트 할 수 있도록 프리젠 테이션 레이어 (예 : 뷰)와 데이터 및 비즈니스 로직 (예 : 모델)을 분리해야합니다.
Bernard

1
@Bernard이 질문은 테스트를 위해 GUI를 계층화하는 것이 아닙니다. 나는 자연스럽게 모든 앱, 심지어 사소한 앱을 계층화하므로 실제로 문제가되지 않습니다. 질문에 맞게 편집했으며 오해가 해결되기를 바랍니다. :)
S.Robins

1
EXE에서 단위 테스트에있어 매우 복잡한 것은 없습니다. 테스트 DLL이 EXE 파일을 참조하도록하십시오.
whatsisname

답변:


3

나는 내 의견 중 하나에서 이것을 할 수있는 몇 가지 방법을 생각했다는 simoraman의 대답에 대해 언급했습니다 . 내 옵션 중 하나는 중복 프로젝트를 만들고 DLL을 생성한다는 Jalayn의 제안과 비슷하지만 다른 아이디어는 테스트하려는 코드가있는 프로젝트의 파일에 단순히 링크하는 것이 었습니다. 두 가지 옵션을 모두 사용할 수는 있지만 이상적이지는 않습니다.

두 번째 경우, 종속성을 최소화하기 위해 아키텍처를 실제로 분해 할 수 없다면 단위 종속성이 엉망이됩니다. 소규모 프로젝트에는 적합하지만 큰 프로젝트는 쉽게 관리하기 어려울 수 있습니다. 그러나이 옵션에 대한 나의 가장 큰 저항은 그 단순한 우아함입니다. 물론 내가 할 수작동하지만, 그렇게하면 공개 인터페이스를 통해 테스트하는 대신 소스를 통해 직접 어셈블리 내부를 테스트하기 위해 캡슐화를 효과적으로 해제해야합니다. 마찬가지로 추가 프로젝트 파일이 있으면 한 번에 두 개의 프로젝트에서 노력이 중복되거나 한 번에 두 개의 파일에 프로젝트 파일 설정을 자동으로 추가하는 방법을 찾거나 빌드 할 때마다 프로젝트 필드를 복사하고 이름을 바꾸는 것을 기억해야합니다. 이것은 아마도 빌드 서버에서 자동화 될 수 있지만 IDE에서 관리하기가 어려울 것입니다. 다시 말하지만 작동 할 수는 있지만 기껏해야 끔찍한 일이며 잘못하면 성가신 일입니다.

가장 좋은 방법은 whatsisname이 내 질문에 댓글을 달고 EXE를 테스트 프로젝트에 참조로 포함시키는 것 같습니다. 이 경우 EXE는 DLL과 동일한 방식으로 효과적으로 처리되는 것으로 나타 났으며, 멋지게 계층화 된 모든 클래스에 액세스 하여 보트에 떠있는 것을 테스트 할 수 있습니다 .


2

내 생각에는:

  • 비즈니스 테스트 코드는 비즈니스 코드 라이브러리를 테스트하는 별도의 프로젝트에 있어야합니다.
  • GUI 테스트 코드는 GUI 라이브러리를 테스트하는 별도의 프로젝트에 있어야합니다. 이제 실행 파일 대신 GUI 라이브러리를 작성하는 방법에 대해서는 나중에 대답하려고합니다.
  • my.namespace.biz.MyClass가있는 경우 테스트 클래스는 my.namespace.biz.MyClassTest (또는 MyClassTestCase) 여야합니다.
  • 실행 가능한 대상에서 찾은 코드를 테스트하려면 EXE를 빌드하는 설정과 테스트를 시작할 라이브러리 (DLL)를 빌드하는 다른 설정이 있어야합니다.

Java 또는 C #인지 여부에 관계없이 내가 따르고 싶은 규칙은 다음과 같습니다 (Java에 EXE 문제가 없음 :-))

테스트 환경을 구성하는 방법에 관해서는 적어도 두 가지 선택이있는 것 같습니다.

MSBuild 사용

.proj 파일 (예 : myproject-as-dll.proj ) 의 복제본을 만듭니다 . 변경 OutputType"에서 복제 된 파일을 EXE"을 "Library . MSBuild 명령을 사용하여 NUnit 테스트 사례가 포함 된 프로젝트에 대한 참조로 설정할 수있는 라이브러리를 생성 할 수 있습니다.

그것은 가능할 것 같지만, 나는 그것을 그렇게 정직하게 사용한 적이 없으므로 확실하지 않습니다. 또한 통합 테스트 서버에 MSBuild가 없을 수 있으며 Visual Studio와 분리 할 수 ​​있는지 모르겠습니다 ...

NAnt 사용

NAnt에 익숙하지 않다면 프로젝트 빌드를 구성하는 방법을 Google에 알려야합니다. 어쩌면 이것을 확인하십시오 . 조금 오래된 파일이지만 저자는 NAnt 파일에 주석을 달았으며 설명이 필요하다면 파일을 더 자세히 검사하면 구성 파일을 매우 재사용 할 수 있습니다. 또한 테스트 사례를 실행하고 코드 범위 도구를 시작하기 때문에 단순한 빌드 이상의 기능을 수행합니다. 이제는 Java를 사용하는 아버지와 "Ant"아버지와 달리 NAnt를 사용한 적이 없다는 것을 인정하지만, 나는 그것이 똑같은 것을 보았고 배우기가 어렵다고 생각하지 않습니다.

이 도구를 사용하면 다음을 수행 할 수있는 구성을 구성 할 수 있습니다.

  • 모든 프로젝트 (비즈니스 로직, GUI 등)를 별도의 라이브러리로 빌드
  • 테스트 프로젝트를 구축
  • 테스트를 시작하십시오 (특정 부분은 NUnit2 태스크로 수행됨 ).
  • NCover 작업으로 코드 적용 범위를 검사하십시오 .

약간의 코드를 추가하면 다음과 같은 이점도 얻을 수 있습니다.

  • 통합 서버에서 야간 배포 수행
  • 통합 서버에서 NAnt를 사용할 수있는 경우 예약 된 작업을 통해 야간 통합 테스트를 시작하십시오.

모든 것은 Visual Studio 파일에서 아무것도 변경하지 않고 수행됩니다. 그리고 실제로, 그것은 나에게 과도하게 엔지니어링되는 것처럼 보이지 않으며 단지 하나의 파일 일뿐입니다. 모든 것이 제대로 작동하려면 1 일, 2 일이 걸릴 수 있지만 제 생각에는 좋은 설정이 될 것입니다.

마지막으로 프로젝트를 빌드, 테스트 및 실행하는 데 필요한 모든 것을 클라이언트에 제공합니다. 나는 그것이 당신의 전문성과 당신이 당신의 마음에 질 좋은 코드를 작성한다는 사실을 보여주고 있다고 생각하는 경향이 있습니다.


0

프로젝트가 (초기) 작다고해서 적절한 아키텍처가 과도하게 엔지니어링 된 것은 아닙니다. 테스트를 작성한다는 사실은 프로젝트가 완전히 간단한 일회성 해킹이 아님을 나타냅니다.

사용중인 GUI 프레임 워크에 대해서는 언급하지 않았습니다. WPF MVVM (Model-View-ViewModel)은 우수하며 모든 로직에 대한 테스트를 매우 쉽게 작성할 수 있습니다. WinForms를 통해 MVP (Model-View-Presenter)에 대한 좋은 소식을 들었습니다.


내가 작성한 모든 코드에 대한 테스트를 작성합니다. 사소한 것들조차도. 내가 시험을 쓰지 않는 유일한 시간은 스파이크 때입니다. 이 경우 고객에게 일회용 유틸리티를 제공하고 있으므로 테스트는 단순한 사치 이상의 것이 아닙니다. 품질 표준을 충족하기 위해서는 필수입니다. "과도한 엔지니어링"의 관점에서 이것은 좋은 아키텍처와 나쁜 아키텍처 사이의 선택이 아니라,이 예제에서는 필요하지 않은 추가 레이어링을 적용 할 필요를 피하는 것이 아니라 앱이 수명이 비교적 짧은 단일 목적이기 때문입니다.
S.Robins

gui-framework의 선택에 관한 한, 이것이 이것이 테스트 환경 설정 방식에 어떤 영향을 미치는지 알 수 없습니다. 사용 가능한 도구를 사용하여 GUI 계층에 대한 단위 테스트를 구체적으로 구현하는 방법을 찾고 있습니다. 이 특정 답변은 실제로 그것에 대해 아무것도 말하지 않습니다.
S.Robins 01. 25. 12.

시모 라만 (Simoraman) – 만약 당신이 다소 판단적인 첫 번째 문단을 빼앗 았다면 이것이 답을 얻게 될 것입니다. 문제를 해결하면 -1을 제거하겠습니다. @ S.Robins는 두 번째 단락 관련 있음을 참고하십시오 . 정답은 아니지만 도움이 될 것입니다. GUI 계층이 얇고 체계적이며 명확하고 모든 비즈니스 로직이 모델 레벨에서 단위 테스트로 테스트되는 경우 UI를 명시 적으로 테스트하는 추가 번거 로움이 필요하지 않을 수 있습니다.
Mark Booth

1
@MarkBooth Layering은 실제로 문제가되지 않습니다. simiraman이 언급했듯이 MVP, MVVM 또는 더 얇은 것을 만들 수 있습니다. 그러나 명시적인 테스트가 필요한 GUI 특정 요소가 있으므로 이것을 질문으로 작성하기로 결정했습니다. 나는 몇 가지 아이디어를 가지고 있으며, 더 악화되면 결국 문제를 해결할 수 있고 스스로 답을 쓸 수 있음을 알고 있습니다. 그러나 ProgrammersSE에게 좋은 질문이 될 것이라고 생각했기 때문에 커뮤니티에 공개하고 싶었습니다. ;-)
S.Robins 2012 년

0

이 질문에 대한 답변을 살펴보십시오. Winforms 솔루션을 위해 MVP를 어떻게 설정합니까?

실제로 GUI를 계층화하고 테스트하는 방법을 보여주는 샘플 응용 프로그램을 작성했습니다.

편집 내용 읽기 : 개발 환경과 통합되는 테스트 러너를 사용하십시오. ReSharper를 사용합니다.


ReSharper 추천에 감사드립니다. 이것은 개발할 때 사용하는 도구입니다. 불행히도 통합 빌드 서버에서 테스트를 실행할 때 도움이되지 않습니다. 또한 테스트 할 때 exe의 코드에 액세스하도록 Nunit 테스트를 구성하는 방법을 알려주지 않습니다.
S.Robins

1
비공식적으로는 그렇습니다. exe는 응용 프로그램 시작의 일부로 발표자, 모델 및 뷰 모델을 클래스 라이브러리에서로드하는 뷰일뿐입니다. 적어도 내 솔루션에서보기는 자동화 된 테스트로 테스트하지 않고 수락 테스트를 수행하여 맞춤법과 버튼의 위치를 ​​확인합니다. dll을 NUnit 테스트하는 것은 매우 쉽습니다.
Bryan Boettcher

0

몇 년 전에 Nunit WinForms를 작성했습니다 (6 년). 내가 구체적으로 기억하는 한 가지는 단위 테스트 사례이지만 엔드 투 엔드 테스트 사례로도 작용한다는 것입니다. 때로는 프론트 엔드 (간단한 형태)에서 테스트 할 것이 많지 않습니다. 따라서 버튼 클릭시 팝업되는 메시지 상자를 테스트하려고 시도하더라도 실수로 다른 레이어의 다양한 다른 방법을 테스트하고 있습니다. 자동화 할 수없는 것도 있습니다. 모양, 느낌 및 유용성은 자동화 된 단위 테스트를 사용하여 자동화 할 수 없습니다. 릴리스하기 전에 일부 수동 테스트를 실행해야합니다.


고객이 화면을 특정 방식으로 보이거나 특정 방식으로 변경해야한다고 지정하면 이러한 사항을 테스트 할 수 있습니다. 사양을 테스트로 캡처하는 것은 BDD 방법론의 핵심이며, 창의적이지만 테스트를 자동화 할 수단을 찾을 수없는 상황은 발견하지 못했습니다. 실제 질문은 테스트가 가치가 있는지, 응용 프로그램이 모든 테스트를 처음에 자동화 할 수있을만큼 충분히 고려되었는지 여부, 테스트가 비용 효율적인지 여부입니다. 그래도 때로는 그렇지 않다는 데 동의합니다.
S.Robins
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.