无法读取 aws 设备场中的属性文件
Posted
技术标签:
【中文标题】无法读取 aws 设备场中的属性文件【英文标题】:Can't read properties file in aws device farm 【发布时间】:2018-08-31 20:25:26 【问题描述】:
我的 Appium + JUnit 测试在本地运行良好,但在 aws 上找不到属性文件。我的测试放在src/test/java
下,测试中使用的属性文件放在src/test/resources/locale
下。
压缩依赖内容:
├── app-0.1-tests.jar
├── app-0.1.jar
└── dependency-jars
├── ...
app-0.1-tests.jar
内容:
├── META-INF
│ ├── MANIFEST.MF
│ ├── maven
│ ├── ....
├── com
│ ├── ....
└── locale
├── en_EN.properties
不幸的是,当我尝试加载属性文件时,我遇到了 IOException - 在以下位置找不到文件:
file:/tmp/scratchcC4yMz.scratch/test-packagefQ2euI/app-0.1-tests.jar!/locale/en_EN.properties
我尝试以几种方式加载它们,每次都遇到同样的问题。在当地,一切都像魅力一样。代码示例:
File file = new File(ClassName.class.getResource("/locale/en_EN.properties").getPath());
try (InputStream inputStream = new FileInputStream(file.getPath());
InputStreamReader streamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8")))
Properties properties = new Properties();
properties.load(streamReader);
return properties;
catch (IOException e)
System.err.println("Properties file not found: " + file.getPath());
或使用类加载器:
ClassLoader classLoader = getClass().getClassLoader();
URL resource = classLoader.getResource("/locale/en_EN.properties");
有人可以提出解决方案如何读取位于资源中的属性文件吗?
【问题讨论】:
我没有复制这个,但我认为问题出在语言环境前面的 / 上。你能把它改成:classLoader.getResource("locale/en_EN.properties");让我知道这有帮助吗? 您可以做一件事来确定它在哪里,将 /tmp/ 放在要提取哪些文件的主机输入中。您应该在“指定设备状态”页面上看到这一点。然后,您将在客户工件下载的 tmp 目录中获得所有内容的 zip @jmp 前面没有额外的 /getResource
返回 null,因此它不起作用。你能扩展你的第二个想法吗?我不确定如何进入 aws 设备场中的指定设备 tmp 文件夹。
【参考方案1】:
这是我所做的,它似乎有效:
/**
* Rigourous Test :-)
*/
public void testApp()
//taken from https://www.mkyong.com/java/java-properties-file-examples/
//create properties object
Properties prop = new Properties();
InputStream input = null;
//load in the properties file from src/test/resources
try
input = Thread.currentThread().getContextClassLoader().getResourceAsStream("myproperties.properties");
// load a properties file
prop.load(input);
// get the property value and print it out
System.out.println(prop.getProperty("devicefarm"));
catch (IOException ex)
ex.printStackTrace();
finally
if (input != null)
try
input.close();
catch (IOException e)
e.printStackTrace();
这是我的设备场的 java 输出:
[TestNG] Running:
Command line suite
helloWorld
这是我的属性文件的内容:
devicefarm=helloWorld
在我的本地测试中,它似乎也可以工作:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.devicefarm.www.AppTest
helloWorld
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.018 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
看起来,在属性文件被打包后,我们无法像在本地通过 maven 那样在 java 中引用它。如果我们尝试使 test-jar 可执行并运行 jar,我认为会发生同样的事情。
编辑:请参阅此 SO 帖子了解类加载器和线程加载器之间的区别。
https://***.com/a/22653795/4358385
关于导出 tmp 目录,在这个页面上我们可以告诉设备农场导出我们想要的任何目录
然后,当测试完成后,我们可以单击客户工件链接并获取该导出的 zip。
【讨论】:
也许您也知道如何读取位于项目主目录中的属性文件? 然后我们需要一个测试资源标签来告诉 maven 如果这些资源不在资源目录中,它们在哪里。以上是关于无法读取 aws 设备场中的属性文件的主要内容,如果未能解决你的问题,请参考以下文章
致命:无法读取“https://github.com”的用户名:没有这样的设备或地址 - rubyonrails - aws
如何在aws设备场中为android espresso每次测试运行后清除设备数据
在 aws-device 场中运行特定的 TestNG testng.xml 套件文件