Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Структуры данных

Все темы QA

Что такое PageObject и PageFactory?

PageObject и PageFactory — это концепции, используемые в автоматизации тестирования веб-приложений, особенно с использованием фреймворка Selenium.

  1. PageObject:

    • Определение: Это шаблон проектирования, который используется для абстрагирования веб-страницы или её части в отдельные классы, которые называются PageObject. Каждая страница (или фрагмент страницы) имеет свой собственный класс, который содержит методы для взаимодействия с элементами на этой странице.

    • Пример: Класс LoginPage, который содержит методы для заполнения полей логина и пароля, а также кнопки входа.

  2. PageFactory:

    • Определение: Это вспомогательный класс в Selenium, который помогает инициализировать элементы на веб-странице в PageObject. Он предоставляет аннотации для элементов на странице, которые автоматически инициализируются при вызове PageFactory.initElements(driver, this).

    • Пример: Аннотация @FindBy используется для поиска элементов на странице по селектору (CSS, XPath и т. д.) и их инициализации.

Пример использования:

public class LoginPage {

    @FindBy(id = "username")
    private WebElement usernameInput;

    @FindBy(id = "password")
    private WebElement passwordInput;

    @FindBy(id = "login-button")
    private WebElement loginButton;

    public LoginPage(WebDriver driver) {
        PageFactory.initElements(driver, this);
    }

    public void enterUsername(String username) {
        usernameInput.sendKeys(username);
    }

    public void enterPassword(String password) {
        passwordInput.sendKeys(password);
    }

    public void clickLoginButton() {
        loginButton.click();
    }
}

Это позволяет создать чистый и модульный код для автоматизированного тестирования, упрощая поддержку и повторное использование.


Какая иерархия Collections?

Иерархия коллекций в Java представляет собой иерархию классов и интерфейсов, предназначенных для хранения и манипуляций с данными. Основные элементы иерархии включают:

  1. Интерфейс Collection:

    • Наследники: List, Set, Queue.

    • Основные методы: add, remove, size, isEmpty, contains и другие для базовых операций с элементами коллекции.

  2. Интерфейс List:

    • Наследники: ArrayList, LinkedList, Vector.

    • Основные методы: get, set, add, remove, indexOf и другие для работы с упорядоченными коллекциями с возможностью дублирования элементов.

  3. Интерфейс Set:

    • Наследники: HashSet, TreeSet, LinkedHashSet.

    • Основные методы: add, remove, contains, size и другие для работы с коллекциями, которые не содержат дублирующихся элементов.

  4. Интерфейс Queue:

    • Наследники: LinkedList, PriorityQueue.

    • Основные методы: add, remove, element, offer, poll и другие для реализации структур данных очереди.

  5. Интерфейс Map:

    • Наследники: HashMap, TreeMap, LinkedHashMap.

    • Основные методы: put, get, remove, containsKey, containsValue и другие для работы с отображениями (ключ-значение).

Эта иерархия позволяет выбирать наиболее подходящий тип коллекции в зависимости от требований к хранению данных и типа операций, которые необходимо выполнить.


Какая разница между Thread class и Runnable interface?

В Java разница между классом Thread и интерфейсом Runnable связана с тем, как реализуются параллельные задачи:

  • Thread класс:

    • Наследование: Класс Thread сам по себе является потоком исполнения (Thread).

    • Реализация: При использовании класса Thread вы создаёте новый поток путём наследования от Thread и переопределения метода run().

    • Ограничения: Использование Thread ограничено одиночным наследованием, так как Java поддерживает только одиночное наследование классов.

Пример использования:

class MyThread extends Thread {
    public void run() {
        // Код, выполняемый в отдельном потоке
    }
}
  • Runnable интерфейс:

    • Реализация: Интерфейс Runnable предоставляет альтернативный способ создания потока, отделяя задачу исполнения от самого потока.

    • Использование: Вы можете реализовать интерфейс Runnable и передать его экземпляр в конструктор Thread или в исполнитель (Executor).

    • Преимущества: Использование интерфейса Runnable упрощает повторное использование кода и повышает гибкость, так как не требует наследования.

Пример использования:

class MyRunnable implements Runnable {
    public void run() {
        // Код, выполняемый в отдельном потоке
    }
}

// Создание потока на основе Runnable
Thread thread = new Thread(new MyRunnable());

Runnable отделяет задачу от способа её выполнения. Объект можно передать Thread или Executor; сам по себе Runnable не создаёт поток. Для запуска нового Thread нужен start(), прямой вызов run() выполняется в текущем потоке.


Какая разница между String, Stringbuffer и Stringbuilder?

В Java есть три основных класса для работы с текстовыми строками: String, StringBuffer и StringBuilder. Вот их основные различия:

  1. String:

    • Неизменяемость: Объекты класса String неизменяемы, что означает, что после создания строки её нельзя изменить.

    • Потокобезопасность: Строки являются потокобезопасными (thread-safe), так как не могут быть изменены из разных потоков.

    String str = "Hello";
    str += " World"; // Создаётся новая строка "Hello World"
  2. StringBuffer:

    • Изменяемость: StringBuffer предназначен для работы с изменяемыми строками.

    • Потокобезопасность: StringBuffer является потокобезопасным (thread-safe) благодаря синхронизированным методам.

    StringBuffer sb = new StringBuffer("Hello");
    sb.append(" World"); // Изменяет текущий объект StringBuffer
  3. StringBuilder:

    • Изменяемость: StringBuilder также предназначен для работы с изменяемыми строками, но не синхронизирован.

    • Производительность: StringBuilder обычно быстрее, чем StringBuffer, потому что не имеет накладных расходов на синхронизацию.

    StringBuilder sb = new StringBuilder("Hello");
    sb.append(" World"); // Изменяет текущий объект StringBuilder

Выбор между ними:

  • Используйте String, когда строка не будет изменяться.

  • Используйте StringBuffer, когда потребуется многопоточный доступ к изменяемой строке.

  • Используйте StringBuilder в однопоточных приложениях, где требуется эффективная работа с изменяемыми строками.


Разница между final, finally и finalize?

В Java final, finally, и finalize выполняют разные функции:

  1. final:

    • Ключевое слово: Используется для объявления констант, запрета наследования классов и запрета переопределения методов.

    • Примеры использования:

      • Для переменной: final int number = 42; — переменная number не может быть изменена после инициализации.

      • Для класса: final class MyFinalClass {} — класс MyFinalClass не может быть унаследован.

      • Для метода: final void myMethod() {} — метод myMethod не может быть переопределен в подклассах.

  2. finally:

    • Блок кода: Часть конструкции try-catch, который выполняется после блоков try и catch, независимо от того, произошло исключение или нет.

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

    • Пример использования:

      try {
          // код, который может вызвать исключение
      } catch (Exception e) {
          // обработка исключения
      } finally {
          // код, который выполняется после try/catch
      }
  3. finalize:

    • Метод finalize() относится к устаревшему механизму финализации; начиная с Java 18 он помечен для удаления. Его выполнение и своевременность не гарантированы.

    • Назначение: Предназначен для освобождения ресурсов, которые не управляются системой сборки мусора (например, нативные ресурсы).

    • Использование: Использование метода finalize() не рекомендуется, так как вызов метода не гарантирован и может привести к непредсказуемому поведению. Вместо него предпочтительнее использовать try-with-resources или явное закрытие ресурсов.

    • Пример:

      @Override
      protected void finalize() throws Throwable {
          // очистка перед уничтожением
          super.finalize();
      }

Эти элементы языка выполняют различные функции и используются в соответствии с их предназначением в разных аспектах программирования на Java.

Эта страница была полезной?