java - 使用 Cucumber 时,您将初始化任务(例如读取属性文件等)放在哪里
问题描述
虽然我有一个工作测试套件,但我对 Java、Selenium 和 Cucumber 的世界还是很陌生。我有点继承了一个项目,其中大部分我都以可维护和可扩展的方式重写。然而,有一件事仍然困扰着我。
该程序使用某个类来初始化所需的变量。它执行以下操作:
- 从属性文件中读取变量
- 验证这些属性
- 为要测试的主机、所需的其他 url 等内容公开公共静态最终变量。
- 调用 Boni García 的 WebDriverManager 设置,它会检查本地浏览器的版本并下载兼容的网络驱动程序
所有这些东西要么只需要运行一次,要么很昂贵。这个类是一个单例,我知道它只被实例化一次。对我来说听起来不错,但后来我读到单身人士通常是个坏主意。
由于 Cucumber 是 Junit 的扩展,因此没有 main(),至少在这个程序中没有,而且我还没有看到使用它的示例。那么,进行这些操作的好方法是什么?
我阅读了有关 DI 的信息,但是随后,我需要将此类传递给所有需要访问这些变量的类,例如要测试的站点的 url。此外,让 WebDriverManager 每次都检查浏览器版本似乎不是一个好主意。
我读到了静态块,但我怎么知道这个类是先加载的?
那么,我从这里去哪里?
解决方案
单例是一种模式。和所有模式一样,它们也有优点和缺点。如果这些权衡值得,您将不得不做出选择。如果没有,你将不得不改变模式。
总的来说,这些权衡是不值得的。除非你有一个昂贵的资源,否则你可能根本不应该考虑使用单例。依赖注入——有或没有框架——通常是更好的方法。
但是,您有一个昂贵的对象。网络驱动程序。所以单例模式值得考虑。从广义上讲,如果您不打算并行运行测试,则没有理由不使用单例模式。
我阅读了有关 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
推荐阅读
- react-native - 调度操作不会自动重新呈现应用程序
- c++ - 为什么 fscanf() 将数字舍入为整数?
- html - CSS网格行应该一直跨越
- regex - 正则表达式在字符串中找到许多单词
- android - 如何修复警告:配置“编译”已过时,已替换为“实施”和“API”
- python - 有没有像 'Exp1 这样的交流电?Exp2 : Python 中的 Exp3'?
- node.js - 代理目标路由到无效 url
- c# - 不同的声音,不同的 imageTargets 和一个按钮。Vuforia (Unity3d)
- php - 从 Synology NAS 连接 mysql
- postgresql - 如何使存档命令从备用到备用 ( scp ) 进行数据库复制。(注意:不是从主人那里待命。)