BDD GUI 自动化

BDD GUI Automation

我开始了我生活中的新角色。我是一名前端 Web 开发人员,但现在我已经转向测试 Web 软件,或者更重要的是,自动化软件测试。我相信我要追求 BDD(行为驱动开发)方法。我对使用什么以及如何将它们拼凑起来相当迷茫。

used/written 中的代码在 Java 中,用于为要测试的应用程序编写 Web 界面。我有 运行 的测试文档,但我一直很好奇如何将其自动化。

我被引导到 Cucumber 作为 "languages" 之一来帮助实现自动化。我做了一些研究,发现了一个 BDD Tools/Frame 作品概要的网站, 8 种最佳行为驱动开发 (BDD) 工具和测试框架。这有点帮助,但后来我对如何实施它有点困惑。 Selenium 似乎是许多用于测试 GUI 的 BDD 框架中的共同点,但它似乎仍然无法帮助描述要做什么。

然后我遇到了 Functional Testing tool 这个词,我认为这让我更加困惑。他们都测试 GUI 吗?

我认为看起来像是一个包的那个是 SmartBear TestComplete, and then there is, what seems to be, another similar application by SmartBear called, SmartBear TestLeft,但我想我看到他们仍然使用 Cucumber 对其进行 BDD。还有其他一些看起来也可以,但我想另一个问题是什么是最便宜的路线?

我想我遇到的最大问题是如何使这些测试更具动态性,因为 UI/browser 维度可以很容易地从系统更改到系统,以及我如何着手编写可以处理这个问题的自动化,并融入 BDD 方法论?

这里有人有什么建议吗?有人这样做吗?

提前致谢。

既然你不知道从哪里开始,我会提示你一些我写的博客,这些博客讨论了你的问题。

一些可能对您有帮助的类别:

这个,相当长和旧 post,可能也会给你一些提示:

http://www.thinkcode.se/blog/2012/11/01/cucumberjvm-not-just-for-testing-guis

请注意,版本已过时,但希望它能提供一些想法。

我不是测试自动化方面的专家,但我目前正在研究这部分。因此,让我分享一些想法,希望它能在当前阶段对您有所帮助。 我们使用 selenium+cucumber+intellij 来测试 web 应用程序。我们使用 testcomplete+cucumber+intellij 来测试 java 桌面应用程序。

关于web应用的测试,我们在web应用中提供了一个测试模式,可以让我们得到一些有用的产品和环境的细节;并且还允许我们在测试模式下通过单击按钮并在测试面板中输入文本来轻松触发事件。

希望这些对你有所帮助。

BDD 架构

BDD 自动化通常由几层组成:

  1. 自然语言步骤
  2. 将步骤与其定义联系起来的连线
  3. 步骤定义,通常访问页面对象
  4. 页面对象,提供页面或小部件的所有功能
  5. 对正在执行的实际代码进行自动化,通常是通过 GUI。

自然语言步骤和步骤定义之间的连接通常由 BDD 工具 (Cucumber) 完成。

自动化通常使用自动化工具 (Selenium) 完成。有时人们会跳过 GUI,可能会转而针对 API 或 MVC 层。这取决于网页中功能的复杂程度。如果有疑问,试试 Selenium。我为桌面应用程序编写了自动化框架;不管怎样,原理都是一样的。

保持可维护性

为了使步骤易于维护和更改,请将步骤保持在较高级别。这通常被称为 "declarative" 而不是 "imperative"。比如这个太详细了:

When Fred provides his receipt
And his receipt is scanned
And the cashier clicks "Refund to original card"
And the card is inserted...

想想用户想要达到的目标:

When Fred gets a refund to his original card

通常一个场景会有几个 Givens 或 Thens,但通常只有一个 When(除非你有用户交互或时间流逝之类的东西,这两个事件都需要说明行为)。

在这种情况下,您的页面对象很可能是 "RefundPageObject" 或者,如果太大,可能是 "RefundToCardPageObject"。这种模式允许多个场景步骤访问相同的能力而不重复,这意味着如果能力的行使方式发生变化,你只需要在一个地方改变它们。

不同的页面对象也可以用于不同的系统。

入门

如果您是第一次尝试此操作,请先获取一个空的场景,该场景仅 运行 秒并且什么也不做就通过(使步骤为空)。完成此操作后,您将成功连接 Cucumber。

编写 生成场景 运行 的生产代码。 (这与您通常的做法相反;通常您会先编写场景代码。不过我发现这是开始的好方法。)

当您可以手动 运行 场景时,将自动化直接添加到步骤中(此时您只有一个场景)。使用您最喜欢的断言包 (JUnit) 获得您想要的结果。您可能需要更改您的代码,以便您可以轻松地对其进行自动化,例如:为网页中的元素提供相关的测试 ID。

一旦你有了一个场景运行ning,尝试先写任何后续场景;这有助于您考虑您的设计和您将要做的事情的可测试性。当您开始添加更多场景时,也开始将自动化提取到页面对象中。

一旦您有了一些场景,请考虑您可能希望如何处理不同的系统。尽可能避免使用大量 "if" 语句;那些很难维护。注入页面对象的不同实现可能更好(框架现在可能很好地支持这一点;我有一段时间没有使用它们了)。

在添加更多场景时继续重构。如果步骤太大,请将它们分开。如果页面对象太大,将它们分成小部件。我喜欢根据用户/利益相关者的能力(通常与 "when" 有关,但有时与 "then" 有关)然后根据不同的上下文来组织我的场景。

总结一下:

  1. 写一个空场景[=​​79=]
  2. 编写代码以手动通过
  3. 使用您的自动化工具连接场景;现在应该 运行!
  4. 再写一个场景,这次写自动化生产代码
  5. 之前
  6. 重构自动化,将其从步骤中移出到页面对象中
  7. 在添加更多场景时继续重构。

现在您已经有了一个完全连接的 BDD 框架,您可以继续前进,同时使其易于维护。

最后的提示

将其视为动态文档,而不是测试。 BDD 场景几乎不会发现优秀团队中的错误;他们发现的任何问题通常都是代码设计问题,因此请在该级别解决。它可以帮助人们弄清楚代码能做什么和不能做什么,以及它为什么有价值。

BDD 最重要的部分是讨论代码的工作原理。如果您正在对已经存在的代码进行自动化测试,至少看看您是否可以找人谈谈复杂的部分,并验证您对他们的理解。这也将帮助您在场景中使用正确的语言。

[=36=See my post on using BDD with legacy systems for more. 该博客上也有很多针对初学者的提示。