首页 > 解决方案 > 使用 Cucumber 时,您将初始化任务(例如读取属性文件等)放在哪里

问题描述

虽然我有一个工作测试套件,但我对 Java、Selenium 和 Cucumber 的世界还是很陌生。我有点继承了一个项目,其中大部分我都以可维护和可扩展的方式重写。然而,有一件事仍然困扰着我。

该程序使用某个类来初始化所需的变量。它执行以下操作:

所有这些东西要么只需要运行一次,要么很昂贵。这个类是一个单例,我知道它只被实例化一次。对我来说听起来不错,但后来我读到单身人士通常是个坏主意。

由于 Cucumber 是 Junit 的扩展,因此没有 main(),至少在这个程序中没有,而且我还没有看到使用它的示例。那么,进行这些操作的好方法是什么?

我阅读了有关 DI 的信息,但是随后,我需要将此类传递给所有需要访问这些变量的类,例如要测试的站点的 url。此外,让 WebDriverManager 每次都检查浏览器版本似乎不是一个好主意。

我读到了静态块,但我怎么知道这个类是先加载的?

那么,我从这里去哪里?

标签: javacucumber

解决方案


单例是一种模式。和所有模式一样,它们也有优点和缺点。如果这些权衡值得,您将不得不做出选择。如果没有,你将不得不改变模式。

总的来说,这些权衡是不值得的。除非你有一个昂贵的资源,否则你可能根本不应该考虑使用单例。依赖注入——有或没有框架——通常是更好的方法。

但是,您有一个昂贵的对象。网络驱动程序。所以单例模式值得考虑。从广义上讲,如果您不打算并行运行测试,则没有理由不使用单例模式。

我阅读了有关 DI 的信息,但是随后,我需要将此类传递给所有需要访问这些变量的类,例如要测试的站点的 url。此外,让 WebDriverManager 每次都检查浏览器版本似乎不是一个好主意。

我读到了静态块,但我怎么知道这个类是先加载的?

您可以将单例模式与延迟初始化结合起来。与其在加载类时立即将单例创建为静态变量,不如创建一个静态 getter 方法。当您第一次调用此方法时,您会创建单例实例并返回它。当第二次调用时,您返回创建的单例实例。

private static WebDriver driver;

public static WebDriver getWebDriver(){
  if (driver != null){
    return driver;
  }

  driver = // create driver here

  return driver;
}

由于 Cucumber 是 Junit 的扩展,因此没有 main(),至少在这个程序中没有,而且我还没有看到使用它的示例。那么,进行这些操作的好方法是什么?

您可以使用cucumber-piccontainer它是一种非常简单的 DI 形式。

https://github.com/cucumber/cucumber-jvm/tree/main/picocontainer


推荐阅读