如何在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
相关产品推荐
相关产品推荐

