вторник, 7 февраля 2017 г.

Подборка материалов для подготовки к QA Interview (QA, Automation & Python, Linux & Networks)

Всем привет,

как и многие технические специалисты и менеджеры, я проходил и проводил множество технических интервью на позицию QA Engineer / QA Automation Engineer / Software Engineer In Testing и пр., каждая компания называет это по-своему.

Сегодня решил выложить свою подборку ссылок на интересные статьи, позволяющих быстро (за несколько дней) освежить в памяти то, что может пригодиться для прохождения технического собеседования на позицию QA Engineer / QA Automation Engineer.

Когда я сам готовился к прохождению технического интервью, мне помогали похожие статьи (например, эта и эта), но эти статьи были преимущественно ориентированны на разработчиков, поэтому я надеюсь что данная статья будет полезна многим QA инженерам, как пригодилась бы мне раньше :)

Темы, которые надо выучить, чтобы просто не выглядеть неучем (и не только не выглядеть, но и не быть им):



Linux
1) Загрузка компьютера от нажатия кнопки до запуска браузера (неплохая короткая статья);
2) Основные команды bash: ls / grep / cat / top / atop / free / lsof / netstat / sed / awk, pipes, перенаправление ввода/вывода, циклы и условия (например, такой вопрос: как написать цикл в одну строку, чтобы он печатал цифры от 1 до 10).

Networks
По сетям, если они хоть немного нужны на проекте, на интервью вам потребуются базовые знания, однако прочитать обо всём этом за пол часа до собеседования, если вы этого совсем не знаете - скорее всего не получится, так как информации очень много, и надо не просто заучить, но и понимать основные идеи.
Вопросы по сетям на собеседованиях включают в себя:
1) MAC/IPv4/IPv6 адреса - в чем отличия, зачем нужны, ARP, routing table / net masks;
2) Отличие TCP/UDP траффика. И помните, что ping использует ICMP протокол, это не TCP/UDP;
3) NAT, что это и как происходит трансляция адресов (можно начать с этой статьи);
4) VLANs - зачем нужны, как используются, на каком уровне модели OSI они работают. Любимый вопрос по этой теме от молодых инженеров - чему равно максимальное количество VLANs для одного устройства? (Википедия уже все знает);
5) Что происходит, когда в строке браузера мы набираем yandex.ru (рассказываем по шагам про DNS, routing table, ARP, NAT, TCP handshake - ну очень подробная статья - стоит прочесть даже если вы думаете что все это знаете);
6) Содержание TCP пакета (заголовок и данные), для чего нужно и как происходит трехэтапное рукопожатие при установлении TCP сессии и коды для каждого и них, как делается проверка того, что пакеты доставлены без потерь и ошибок (очень интересная статья - Головоломки TCP);
7) Основные инструменты для настройки сетевых интерфейсов в Linux: ifconfig / ip / route / tracepath / arp / iftop / tcpdump. Будет лучше если у вас есть опыт использования этих инструментов, чтобы вы сразу могли сказать какая из этих программ для чего используется, какие основные проблемы помогает диагностировать.

Python
По Python тоже можно придумать очень много вопросов (см. чуть ниже), но если в вакансии есть требование "знание Python" то вам, как минимум, необходимо знать:
1) Базовые типы данных в Python (dict, list, set, tuple, string), базовые стандартные функции для обработки базовых структур данных (map, zip, cmp, sorted, filter) и их применение в простых задачах на обработку масивов данных (отсортировать словарь по значениям ключей, отсортировать элементы одного списка по значениям элемента другого списка, найти факториал числа, найти в строке символ, который встречается чаще всего);
2) Прочесть и попробовать примеры отсюда или каких-то похожих статей, в них можно найти что-то неочевидное и новое для себя, даже если вы давно пишете на Python (вот еще одна статья).

