在AWS环境中使用外部JSON测试数据时遭遇FileNotFoundException
从你提供的日志能看出,测试运行时找不到src/test/resources/LoginPage.json文件,导致抛出文件不存在的异常。这种问题大多和路径配置、资源打包逻辑或者AWS环境的路径特性有关,下面给你几个实用的排查和解决方向:
1. 先确认文件存在性与路径正确性
- 先检查本地项目里
src/test/resources/LoginPage.json是否真的存在,一定要注意文件名的大小写——AWS环境(比如EC2、Lambda)基本基于Linux系统,是严格区分大小写的,而本地如果是Windows系统不区分大小写,很容易因为这点疏忽导致线上找不到文件。 - 如果你用Maven或Gradle构建项目,要确保
src/test/resources是正确的测试资源目录,构建工具会自动把这个目录下的文件打包到测试类路径里。可以先在本地执行mvn test或者gradle test,确认本地能正常运行,先排除本地项目本身的问题。
2. 改用类加载器读取资源(推荐方案)
别再用硬编码的文件系统路径(比如new FileInputStream("src/test/resources/LoginPage.json"))了,AWS环境的运行目录和本地完全不一样,这种相对路径到了线上肯定会失效。改用类加载器从类路径读取文件,能适配所有运行环境:
// 方式1:通过当前测试类的类加载器读取 InputStream inputStream = LoginTest.class.getResourceAsStream("/LoginPage.json"); // 方式2:通过系统类加载器读取 InputStream inputStream = ClassLoader.getSystemResourceAsStream("LoginPage.json");
这种方式会自动从类路径里查找文件,只要文件被正确打包到测试包中,不管在本地还是AWS都能正常读取。
3. 检查AWS环境的资源打包与权限
- 如果是把项目打包后部署到AWS,建议解压测试包(比如测试JAR文件),确认
LoginPage.json是否在resources目录下,避免打包时不小心遗漏了资源文件。 - 如果是单独把文件上传到AWS服务器(比如EC2实例),要确保文件上传的路径和代码里写的路径完全一致,并且运行测试的用户拥有该文件的读取权限。可以通过SSH连接到EC2,执行
ls -l src/test/resources/LoginPage.json查看文件是否存在以及权限设置是否正确。
附相关报错日志:
[TestNG] INVOKING: "test" - testscripts.LoginTest.loginWithValidCredentialsTest()
[Invoker 1915058446] Invoking testscripts.LoginTest.loginWithValidCredentialsTest
2018-01-22 15:09:25 INFO testpages.LoginPage:46 - 点击了跳过按钮
2018-01-22 15:09:27 INFO testpages.LoginPage:50 - 点击了登录按钮
2018-01-22 15:09:27 INFO testpages.LoginPage:96 - 输入用户名和密码
java.io.FileNotFoundException: src/test/resources/LoginPage.json (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.(FileInputStream.java:138)
内容的提问来源于stack exchange,提问作者Suraj Jogdand

