无法读取 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 如果这些资源不在资源目录中,它们在哪里。 $project.basedir/src/test/resources

以上是关于无法读取 aws 设备场中的属性文件的主要内容,如果未能解决你的问题,请参考以下文章

致命:无法读取“https://github.com”的用户名:没有这样的设备或地址 - ruby​​onrails - aws

节点无法读取 AWS Beanstalk 中的环境变量

如何在aws设备场中为android espresso每次测试运行后清除设备数据

在 aws-device 场中运行特定的 TestNG testng.xml 套件文件

我们可以在 aws 设备场中为 Android espresso 测试禁用一个对话框吗

如何从 AWS lambda java 中的类路径加载属性文件