QA (помните, что это ваша основная тема для позиции QA Engineer)
1) Какие виды/классификации тестирования бывают и чем они отличаются (чем функциональное отличается от интеграционного, а нагрузочное тестирование от тестирования производительности);
2) Создание тестовых сценариев для простой формочки (тест дизайн - граничные значения входных и выходных данных, pairwise - в чём идея, почему можно выбрать только некоторые комбинации входных и выходных данных, а остальное не проверять и т.д.);
3) Материалы для размышлений: раз и два;
4) Читаете ли вы блоги / форумы по тестированию (можете так же вступить в QA группы в VK (там много мусора, но иногда бывает интересно)), ведёте ли свой блог или участвуете ли в конференциях? (если ещё нет, то начинайте по-тихоньку проникаться этим, надо знать звезд QA тусовки и популярных блогеров (например, Michael Bolton, James Bach, Katrina the Tester, Google QA blog), популярные форумы, горячие темы, которые сейчас обсуждаются в QA сообществе).

Пример вопросов на понимание, ответы на которые должны быть осмыслены и подтверждены примерами:

1) Чем отличается компонентное функциональное тестирование от интеграционного? Зачем нужно интеграционное тестирование?
Компонентное тестирование направлено на функциональное тестирование каждого отдельного компонента системы. Интеграционное - направлено на проверку совместимости интерфейсов различных модулей разрабатываемой системы. Большая часть ошибок программного обеспечения находится именно  в области взаимодействия различных программных модулей, поэтому этот вид тестирования очень важен.

2) Чем отличается нагрузочное тестирование от тестирования производительности или от стресс тестирования?
Это я уже описывал в моем блоге ранее. Очень важно понимать ответ на этот вопрос, если вы хотите заниматься этими видами тестирования или подобный опыт требуется для данной вакансии.

Темы посложнее, которые можно освежить в памяти, чтобы не сомневаться в успехе:

Программирование
Есть алгоритмы, которые лучше повторить и попробовать написать самостоятельно перед собеседованием, чтобы в случае необходимости быстро вспомнить и применить (да и как разминка для мозга полезно):
1) quick sort, пирамидальная сортировка (знайте их свойства, попробуйте самостоятельно написать алгоритм на языке программирования, потом поищите примеры реализации в Интернете и сравните);
2) Создание и разворот в обратную сторону однонаправленного списка (попробуйте написать сами, мой пример решения можно посмотреть здесь);
3) Парсер арифметических выражений (таких как "2 + 5*6") - попробуйте написать сами, если для вас это слишком просто - добавьте туда скобки (или несколько видов скобок) - полный разбор решения можно посмотреть здесь. Сама идея задачи, а так же два примера решения на Java взяты здесь. Конечно, задачка больше для разработчиков, чем для QA, но если вы способны решить эту задачу, то более простые задачи вас не застанут врасплох;
4) Проштудировать один или несколько сборников задачек для собеседований, например, этот сборник очень популярен.

Linux
Более продвинутые вопросы по Linux, которые реально задают на собеседованиях на позицию QA Automation Engineer:
1) Что такое зомби процессы (это просто, но до недавнего времени я неправильно понимал что это такое, поэтому можно почитать это и проверить самих себя);
2) Что такое system/user spaces;
3) Как работает fork (это просто, но нельзя забывать);
4) Unix/Network Sockets (прочтите эту короткую и содержательную статью);
5) Синхронизация процессов (семафоры, мьютексы, сокеты, pypelines, сигналы) - книга "UNIX: взаимодействие процессов", для тех, кому интересно;
6) Сигналы, которые можно отправлять процессам, какие из этих сигналов нельзя перехватить (иногда спрашивают даже название разных сигналов и что они делают). Читаем здесь;
7) Основные инструменты для отладки сетей (netstat, ip, ifconfig, brctl, tcpdump, ping, route, tracepath, nslookup, nc), парсинга лог файлов (grep, less, tail), профилирования производительности (atop / htop / iotop / iostat / iftop), отладки и дебага (strace), и редактирования конфигурационных файлов (vim, nano, sed).

