WPF 사용자 인터페이스를 테스트하는 방법은 무엇입니까?
MVC / MVP 아키텍처에서 win 양식을 사용하면 일반적으로 클래스를 사용하여 뷰를 래핑하여 UI를 테스트하고 모델 및 컨트롤러 / 프레젠터에 대한 모의를 사용합니다. 래퍼 클래스는 UI의 대부분의 모든 것을 속성 및 이벤트를 통해 테스트 실행기의 관찰 가능한 속성으로 만듭니다.
이것이 WPF 앱을 테스트하는 실행 가능한 접근 방식입니까? 더 좋은 방법이 있습니까? 주의해야 할 점이 있습니까?
테스트 자체는 UI 자동화 프레임 워크를 사용하는 것이 가장 좋습니다 . 또는 프레임 워크를보다 유창하고 wpf / winforms / win32 / swt 독립적 인 방식으로 사용하려면 Codeplex에서 White 를 다운로드 할 수 있습니다 (환경에서 오픈 소스 코드를 사용할 수있는 위치에있는 경우).
잡았다; 뷰를 테스트하려는 경우 스레딩 문제가 발생할 수 있습니다. 예를 들어 NUnit을 실행하는 경우 기본 testrunner는 MTA (Multi-Threaded Appartment)에서 실행되지만 WPF는 STA (Single-threaded Appartment)로 실행되어야합니다. Mike Two 는 WPF 단위 테스트를 쉽게 시작할 수 있지만 스레딩 문제는 고려하지 않았습니다. Josh Smith는 이 게시물 의 스레딩 문제에 대해 몇 가지 생각을 가지고 있으며 Chris Hedgate 의이 기사 도 지적합니다 . Chris는 Peter Provost의 CrossThreadTestRunner 수정 버전을 사용 하여 MTA / STA 문제를 좀 더 친숙한 방식으로 래핑합니다.
@Matt David,
문서를 읽고 Microsoft CompositeWPF (일명 Prism)에 대한 코드 샘플을 살펴보십시오 . 테스트 기반 방식으로 MVP / MVC 아키텍처를 다루는 방법을 가르치기 위해 특별히 만들어진 프로젝트입니다. 샘플 애플리케이션에는 발표자 / 컨트롤러에 대한 단위 테스트와 UI에 대한 매우 멋진 수락 테스트가 포함되어 있습니다 ( 사용자 작업을 시뮬레이션하기 위해 White 프레임 워크 를 사용함 ).
수동으로. 나는 그것이 당신이 얻는 것이라면 자동화 된 UI 테스트 의 열렬한 팬이 아닙니다 . WPF 지침 (aku의 링크를 통해 읽어야 함)에 대해 잘 모르겠습니다. 왜냐하면 여전히 굳건 해지기 때문입니다. WPF는 '올바른 방법'이라는 관점에서 안정화되지 않았습니다. 이러한 진화하는 프레임 워크 중 하나를 사용하지 않는 한 .. 저는 보수적 인 노력을 기울일 것입니다.
- 로직 / 프레젠터 / 컨트롤러를 무자비하게 테스트 (가급적 TDD로 자동화)합니다. 나는 멍청함이나 무기력 함을 옹호하는 것이 아닙니다 .
- UI 스킨을 얇게 유지하고 일부 불쾌한 테스터 가 탐색 테스트를 통해 (수동) 균열을 갖도록하십시오. UI에 관해서는 '지옥에서 온 테스터'만큼 좋은 것은 없습니다. 노력 : 이런 종류의 테스트 자동화로 인한 이득 비율은 거대하고 모든 것을 포착하지 못하며 이해가되지 않습니다 ... 더 높은 업적의 'Look Mgr! 바쁘다! 자체 테스트 UI! '
추신 : 여러분은 이것을 보고 싶을 것입니다 (Mary Poppendieck의 Lean에 대한 Google Talk) .. 특히 테스트에서 자동화해야 할 부분에 대한 부분
2016 업데이트 : 무료 TestStack.White 프레임 워크를 사용하여 WPF UI 테스트 자동화
- Project White는 포기 되었지만 후속 TestStack.White 는 NuGet 패키지를 통해 사용할 수 있습니다.
- TestStack.White에는 WPF 앱 시작 , 창 / 사용자 컨트롤 요소 찾기 , 버튼 / 요소 클릭 , 마우스 및 키보드 이벤트 시뮬레이션 , 대기 등을 위한 유틸리티 메서드가 있습니다 .
WPF 앱을 시작하고 버튼을 클릭 한 후 결과를 확인하는 예제는 다음과 같습니다.
using TestStack.White; using TestStack.White.UIItems; using TestStack.White.Factory; [TestMethod] public void TestDoSomething() { //Opens the app var app = Application.Launch("MyApp.exe"); //Finds the main window (this and above line should be in [TestInitialize]) var window = app.GetWindow("My App Window Title", InitializeOption.NoCache); //Finds the button (see other Get...() methods for options) var btnMyButton = window.Get<Button>("btnMyButtonWPFname"); //Simulate clicking btnMyButton.Click(); //Gets the result text box //Note: TextBox/Button is in TestStack.White.UIItems namespace var txtMyTextBox = window.Get<TextBox>("txtMyTextBox"); //Check for the result Assert.IsTrue(txtMyTextBox.Text == "my expected result"); //Close the main window and the app (preferably in [TestCleanup]) app.Close(); }
Prism (Composite WPF) 은 주로 "테스트 가능성"을 염두에두고 구축되었습니다. 당신의 종류의 개발에 적합하다고 생각한다면 그것을 시도하십시오.
또한 오디오에서 Prism에 대한 더 많은 정보가 필요한 경우들을 수 있는 dotnetrocks 에피소드도 있습니다.
기본 사항은 여기 와 여기 에서 channel9의 몇 가지 짧은 동영상을 확인할 수도 있습니다 .
Guia를 사용해 볼 수도 있습니다 . 단일 WPF UserControls를 직접 단위 테스트 할 수 있습니다.
승리 양식보다 잘 작동합니다.
"WPF 응용 프로그램 품질 가이드"를 확인하십시오. WPF 인터페이스 테스트에 대한 내용이 많이 있습니다. 또한 AutomationPeer 클래스를 잊지 마십시오.
TestAutomationFX.com을 확실히 살펴보십시오. White로 이벤트를 캡처 / 녹화하는 데 많은 시간을 투자 할 수 있습니다 (OK, I did). (내 퀘스트를 시작할 때 나는 그것을 언급하는 다른 곳에서 한두 개의 게시물을 무시했습니다.)
물론 UI 테스트가 아닌 최상의 테스트 유형에 대한 다른 요점은 두 번째입니다.
그러나 누군가가 다른 유형의 테스트 범위의 단점을 해결하기 위해 UI에서 자동화 가능한 작업을 수행하려는 경우 TAFX가 가장 빠른 경로로 보입니다.
WPF 자동화를 위해 Ranorex V2.0을 사용해보십시오. RanoreXPath 및 Ranorex 저장소 테스트 자동화 코드를 사용하여 식별 정보와 완전히 분리 할 수 있습니다. Ranorex는 RanoreXPath 개체를 기반으로 한 캡처 / 재생 편집기도 제공합니다.
그런 다음 자동화 된 테스터를 사용하는 대신 IcuTest 를 사용하여 GUI에 대한 실제 단위 테스트를 만들 수 있습니다 .
UI 테스트의 간단한 자동화를 위해 TestAutomationFX도 권장합니다. TestAutomationFX를 사용하면 white 및 QTP에서 작동하지 않는 wpf 용 netAdvantage 도구도 사용할 수 있습니다. TestAutomationFX는 사용하기 쉬운 인터페이스를 가지고 있으며 Visual Studio와 통합되며 사용자 이벤트 기록을위한 좋은 레코더가 있습니다.
UI 자동화를 사용할 수 있습니다 : http://msdn.microsoft.com/en-us/library/ms747327.aspx 및 http://www.telerik.com/automated-testing-tools/support/documentation/user-guide/ 코드 내 쓰기 테스트 /silverlight-test-automation/wpf-test-automation.aspx
코딩 된 UI 프레임 워크는 Visual Studio 버전 2019 (더 이상 사용되지 않는 코딩 된 UI ) 이후에 만료되므로 Microsoft는 Windows 애플리케이션 (데스크톱 및 UWP) 테스트를 위해 Appium with WinAppDriver를 권장합니다. Appium (WinAppDriver 포함) 또는 WinAppDriver를 사용하여 직접 테스트 ( Appium 포함 또는 제외 ) 를 실행할 수 있습니다 .
WinAppDriver 직접
다음은 WinAppDriver로 직접 작업하는 간단한 설명입니다.
WinAppDriver 다운로드 및 설치 :
- Windows 설정에서 개발자 모드 활성화
WinAppDriver를 시작합니다.
C : \ Program Files (x86) \ Windows Application Driver \ WinAppDriver.exe
새 Visual Studio 2019 단위 테스트 프로젝트 (.NET Framework) 만들기
NuGet-Package : Appium.WebDriver 추가
- 새 클래스 DesktopSession을 추가합니다.
public class DesktopSession
{
protected const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723";
private const string NotepadAppId = @"C:\Windows\System32\notepad.exe";
protected static WindowsDriver<WindowsElement> session;
protected static WindowsElement editBox;
public static void Setup(TestContext context)
{
// Launch a new instance of Notepad application
if (session == null)
{
// Create a new session to launch Notepad application
var appCapabilities = new DesiredCapabilities();
appCapabilities.SetCapability("app", NotepadAppId);
appCapabilities.SetCapability("platformName", "Windows");
appCapabilities.SetCapability("deviceName ", "WindowsPC");
session = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appCapabilities);
Assert.IsNotNull(session);
Assert.IsNotNull(session.SessionId);
// Set implicit timeout to 1.5 seconds to make element search to retry every 500 ms for at most three times
session.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(1.5));
// Keep track of the edit box to be used throughout the session
editBox = session.FindElementByClassName("Edit");
Assert.IsNotNull(editBox);
}
}
public static void TearDown()
{
// Close the application and delete the session
if (session != null)
{
session.Close();
try
{
// Dismiss Save dialog if it is blocking the exit
session.FindElementByName("Nicht speichern").Click();
}
catch { }
session.Quit();
session = null;
}
}
[TestInitialize]
public void TestInitialize()
{
// Select all text and delete to clear the edit box
editBox.SendKeys(Keys.Control + "a" + Keys.Control);
editBox.SendKeys(Keys.Delete);
Assert.AreEqual(string.Empty, editBox.Text);
}
}
- UnitTest1 클래스에서 코드 변경
[TestClass]
public class UnitTest1 : DesktopSession
{
[TestMethod]
public void EditorEnterText()
{
Thread.Sleep(TimeSpan.FromSeconds(2));
editBox.SendKeys("abcdeABCDE 12345");
Assert.AreEqual(@"abcdeABCDE 12345", editBox.Text);
}
[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
Setup(context);
}
[ClassCleanup]
public static void ClassCleanup()
{
TearDown();
}
}
- 테스트 실행
(샘플 코드는 주로 WinAppDriver .NotepadTest 에서 복사됩니다 ).
WinAppDriver가있는 Appium
Appium을 사용하여 테스트를 실행하려면 컴퓨터에 올바른 버전의 WinAppDriver를 설치해야합니다. Appium의 설치 프로그램은 컴퓨터에 올바른 버전의 WinAppDriver도 설치해야합니다 (모든 사용자를 위해 Appium을 설치하십시오). 제 경우에는 안타깝게도 작동하지 않았습니다. 그래서 파일을 살펴 보겠습니다.
C:\Program Files\Appium\resources\app\node_modules\appium\node_modules\appium-windows-driver\lib\installer.js
여기에서 올바른 버전과 다운로드 경로를 찾을 수 있습니다.
const WAD_VER = "1.1";
const WAD_DL = `https://github.com/Microsoft/WinAppDriver/releases/download/v${WAD_VER}/WindowsApplicationDriver.msi`;
올바른 WinAppDriver를 설치 한 경우 Appium을 시작할 수 있습니다.
Important: you have to change the ApplicationDriverUrl
protected const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723/wd/hub";
Tools:
WindowsAppDriver and UI REcorder releases or Donwload the WinAppDriver repository and build the WinAppDriverUIRecorder.sln in the subdirectory tools\UIRecorder
Introducing WinAppDriver UI Recorder
- inspect.exe: Windows SDK is required (look in C:\Program Files (x86)\Windows Kits\10\bin)
Other links: WinAppDriver FAQ Appium
ReferenceURL : https://stackoverflow.com/questions/58340/how-to-test-a-wpf-user-interface
'program tip' 카테고리의 다른 글
ErrorType을 NSError로 변환하면 관련 객체가 손실됩니다. (0) | 2020.12.25 |
---|---|
--save 플래그는 npm install로 무엇을합니까? (0) | 2020.12.25 |
Java에서 LinkageErrors를 처리하는 방법은 무엇입니까? (0) | 2020.12.25 |
Eclipse에서 스텁 Junit 테스트를 어떻게 만들 수 있습니까? (0) | 2020.12.25 |
Python 입력에 대한 편집 기본값을 표시 할 수 있습니까? (0) | 2020.12.25 |