如何testingWPF用户界面?
使用MVC / MVP架构的胜利forms,我通常会使用一个类来包装视图来testing用户界面,同时使用模型的模型和控制器/演示。 包装类将使UI中的大部分内容成为testing运行器通过属性和事件的可观察属性。
这将是一个可行的方法来testing一个WPF应用程序? 有没有更好的办法? 有什么需要注意的吗?
至于testing本身,你可能最好使用UI自动化框架。 或者,如果您想要使用框架更stream畅,独立于wpf / winforms / win32 / swt的方式,您可以从Codeplex下载White (假设您可以在您的环境中使用开源代码)。
对于陷阱; 如果你想unit testing你的观点,你可能会遇到一些线程问题。 例如,如果运行的是NUnit,则默认的testrunner将运行在MTA(multithreading单元)中,而WPF需要以STA(单线程单元)运行。 Mike Two在unit testingWPF上有一个真正简单的入门,但是没有考虑到线程问题。 Josh Smith在这篇文章中对线程问题有一些想法,他也指出了Chris Hedgate的这篇文章 。 Chris使用Peter Provost的CrossThreadTestRunner的修改版本以更友好的方式包装MTA / STA问题。
@Matt David,
请阅读文档并查看Microsoft CompositeWPF (又名Prism)的代码示例。 这是一个专门用来教导如何以testing驱动的方式处理MVP / MVC架构的项目。 他们的示例应用程序包含演示者\控制器的unit testing和非常酷的UI验收testing(他们使用白色框架来模拟用户操作)
手动。 我不是自动化用户界面testing的忠实粉丝,如果这是你正在得到的。 我不确定WPF的指导(需要阅读aku的链接)..因为他们仍然在巩固这么说… WPF并没有从“什么是正确的方式”的angular度来稳定。 除非你正在使用这些演变的框架之一..我会保守努力
- 逻辑/演示者/控制器无情地testing(自动优先TDDed)。 我不是在提倡懒散或嗜睡 。
- 保持界面皮肤的薄弱,让一些讨厌的testing人员通过探索性testing(手动)来破解它 – 当涉及到UI时,没有什么比'地狱testing人员'好。 从这种testing自动化的努力:获得比例是巨大的,不抓住一切,没有任何意义…除了安抚上层的外貌经理! 没有手! 自我testing用户界面!
PS:你可能想看这个(Mary Poppendieck的Google Talk on Lean)..尤其是关于什么在testing中自动化的部分
2016更新: 使用免费的TestStack.White框架来自动化WPF UItesting
- 白色项目已被放弃 ,但其后续TestStack.White可通过NuGet包。
- TestStack.White有用于启动WPF应用程序 , 查找窗口/ 用户控件元素 , 单击button/元素 ,模拟鼠标和键盘事件, 等待等的实用方法。
-
将启动一个WPF应用程序的示例,单击一个button,并检查结果如下所示:
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(); }
棱镜(复合WPF)主要build立在“可testing性”的基础上。 去做吧,如果你觉得它适合你的发展。
如果你需要更多关于棱镜audio的信息,这里还有你可以听的dotnetrocks插曲 。
基本的,你也可以在这里和这里查看 channel9上的一些短片。
你也可以试试东望洋 。 它允许您直接unit testing单个WPF UserControls。
它会工作得很好,比胜利forms更容易。
查看“WPF应用程序质量指南”,对WPF界面进行testing有相当多。 另外不要忘记AutomationPeer类。
绝对看看TestAutomationFX.com。 人们可以投入(好,我做了)很多时间试图捕获/logging白事件。 (在我的任务开始时,我忽略了其他地方提到的这个post)。
当然,我还有其他关于不是UItesting的最佳testingtypes的其他观点。
但是如果有人打算在用户界面上做一些自动化的工作,以避开其他typestesting覆盖的缺陷,那么TAFX似乎是最快的路线。
尝试使用Ranorex V2.0进行WPF自动化。 使用RanoreXPath和Ranorex存储库testing自动化代码可以完全与识别信息分离。 Ranorex还提供了一个基于RanoreXPath对象的捕获/回放编辑器。
而不是使用自动化testing人员,您可以使用IcuTest为您的GUI创build真正的unit testing。
我会推荐TestAutomationFX以及简单的UItesting自动化。 TestAutomationFX可以让你使用wpf的netAdvantage工具,而且不适用于白色和QTP。 TestAutomationFX有一个易于使用的界面,它与Visual Studio集成,并具有良好的logging用户事件logging。
您可以使用UI自动化: http : //msdn.microsoft.com/en-us/library/ms747327.aspx和http://www.telerik.com/automated-testing-tools/support/documentation/user-guide/写testing-在码/ Silverlight的testing自动化/ WPF的testingautomation.aspx