Spek测试中如何确保setupChromeDriverForTest仅执行一次?
解决Spek框架中ChromeDriver初始化重复执行的问题
我明白你遇到的困扰了——直接在Spek测试类的类体里声明val chromeDriver = setupChromeDriverForTest(),哪怕只跑单个测试,这段初始化代码也会执行两次,进而触发文件被占用的异常。这其实是Spek的运行机制导致的:它会先实例化一次测试类来扫描、构建测试结构(解析given/on这些测试块),之后再实例化一次来真正执行测试逻辑,所以类体里的初始化代码会被调用两次。
要让ChromeDriver只初始化一次,你需要用到Spek提供的生命周期钩子,具体用beforeGroup和afterGroup就能解决问题:
- 用
lateinit var声明ChromeDriver变量,因为我们要在钩子块里完成初始化 - 在
beforeGroup块里执行Driver初始化,这个钩子会在整个测试类的所有测试开始前仅执行一次 - 在
afterGroup块里关闭ChromeDriver,及时清理资源,释放文件占用
修改后的测试类代码示例如下:
@RunWith(JUnitPlatform::class) class ChromeDriverConfigurationTest : Spek({ lateinit var chromeDriver: ChromeDriver // 整个测试组(当前类的所有测试)执行前仅运行一次 beforeGroup { chromeDriver = setupChromeDriverForTest() } // 所有测试结束后清理资源,避免文件占用 afterGroup { chromeDriver.quit() } given("chrome_driver") { on("fetching js text") { val path = ... // 你的测试业务逻辑代码 // 在这里正常使用chromeDriver即可 } } })
这样就能保证setupChromeDriverForTest()只执行一次,既解决了文件占用的异常,也能在测试结束后正确释放资源。
内容的提问来源于stack exchange,提问作者minizibi
相关产品推荐
相关产品推荐

