You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin打包的可执行Jar中调用resources目录下的TestNG XML文件

问题原因

TestNG 的 setTestSuites() 方法默认仅支持读取文件系统中的独立XML文件,打包为JAR后,resources目录下的文件属于JAR包内部的资源条目,不属于操作系统文件系统的独立文件,直接传路径无法识别。

解决方案

有两种常用实现方式,均可跨机器正常运行:

方式1:直接解析资源流(推荐,无需生成临时文件)

通过TestNG自带的XML解析API直接读取JAR包内的资源流,不用写到本地磁盘:

import org.testng.TestNG
import org.testng.xml.XmlSuite
import org.testng.xml.Parser
import java.io.InputStreamReader

class Main {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val testng = TestNG()
            // 读取JAR包内resources下的AppiumRegression.xml
            val xmlResource = javaClass.classLoader.getResourceAsStream("AppiumRegression.xml")
                ?: throw IllegalArgumentException("资源文件AppiumRegression.xml不存在于JAR包内")
            // 直接解析资源流为TestNG可识别的XmlSuite对象
            val suites: List<XmlSuite> = Parser<XmlSuite>(InputStreamReader(xmlResource)).parse()
            testng.setXmlSuites(suites)
            testng.run()
        }
    }
}

方式2:转存为临时文件

如果需要保留原始XML文件的本地副本,可以将资源流写入系统临时目录后传给TestNG:

import org.testng.TestNG
import java.io.File
import java.nio.file.Files
import java.nio.file.StandardCopyOption

class Main {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val testng = TestNG()
            val suites = mutableListOf<String>()

            val xmlResource = javaClass.classLoader.getResourceAsStream("AppiumRegression.xml")
                ?: throw IllegalArgumentException("资源文件AppiumRegression.xml不存在于JAR包内")
            // 创建临时文件,JVM退出时自动删除
            val tempXmlFile = File.createTempFile("AppiumRegression", ".xml").apply {
                deleteOnExit()
            }
            // 将资源流写入临时文件
            Files.copy(xmlResource, tempXmlFile.toPath(), StandardCopyOption.REPLACE_EXISTING)
            
            suites.add(tempXmlFile.absolutePath)
            testng.setTestSuites(suites)
            testng.run()
        }
    }
}

注意事项

  • 若XML存放在resources的子目录下,比如resources/testng/AppiumRegression.xml,读取时路径填写"testng/AppiumRegression.xml"即可,不需要加前缀/
  • 需确认构建配置(Maven/Gradle)已将resources目录下的XML文件纳入打包范围,默认构建规则都会自动包含该目录下的文件

内容的提问来源于stack exchange,提问作者dramos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:27:05