2

因此,我正在为我们的 WPF 应用程序开发一项新功能。我想使用 BDD,尤其是因为交互已经明确定义。我已经为 Web 项目编写了规范,但从未编写过桌面应用程序。所以,我的问题是我希望能够测试状态并避免 UI 抓取,但我看不到这样做的方法吗?

这是问题所在:

我看到我必须启动应用程序,登录,然后执行操作并抓取屏幕的状态(全部使用 UIAutomation)

但是,我希望能够从代码中获取状态。所以,我能想到的最好的办法就是通过 MVVM 结构来驱动它。但是,我想我看到的问题是从一个表单到下一个表单的一些流程来自 UI 绑定,那么有没有办法通过 MVVM 来做到这一点?我必须通过我的 UI 运行这一切吗?

我一直在努力思考如何实现这一点。以上是否有最佳实践?

4

2 回答 2

3

最好的方法是分层测试。我发现最好的方法是忽略视图层,编写描述功能交互的 BDD 规范,然后使用单元测试来驱动模型、视图模型和控制器。

首先,通过忽略视图,您降低了测试的脆弱性。如果您不根据单击按钮和使用菜单项来描述您的测试,那么您不必在 UI 更改时重写测试。老实说,这样做您真正获得的只是检查您是否已将命令正确绑定到您的 UI 元素。

因此,请考虑这种方法,我将使用警报程序作为示例;

  1. 首先定义一个特征,例如When it is the correct time Then sound an alarm。这将帮助您充实您的逻辑并定义您的模型类。通常我会构建多个单元测试来帮助构建每个特性的逻辑。
  2. 派生更多功能,开始涉及用户与 UI 的交互。不要像对不习惯使用计算机、单击按钮和输入文本的人那样描述这些,而是​​更多地告诉那些精通的人,例如When you set the alarm time to 9am。编写/重构您的 SpecFlow 绑定以调用 ViewModel 命令并设置/获取 ViewModel 属性。
  3. 将您的视图绑定连接到您的视图模型。
  4. 改变你的 UI,并陶醉于你的测试仍然全部通过的事实。

我最近在每个客户端与多个服务器对话的 UI 上使用了这种技术。我有一些单元测试可以模拟所有内容,以便只调用一个方法。向上移动我有一些测试通过实例化这两个部分并在我的测试中直接耦合它们来简化客户端-服务器通信,最后我什至有几个测试我们测试一个通信系统的故障(服务器推送到所有客户端)并回退到另一个(每个客户端轮询活动服务器),这需要在机器上运行本地服务器。我可以在后端执行此操作的事实反映了我在 UI 中所做的事情,并且只测试每个阶段相关的内容。

于 2013-03-30T00:19:37.157 回答
0

将 Specflow 与 Coded UI 一起使用怎么样?我们正开始对此进行试验,以便让您知道我们的进展情况。目前,我们已经从技术角度对其进行了跟踪,并且它似乎有效。尽管考虑到更改的可能性,我对这种测试 UI 的整体方法持保留态度。看看http://rburnham.wordpress.com/2011/03/15/bdd-ui-automation-with-specflow-and-coded-ui-tests/

于 2013-04-10T18:16:53.343 回答