Не удается прочитать файл свойств в ферме устройств aws


Мои тесты Appium + JUnit отлично работают локально, но на aws не могут найти файлы свойств. Мои тесты помещены под src/test/java и файлы свойств, используемые в тестах под src/test/resources/locale, Zip с содержанием зависимостей:

├── 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");

Может кто-нибудь предложить решение, как прочитать файл свойств, расположенный в ресурсах?

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

Может показаться, что после того, как файл свойств является пакетом, мы не можем ссылаться на него в Java так же, как мы делаем это локально через maven. Если мы попытаемся сделать исполняемый файл test-jar и запустить его, я думаю, что произойдет то же самое.

Редактировать: см. Этот пост, чтобы узнать разницу между загрузчиком классов и загрузчиком потоков.

/questions/9047837/resurs-java-iz-klassa-protiv-potoka/9047850#9047850

Что касается экспорта директории tmp, то на этой странице мы можем указать ферме устройств экспортировать любые директории, которые мы хотим

экспорт каталога tmp

Затем, когда тест завершен, мы можем щелкнуть ссылку на артефакты клиента и получить индекс этого экспорта.

Другие вопросы по тегам