Найти тему

Вопросы собеседования на позицию автотестировщика python

Оглавление

1. Главные особенности Python в отличие от других языков (например, Java, C#)?

Краткий ответ: Python — это интерпретируемый язык с динамической типизацией.

Более подробно: В отличие от Java и C#, Python не требует предварительной компиляции, так как является интерпретируемым языком. Также Python использует динамическую типизацию: тип переменной определяется во время выполнения программы, а не на этапе компиляции. Это делает его более гибким, но может снижать производительность по сравнению с языками со статической типизацией.

2. В каком порядке вызываются фикстуры?

Краткий ответ: Фикстуры с более широким скоупом вызываются раньше.

Более подробно: Фикстуры с большими скоупами (например, session) выполняются раньше фикстур с меньшими скоупами (например, function). Если нужно контролировать порядок вызова, можно передавать одну фикстуру в другую, но важно следить за тем, чтобы скоуп более поздней фикстуры не был меньше, чем у передаваемой.

3. В чем разница между list, tuple, set?

Краткий ответ: list — упорядоченный, изменяемый; tuple — упорядоченный, неизменяемый; set — неупорядоченный, изменяемый, уникальные элементы.

Более подробно:

list: поддерживает индексацию, элементы можно изменять (добавлять, удалять, заменять).
tuple: поддерживает индексацию, но элементы неизменяемы после создания.
set: неупорядоченная коллекция, которая не допускает дублирующихся элементов и не поддерживает индексацию.

4. Виды сортировки в python

Краткий ответ:

Встроенные:

  • sorted() — возвращает новый отсортированный список.
  • list.sort() — сортирует список на месте.

Можно реализовать пользовательские алгоритмы сортировки (просто пример, можно и другие):

  • Пузырьком (Bubble Sort)
  • Вставками (Insertion Sort)
  • Слиянием (Merge Sort)
  • Быстрая сортировка (Quick Sort)

Сортировки от библиотек:

  • numpy.sort()
  • pandas.DataFrame.sort_values()

Более подробно про пользовательские алгоритмы сортировки можно прочитать здесь.

5. Изменится ли содержимое кортежа после tpl[3].append(4)?

Краткий ответ: Да, изменится.

Более подробно:

Кортежи сами по себе неизменяемы, но если внутри кортежа есть изменяемый объект (например, список), то его содержимое можно изменить. В данном случае tpl[3] — это список, и операция append() изменяет его содержимое.

6. Знаете ли какие-нибудь встроенные в Python декораторы?

Краткий ответ: @staticmethod, @classmethod, @lru_cache, @dataclass.

Более подробно:

@staticmethod используется для объявления статического метода в классе. Статические методы не привязаны к экземпляру класса и не требуют передачи аргумента self (или cls). Они работают как обычные функции, но принадлежат пространству имен класса.
Особенности:

  • Статический метод может быть вызван как на классе, так и на экземпляре класса.
  • Не может взаимодействовать с экземпляром класса через self и не имеет доступа к атрибутам класса через cls.

@classmethod объявляет метод класса, который принимает класс как первый аргумент, обычно называемый cls. Такие методы могут взаимодействовать с атрибутами и методами класса, но не с конкретным экземпляром.

Особенности:

  • Метод класса всегда получает первым аргументом сам класс (cls).
  • Может изменять атрибуты класса или вызывать другие методы класса.
  • Полезен при работе с фабричными методами или при необходимости изменения состояния класса.

@lru_cache — это декоратор из модуля functools, который используется для мемоизации (кэширования) результатов функции. Это означает, что если функция вызывается с теми же аргументами несколько раз, результат берется из кэша, а не вычисляется повторно. "LRU" означает "Least Recently Used" (наименее недавно использованный) — это механизм, который автоматически очищает кэш, если он превышает заданный лимит.

Особенности:

  • maxsize определяет максимальное количество записей в кэше. Когда лимит превышен, удаляются наименее используемые записи.
  • Это полезно для функций, результаты которых часто повторяются при одинаковых входных данных, например, вычисление чисел Фибоначчи.
  • Улучшает производительность за счет повторного использования ранее вычисленных значений.

@dataclass — это декоратор из модуля dataclasses, который автоматически генерирует для класса методы, такие как __init__, __repr__, __eq__, и другие, на основе объявленных атрибутов. Это значительно упрощает создание классов для хранения данных.

Особенности:

  • Генерирует методы __init__, __repr__, __eq__, и другие автоматически.
  • Позволяет сосредоточиться на описании структуры данных, а не на ручном написании типичных методов.
  • Может быть настроен через параметры декоратора: например, можно указать, нужно ли генерировать метод __eq__ или __repr__.

7. Как пройтись по всем парам ключ-значение в словаре?

Краткий ответ: Использовать цикл for key, value in dct.items().

Более подробно: Метод items() возвращает итерируемый объект, который содержит пары "ключ-значение" словаря. В цикле for можно удобно работать с этими парами.

8. Какие типы данных вы знаете?

Краткий ответ: None, bool, int, float, complex, list, tuple, str, bytes, bytearray, memoryview, set, frozenset, dict.

Более подробно: Python поддерживает множество типов данных, включая примитивные (например, int, float, bool) и сложные структуры данных (например, списки list, множества set, словари dict).

9. Какие типы скоупов фикстур существуют?

Краткий ответ: function, class, module, package, session.

Более подробно:

function: фикстура создаётся и уничтожается для каждого теста.
class: фикстура создаётся для каждого класса тестов.
module: фикстура создаётся для каждого модуля (файла с тестами).
package: фикстура создаётся для каждого пакета.
session: фикстура создаётся один раз на всю сессию тестирования.

10. Какой фикстурой можно прогнать тест несколько раз на разных данных?

Краткий ответ: @pytest.mark.parametrize.

Более подробно: Декоратор @pytest.mark.parametrize позволяет запускать тесты с разными наборами данных, передавая значения в параметры теста.

11. Что такое класс?

Краткий ответ: Класс — это шаблон для создания объектов.

Более подробно: Класс определяет свойства и методы, которые могут иметь его экземпляры (объекты). Класс задает структуру и поведение объектов, которые будут создаваться на его основе.

12. Что такое композиция?

Краткий ответ: Композиция — это когда один класс содержит объект другого класса.

Более подробно: Композиция выражает отношение "имеет" (например, машина имеет двигатель). Это позволяет разделять ответственность между классами и использовать объекты других классов как компоненты в более сложных объектах.

13. Основные функции по работе с JSON в Python?

Краткий ответ: Запись с помощью dump() и dumps(), чтение с помощью load() и loads().

Более подробно:

dump(): записывает объект в JSON-файл.
dumps(): преобразует объект в строку в формате JSON.
load(): считывает данные из JSON-файла и преобразует их в Python-объект.
loads(): преобразует строку в формате JSON в Python-объект.

14. Что такое объект?

Краткий ответ: Объект — это экземпляр класса.

Более подробно: Объект — это конкретная реализация класса, которая имеет свои собственные значения полей (атрибутов) и может выполнять методы, определённые в классе.

15. Определение ООП

Краткий ответ: Программирование на основе взаимодействия объектов.

Более подробно: ООП (Объектно-ориентированное программирование) — это парадигма программирования, где программа состоит из объектов, которые взаимодействуют между собой. Объекты — это экземпляры классов, а классы могут образовывать иерархию через наследование.

16. Что такое поля и методы?

Краткий ответ: Поля — это свойства объекта, методы — его функции.

Более подробно:

Поле: хранит данные объекта.
Метод: функция, определённая в классе, которая позволяет объекту выполнять действия или изменять свои данные.

17. Принципы ООП

Краткий ответ: Абстракция, инкапсуляция, наследование, полиморфизм.

Более подробно:

Абстракция: выделение ключевых характеристик объекта, игнорируя несущественные детали.
Инкапсуляция: скрытие внутренней реализации объекта и предоставление доступа только через интерфейс.
Наследование: создание нового класса на основе существующего с возможностью дополнения/изменения поведения.
Полиморфизм: способность объектов разных классов реагировать на одно и то же сообщение по-разному.

Еще более подробно в статье: Принципы ООП

18. Циклы (for, while, do-while)

Краткий ответ: Управляют выполнением кода через итерации.

Более подробно:

for: выполняет код для всех элементов итерируемого объекта (например, списка).
while: выполняет код, пока условие истинно.
do-while: отсутствует в Python, но аналог можно создать с помощью while и дополнительных проверок.

19. Чем отличаются генераторы от итераторов?

Краткий ответ: Генератор отложенно создаёт значения, итератор обходит элементы.

Более подробно:

Итератор — это объект, который реализует интерфейс итерации. В Python он должен реализовать два метода:

  • __iter__() — возвращает сам итератор.
  • __next__() — возвращает следующий элемент последовательности или вызывает исключение StopIteration, если элементы закончились.

Пример создания собственного итератора:

Генераторы — это специальные функции, которые позволяют "лениво" возвращать элементы по одному за раз, вместо того чтобы возвращать все элементы сразу. Это полезно для работы с большими данными, когда хранение всех элементов в памяти может быть неэффективным или невозможным.

Генераторы создаются с помощью ключевого слова yield. Отличие от обычной функции в том, что генератор сохраняет своё состояние после каждого вызова yield, что позволяет продолжить выполнение функции с того места, где она была прервана.

Пример:

-2

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

  • Экономия памяти: Генераторы не создают полный список в памяти, а возвращают элементы по одному.
  • Ленивое выполнение: Генераторы не выполняют всю работу сразу, а только когда это необходимо.
  • Читаемость кода: Генераторы могут сделать ваш код более понятным и выразительным при работе с последовательностями.


20. Чем отличаются изменяемые и неизменяемые данные?

Краткий ответ: Изменяемые данные можно модифицировать после создания, неизменяемые — нет.

Более подробно:

Изменяемые: объекты, такие как списки (list), множества (set) и словари (dict), которые можно изменять (добавлять, удалять элементы).

Неизменяемые: объекты, такие как строки (str), целые числа (int), кортежи (tuple), которые нельзя изменить после создания. Если вы пытаетесь изменить такие объекты, создаётся новый объект.

Важно отметить, что в Python всё является объектом, включая целые числа и строки (это примечание для тех кто пришел из Java например).

21. Что такое *args и **kwargs?

Краткий ответ: *args передаёт произвольное количество аргументов, **kwargs — произвольное количество именованных аргументов.

Более подробно:

*args: позволяет передать в функцию произвольное количество позиционных аргументов как кортеж.

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

-3

**kwargs: позволяет передать произвольное количество именованных аргументов в виде словаря.

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

-4

22. Что такое hooks в pytest?

Краткий ответ: Это специальные методы для изменения поведения pytest.

Более подробно: Hooks (хуки) позволяют разработчикам изменять и расширять стандартное поведение pytest (например, поведение при запуске тестов, обработке исключений). Это мощный инструмент для создания плагинов и расширений.

23. Что такое lambda в Python?

Краткий ответ: Анонимная функция в одну строку.

Более подробно:

Lambda-функция — это небольшая анонимная функция, которая может содержать только одно выражение и не имеет имени. Она часто используется для кратких операций, которые не требуют создания полноценной функции.

Пример lambda функции:

-5

24. Что такое декоратор?

Краткий ответ: Обёртка над функцией, изменяющая её поведение без изменения исходного кода.

Более подробно:

Декоратор — это функция, которая принимает другую функцию и возвращает новую функцию с изменённым поведением. Это позволяет модифицировать функциональность без изменения исходного кода, например, добавляя логирование, кэширование или контроль доступа.

Пример декоратора:

-6

Что происходит в коде:

  • Мы определяем декоратор my_decorator, который принимает функцию в качестве аргумента (func), а внутри создается функция wrapper, которая оборачивает вызов оригинальной функции.
  • Декоратор добавляет поведение перед и после вызова функции say_hello.
  • Когда используется синтаксис @my_decorator, это эквивалентно вызову say_hello = my_decorator(say_hello).
  • Когда вызывается say_hello(), сначала выполняется код декоратора, затем вызывается исходная функция, и потом выполняется код после неё.

25. Что такое контекстный менеджер в Python?

Краткий ответ: Управляет ресурсами через конструкцию with.

Более подробно:

Контекстный менеджер управляет ресурсами (например, файлами, подключениями) и гарантирует их корректное освобождение (например, закрытие). Конструкция with упрощает работу с такими ресурсами, автоматически вызывая методы для захвата и освобождения.

Пример:

-7

В этом примере:

  • Метод __enter__ открывает файл и возвращает его.
  • Метод __exit__ автоматически закрывает файл, даже в случае возникновения исключений.

Пример 2: Контекстный менеджер с помощью декоратора contextlib

-8

Здесь:

  • Блок перед yield выполняется при входе в контекст.
  • Блок после yield выполняется при выходе из контекста, даже если возникло исключение.

Оба примера демонстрируют одно и то же поведение: открытие и автоматическое закрытие файла после завершения работы с ним.

26. Что такое линтер (linter)?

Краткий ответ: Программа для проверки кода на соответствие стилю и правилам.

Более подробно:

Линтер проверяет код на различные ошибки, нарушения стиля и потенциальные проблемы (например, неиспользуемые переменные, лишние скобки и т.д.). Линтеры помогают сделать код более чистым, единообразным и безопасным. В Python популярны такие линтеры, как flake8 и pylint.

-9

Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?

Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика

Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.

Обязательно прочитайте: Что должен знать и уметь тестировщик

Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам