Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как правильно организовать работу с ссылками на файлы в разных ОС

windows
linux
junit
java
Теги: #<Tag:0x00007f7b65959a38> #<Tag:0x00007f7b659598f8> #<Tag:0x00007f7b659597b8> #<Tag:0x00007f7b65959678>

(Алена Розумнюк) #1

Уважаемое сообщество, помогите, пожалуйста.
Проблема вот в чем: я пишу тесты, используя WebDriver + JUnit.
Пишу и до последнего момента гоняла свои тесты только на базе ОС Windows
Соответственно, все ссылки на файлы, которые должны быть загружены во время тестов, прописаны в формате:
БАЗОВЫЙ ПУТЬ + “\папка_1\папка_2\Файл”
Теперь мне предстоит использовать тесты для Линукс.
И путь к файлу должен выглядеть вот так: БАЗОВЫЙ ПУТЬ + “/папка_1/папка_2/Файл”.
Я думаю решать это таким путем: нужно будет создать обертку, в которой будет проверяться тип файловой системы, и если ОС != Windows, выполнять замену \ на /
Собственно вопрос: не изобретаю ли я велосипед, возможно, у меня в корне неправильный подход к вопросу?


(Борис Осипов) #2

Вы можете писать и Windows пути как “/папка_1/папка_2/Файл”.:wink:


(Vitalik Marchenko) #3

в Python есть модуль os и если например писать os.path.join(base_path, ‘папка_1’, ‘апка_2’, ‘Файл’), то все должно норм отрабатывать на Linux и MacOS


(Евгений Бухгаммер) #4

Как видите, в виндоус можно обращаться к папкам и так.


#5

эмм, при чем тут Питон[quote=“asatt1979, post:1, topic:8700”]
я пишу тесты, используя WebDriver + JUnit
[/quote]


#6

А если использовать CalssLoader? http://stackoverflow.com/a/3862115/2504101


(Vitalik Marchenko) #7

думаю нечто подобное можно сделать не только в питоне


#8

Не нужно писать своих условий в зависимости от ОС, есть же системное свойство:

System.getProperty("path.separator")

А вообще, правы люди, Java должна понимать пути с ‘/’ даже в Windows. Если только готовый путь где-то еще используется, тогда можно поменять.


(Stan) #9

Обычный слэш распознается одинаково всеми системами, поэтому самый простой способ использовать его и не делать никаких замен. Обратный, да, будет считаться за знак экранирования в linux подобных системах.

Так что решение или делать обычный слеш /, или двойной обратный - \\ (тоже будет корректно работать на всех системах, т.к. он будет как-бы экранировать один одиночный слеш, а винде все равно сколько там слешей).


(Viktor Sorokolet) #10

Привет всем! У меня тож была подобная проблема. Я решил ее следующим образом, те файлы, что нужны были для тестов (фото для аватаров, фото товаров) я просто положил в resources/имя_каталога и соответственно они переносились с платформы - на другую платформу без особых проблем. Если нужны “тонкости” - поделюсь с удовольствием.


(Алена Розумнюк) #11
  1. Файлы у меня лежат в папке resources/имя_каталога
    для метода sendKeys() в качестве параметра я передаю строку FILE, объявленную вот так:
    public static final String FILE = BASE_PATH + “tests/java/src/test/resources/Files/file.xls”;
    Если использовать путь в таком вот виде - метод не отрабатывает.
    Если использовать вот так:
    public static final String FILE = BASE_PATH + “tests\\java\\src\\test\\resources\\Files\\file.xls”;
    Все отлично проходит.
  2. я так понимаю, что использование CalssLoader http://stackoverflow.com/a/3862115/2504101 решит проблему
  3. Но я не понимаю, почему " Java должна понимать пути с ‘/’ даже в Windows", а у меня не понимает? ЧЯДНТ?

(Viktor Sorokolet) #12

Моя реализация такая:

File fileA = new File("src/test/resources/images/au_no1.jpg");
String fileAvatar = fileA.getAbsolutePath();

строку fileAvatar передаю в sendKeys


(Алена Розумнюк) #13

Да! так работает,
у этого File есть public abstract String normalize(String path), который приводит мою абракадабру к корректному виду.

С помощью classLoader получилось вот так:
String file = getClass().getResource("/Files/file.xls").toString;

Спасибо огромное за помощь!


(Sergey Korol) #14

Этот велосипед уже давно изобретен в apache-commons-io -> FileNameUtils.separatorsToSystem.


(Jane Tymoschuk) #15

А мне в последнее время понравился такой подход:
Paths.get("folder","subfolder","filename.extension").toFile();

Очень лаконично и симпатично, как на мой взгляд