我想对你的情景提出建议:
我正在使用bdd技术和Cucumber和Selenium WebDriver工具实现自动化测试,目前正在发生的事情是:很多场景都依赖于彼此的数据,所以现在我将这些数据存储在类我定义的步骤中,所以我可以在其他场景中使用。
但是,随着应用程序的增长,我得到的场景越多,我的应用程序就会越混乱。
你有任何设计模式,或者我可以在这种情况下使用的解决方案吗?
答案 0 :(得分:0)
总体而言,您希望查看Separation of concerns和Single Responsibility Principle。
在Cucumber级别有两个“层”责任,测试脚本(特征文件+步骤实现)和被测系统的模型。 Step Implementation直接映射到模型上。它的唯一目的是为方法绑定特征步骤。 Model实现是对被测系统的状态进行建模,其中包括状态持久性。模型应该以声明式方式在命令式方法中公开其接口,以便我们看到fooPage.login();
优先于page.click('login');
在Selenium WebDriver方面,使用Page Objects Model正是这些可重用的对象理解了表示页面的语义,并且是第三层。
<强>层强> - 测试脚本(功能文件+ Java步骤) - SUT模型(持续状态) - 页面对象模型 - &gt;的webdriver /浏览器
答案 1 :(得分:0)
正如您所说,依赖于其他场景数据的场景变得复杂和混乱。执行顺序很重要。
如果以随机顺序执行方案会发生什么?这对你有什么影响?
我的方法是努力使每个场景彼此独立。如果您有一个流程,比如下达准备创建发票所需的货件所需的订单等等,那么我是否确保在每个方案之前确定应用程序的状态设置正确。也就是说,执行创建所需状态的代码。
这是一种复杂的说法,为了创建发票,我必须首先设置应用程序状态,以便它准备好货件。还有其他可能的东西。
在执行任何场景之前,我会努力将应用程序设置为已知状态。如果这意味着清理数据库,那么我会这样做。目标是能够孤立地执行每个场景。
系统中的功能可能相互依赖。这并不意味着用于检查应用程序是否仍然有效的场景应该在执行期间相互构建。
不确定这是否符合模式,但它可能是一个努力的方向。
答案 2 :(得分:0)
正如已经指出的那样,尝试将关于数据的测试场景彼此隔离开来。
只需几个方法:
在每个测试场景执行之前清理数据库或恢复原始数据都可以实现;但是,这可以显着降低测试速度。如果清洁动作大约需要10秒钟,那么100次测试需要大约15分钟,1000次测试需要大约3小时。
或者,每个测试都可以生成并使用自己的数据。这里的问题是许多测试确实可以使用相同的数据,在这种情况下,反复创建这些数据毫无意义,更不用说这也需要时间。
另一个选择是在只读测试和读写测试之间进行判断。前者可以使用默认数据,因为它们不受数据依赖性的影响。后者应处理特定数据,以避免与其他测试场景发生冲突。
但是,测试场景中的步骤定义可能取决于作为该测试场景的一部分执行的先前步骤定义的状态。所以仍然需要以某种方式进行国家管理。您可能需要在模型中使用一些辅助对象。
请记住,Steps类是为每个测试场景以及从它们创建的对象实例化的。因此,私有实例属性不起作用,除非测试场景使用的所有步骤都在同一个Steps类中实现。否则考虑静态变量或尝试使用依赖注入框架。