Не удается прочитать файл свойств в ферме устройств 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, то на этой странице мы можем указать ферме устройств экспортировать любые директории, которые мы хотим
Затем, когда тест завершен, мы можем щелкнуть ссылку на артефакты клиента и получить индекс этого экспорта.