现在,我们正在努力采用Cucumber在Java8 / Spring应用程序上运行功能测试。我们希望步骤定义文件尽可能保持DRY状态,并计划在不同的特征文件中使用相同的步骤定义。由于我们使用seleniumWebDriver来驱动测试,因此我们需要在步骤定义之间共享相同的驱动程序。
WebDriver
为了说明为什么拥有多个驱动程序对我们来说是个问题,请想象一个功能文件,该功能文件定义了两个步骤:一个浏览到页面,另一个声明在该页面上出现一行。如果两个步骤都恰好在单独的文件中定义,则第一步定义将使用其驱动程序导航到页面。到第二步定义针对其驱动程序运行断言时,它尚未导航至页面(因为这些操作已移至另一个驱动程序),并且测试失败。
我们尝试实现每个步骤定义文件都将扩展的基类(包含驱动程序)。事实证明,Cucumber实例化每个步骤定义类的实例,因此,我们最终得到每个步骤定义具有不同的WebDriver实例。
我们曾考虑过使用Spring WebDriver在每个步骤定义文件中注入一个实例,但是我相信这会导致上述相同的问题。
我知道可以使用单例模式来实现这一目标,但是我们的模式似乎是一个常见的问题,单例模式感觉像是过大了。这实际上是正确的方法吗?还是我缺少真正明显的东西?
预先感谢您的帮助!
我建议您将pico-container用作要与一起使用的依赖项注入框架cucumber-jvm。
cucumber-jvm
使用PicoContainer,您可以使用WebDriver实例创建一个“基”类,然后将该基类自动地传递给任何其他类。或者,如果您愿意,甚至可以直接通过Web驱动程序。
<dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-picocontainer</artifactId> <version>1.2.3</version> <scope>test</scope> </dependency>
例:
具有WebDriver实例的基类:
public class ContextSteps { private static boolean initialized = false; private WebDriver driver; @Before public void setUp() throws Exception { if (!initialized) { // initialize the driver driver = = new FirefoxDriver(); initialized = true; } } public WebDriver getDriver() { return driver; } }
其他通过pico-container DI访问webDriver的类。
public class OtherClassSteps { private ContextSteps contextSteps; // PicoContainer injects class ContextSteps public OtherClassSteps (ContextSteps contextSteps) { this.contextSteps = contextSteps; } @Given("^Foo step$") public void fooStep() throws Throwable { // Access WebDriver instance WebDriver driver = contextSteps.getDriver(); } }
希望能帮助到你。