Networks
Иногда QA инженерам задают такие вопросы:
1) Статическая и динамическая маршрутизация (BGP, RIP, OSPF and etc);
2) Как работает HTTPS протокол, как обеспечивается безопасность передаваемых по нему данных (есть отличные статьи: раз и два);
3) VPN/IPSec тунели, в чём основная задача и как это реализовано.

Python
Из всех интервью для QA Automation, в которых я учавствовал, меня об этом, к сожалению, не спрашивали, но я готовился к этим вопросам, да и просто полезно знать (чтобы читать чужой код и писать более качественные автотесты):
1) Декораторы с параметрами (есть две отличные статьи: 1 и 2);
2) Контекстные менеджеры (например, with, или написание собственных контекстных менеджеров);
3) Метаклассы (короткая и простая статья);
4) Магические методы классов и для чего они применяются (можно начать с этой статьи);
5) Как устроены базовые типы данных языка Python, что такое hashable tables, как они работают, какие у них есть проблемы и способы их решения (для начала можно почитать эту статью);
6) GIL и его проблемы (статья с картинками) и что изменилось в Python 3.2 (хорошая статья), отличие multiprocessing vs threding;
7) Функциональное программирование (например, легкая статья на эту тему);
8) Как Python следит за объектами в памяти и удаляет их (начать можно с этой статьи);
9) Что такое __slots__ и как это использовать (подробно описано здесь, кратко здесь).

QA Automation
Если вы собеседуетесь на позицию QA Automation, в этих вопросах у вас должны быть не только теоретические знания, но и практические навыки и опыт использования (если вы пишете не на Python, то список будет другим, конечно):
1) py.test & fixtures & parameterization / tagging (py.test просто сейчас сам использую, но лучше, если вы знаете много тестовых фреймворков, знаете их слабые места и преимущества);
2) Selenium Web Driver & Page Object Pattern (на каком бы языке программирования вы не писали автоматические тесты, опыт написания автоматических тестов на selenuim WebDriver лишним не будет. Здесь вам потребуется понимание что такое xpath и какие они бывают / DOM, какие селекторы бывают и чем отличаются, какими способами можно запускать виртуальный браузер и как настраивается Selenium GRID);
3) unittests / mock (уметь писать юнит тесты и работать с mock объектами, делать заглушки на системные вызовы и библиотечные функции, такие как open / json.load и т.д.);
4) matchers (почитать что это можно здесь);
5) pep8 & pylint tools (если пишете на Python это просто must know & use);
6) Знать что такое BDD (RobotFramework, Behave, Cucumber), TDD - какие фремворки и инструменты для этого используются и зачем все это может быть нужно;
7) Понимать идею CI/CD и какие инструменты для этого используются (Jenkins + jenkins job builder / TeamCity / Docker). Например, когда кандидат с серьезными техническими навыками не может ответить зачем нужен CI и в чем его основная миссия, его позиции резко снижаются в глазах тех, кто проводит интервью.

Очень полезно будет зарегистрироваться на https://py.checkio.org и решать задачки - просто для практики решения алгоритмических задачек, для того, чтобы сравнивать свои решения с решениями других инженеров и оттачивать свои навыки программирования.

Так же очень полезно просмотреть видео-лекции от крупнейших IT компаний, например:
Яндекс - Алгоритмы и структуры данных
Яндекс - Машинное обучение
Яндекс - 2000+ коротких лекций и выступлений на разные темы
Mail.ru Group - онлайн курсы по разным направлениям
Microsoft - тренинги с видеокурсами и онлайн тестированием (по продуктам Microsoft)
GoogleTechTalks - все подряд, иногда попадаются очень интересные темы

Пишите ваши предложения что еще стоит повторить перед техническим собеседованием для QA Engineer, ссылки на хорошие статьи и видео приветвуются 😏