我希望您对我的场景有以下建议:
我正在使用Cucumber和Selenium WebDriver工具使用bdd技术实现自动化测试,目前正在发生的情况是:许多场景依赖于彼此的数据,所以现在我将这些数据存储在我定义步骤的类中,以便我可以在其他场景中使用。
但是,随着应用程序的增长,我得到的场景越多,我的应用程序就变得越混乱。
在这种情况下,您有什么设计模式或解决方案可以使用吗?
发布于 2016-01-27 08:30:21
总体而言,您需要查看Separation of concerns和Single Responsibility Principle。
在Cucumber级别,有两层责任,测试脚本(功能文件+步骤实现)和被测系统的模型。步骤实现直接映射到模型上。它的唯一目的是将功能步骤绑定到方法。Model实现是对被测系统的状态进行建模,其中包括状态持久性。模型应该以声明式的方式公开它的接口,而不是命令式方法,这样我们就可以看到优先于page.click('login');的fooPage.login();
在使用Page Objects Model的Selenium WebDriver方面,正是这些可重用对象理解了表示页面的语义,并将成为第三层。
Layers -测试脚本(功能文件+ Java步骤)- SUT模型(保存状态)-页面对象模型-> WebDriver/Browser
发布于 2016-01-27 15:03:11
正如您所说,依赖于其他场景中的数据的场景会变得复杂和混乱。执行的顺序很重要。
如果您以随机顺序执行场景,会发生什么?这会对你有什么影响?
我的方法是努力使每个场景相互独立。如果您有一个流程,如下订单,准备创建发票所需的发货等,那么我将确保在每个场景之前应用程序的状态设置正确。也就是说,执行创建所需状态的代码。
这是一种复杂的方式,为了创建发票,我必须首先设置应用程序状态,以便它已准备好装运。以及其他可能的事情。
在执行任何场景之前,我会努力将应用程序设置为已知的状态。如果这意味着清理数据库,那么我会这么做。我们的目标是能够独立地执行每个场景。
您的系统中的功能可能会相互构建。这并不意味着你用来检查你的应用程序是否仍然工作的场景应该在它们的执行过程中相互构建。
不确定这是否符合模式,但它可能是一个努力的方向。
发布于 2018-03-14 17:54:53
正如已经指出的,尝试将测试场景与数据相互隔离。
以下是几种方法:
尽管如此,测试场景中的步骤定义很可能依赖于作为该测试场景的一部分执行的先前步骤定义的状态。因此,仍然需要以某种方式进行状态管理。在你的模型中你可能需要一些辅助对象。
请记住,每个测试场景的Steps类以及从它们创建的对象都是实例化的。因此,私有实例属性将不起作用,除非测试场景使用的所有步骤都在相同的steps类中实现。否则,可以考虑静态变量,或者尝试使用依赖注入框架。
https://stackoverflow.com/questions/35023213
复制相似问题