# Программа курса "Искусство Автоматизации Тестирования с Selene + Python"
* Введение в Selene
  * Быстрый Старт. Исходные условия, зависимости, первые шаги и документация
  * Selene в действии
  * Задание 1: Selene и CSS
    * "Строгие, но хрупкие" или "слабые, но стабильные" локаторы?
    * Локаторы, автоматически сгенерированные в инспекторе, или подобранные вручную?
    * Когда выносить локаторы в отдельные переменные и/или классы?
    * Как найти элемент из списка однотипных элементов по нужному тексту его внутреннего элемента (CSS)?
    * Структурная информация в именах тест-сьюта и тестов, которая не несет пользы с точки зрения тестирования
    * Установка пути к chromedriver в коде?
    * Хрупкие строгие локаторы
      * Избыточность в путях - привязка к тегу
      * Избыточность в путях - привязка к точному пути
      * Привязка к полному значению аттрибута class либо его начала или конца
      * Хрупкие гибкие локаторы. Привязка к частичному значению атрибута class
    * Построение локатора с помощью менее читабельных и понятных аттрибутов либо их значений
    * Слишком краткие и потому менее информативные, неочевидные локаторы
    * Неконсистентные селекторы
  * Задание 2: Selene и XPATH
    * Как в XPATH искать по одному CSS классу а не по всему значению соответствуеющего аттрибута?
    * Как найти элемент из списка однотипных элементов по нужному тексту его внутреннего элемента (XPath)
  * Задание 3: Рефакторинг сложных XPath-селекторов
    * Где лучше сохранить вспомогательные функции для построения сложных XPath-селекторов? (Стратегия сохранения функций)
      * Важность имен
    * Какую именно часть длинного сложного XPath селектора стоит выносить в отдельные функции, а какие нет?
    * Избыточность имен
    * Неясные неполные имена вспомогательных функций
  * Задание 4: XPath DSL [не обязательное]
* I Начало. Проверка Концепции
  * Шаблон первого теста
  * "Быстрые в реализации" тесты. Читабельность, очевидность и лаконичность
  * "Быстрые в выполнении" тесты. Уровень сложности тестовых данных
  * Более быстрый ввод текста с помощью Javascript
  * Проверки (Assertions)
  * Полнота проверок
  * "Флоу" End-to-End-теста. Упрощенный тест-план
  * Задание 5: POC-тест
    * Изначальные условия и приоритеты
    * Изучение функционала и основных сценариев пользователя
    * Уточнение приоритетов. Поиск и игнорирование низкоприоритетных операций
    * Определение сценария для автоматизации
    * Декомпозиция локаторов. Альтернатива нечитабельным XPath
    * Оптимизация локаторов по скорости выполнения поиска
    * Типичная проблема: локатор верный но элемент "не тот"
    * Типичная проблема: Локатор находит невидимого "клона" элемента. Недостаточно строгие локаторы для однотипных элементов
    * Работа с "клонами": фильтр элемента по видимости
    * Подбор уникального селектора через сужение поиска до поиска внутри родителя с уникальными атрибутами
    * Относительные локаторы, менее лаконичные, но более информативные, и следовательно очевидные и читабельные
    * Подсказываем тест-логику с помощью подбора более информативных тестовых данных
    * Неявные проверки в End-to-End-тестах
    * Проверяем "все что осталось" а не только "то что изменилось"
    * Акцент на функциональных проверках
    * Информативные локаторы
    * Типичная проблема: элемент не готов к действию
    * Базовое структурирование теста
    * Комментарии как оглавления
    * Самодокументируемый код
    * Именование Тестов
    * Ревью покрытия. Учитываем "побочные эффекты". Пропущенные операции
* II Пересмотр. Рефакторинг Теста - Часть 1
  * Принципы DRY и KISS
    * DRY и структурирование кода с помощью сложных конструкций языка. KISS против
    * DRY для более легкого набора повторяющегося кода с помощью переменых/функций
    * Переменные или функции?
    * Переменные. Refactoring>Extract>Variable
    * Анализ частей повторяющегося кода с точки зрения вероятности изменений
    * Переменные в тест-методе или за его границами?
    * Скоуп определения абстракций
    * Refactoring>Extract>Field
    * Переменные с локаторами против переменных с элементами
    * Функции?
    * Refactor>Extract>Function. Функции с "зашитыми данными" (hardcoded data)
    * Функции с параметрами
    * Функции со встроенными проверками?
    * Функции + переменные. Вынесение "всех локаторов" в переменные?
    * Самодокументируемый код - функции вместо комментариев
    * Послабление KISS при сокрытии сложности в реализациях функций
    * KISS и тест-шаги: переменные/функции в тестах "ради полной читабельности" против "ради DRY"
  * Задание 6: Примени принцип DRY
  * Задание 7: Примени принцип KISS ради читабельности
  * Задание 8: Найди баланс между KISS и DRY
  * Сокрытие технических деталей. Контекст
  * Задание 9: Скрой настройку базового URL
  * День Независимости Тестов
    * Больше тестов
    * Независимые тесты через упрощение тест-логики
    * Независимые тесты с помощью контроля их окружения через управление данными в базе
    * Предпочтение явным предусловиям следуя KISS перед их сокрытием для DRY
  * Задание 10: Допиши тест на фильтрование задач и сделай тесты независимыми следуя принципу DRY
  * Задание 11: Упрости реализацию независимости тестов следуя принципу KISS используя явные пред-условия
* III Закалка. Расширение покрытия. Атомарные тесты
  * Задание 12: Расширь покрытие действий на фильтре "All"
* IV Структура и переиспользование. Рефакторинг Тестов - Часть 2
  * Код с Запашком: Большой Модуль/Класс
  * Ретроспектива на базовые принципы в начале построения автоматизации
  * Рефакторинг: Извлечение модуля/класса
    * Cтруктура
    * Замена наследования композицией
    * Имена в контексте
  * Снова о DRY и переиспользовании кода
  * Шаблон PageObject
  * Задание 13: Расширь покрытие действий на фильтре "Active" и "Completed"
  * Виджеты (Применяем PageObject к компонентам на странице)
  * Задание 14: Выдели виджет представляющий текстовую метку редактируемую по двойному клику
* Общие частые вопросы и ответы
  * Тестовая логика
  * Рекомендации и общепринятые договоренности в подборе имен
    * Рекоммендации к улучшению читабельности имен
      * Шаблон построения имени функции или метода
      * Шаблон построения имени переменной
      * Использование общепринятой терминологии
      * Не злоупотреблять сокращениями
      * Терминология в контексте
      * Говорим на языке местных
      * Недвусмысленность
      * Лаконичность
      * Не повторять то, что уже задано контекстом
      * Простота