Домашнее задание: автотесты

Вам дано приложение на JavaScript и нужно написать для него автотесты: интеграционные тесты на интерфейс и модульные тесты на серверную часть.

Предметная область

Приложение отображает в браузере информацию из git репозитория: список коммитов, файловую систему для выбранного коммита, содержимое выбранного файла (поддерживаются только текстовые форматы). Для удобства навигации на каджой странице отображаются "хлебные крошки".

Как запустить

git clone https://github.com/vak1n/shri-testing-homework.git
cd shri-testing-homework
npm i
npm start

Окружение при разработке

  • ОС Ubuntu 16.04.5 LTS
  • node --version v10.12.0
  • Selenium build info: version: '3.12.0'
  • Google Chrome 70.0.3538.67
  • Mozilla Firefox 62.0.3
  • git version 2.7.4

Интеграционные тесты

Сценарии для интеграционных тестов

  • на всех страницах (история коммитов, просмотр файловой системы, просмотр содержимого файла) правильно отображается их содержимое;
  • правильно работают переходы по страницам
    • из списка коммитов на список файлов
    • из списка файлов во вложенную папку
    • из списка файлов на страницу отдельного файла
    • переходы по хлебным крошкам

User stories

  • как неавторизованный пользователь, я хочу открыть главную страницу, чтобы увидеть список из 20 коммитов репозитрория
  • как неавторизованный пользователь, я хочу видеть информацию о коммите, чтобы можно было понять кто автор, дату, описание, хэш
  • как неавторизованный пользователь, я хочу открыть страницу определенного коммита, чтобы увидеть корневую файловую структуру коммита
  • как неавторизованный пользователь, я хочу открыть определенную папку, чтобы увидеть вложенную файловую структуру
  • как неавторизованный пользователь, я хочу открыть определенный файл, чтобы просмотреть содержимое файла
  • как неавторизованный пользователь, я хочу переходить от комитов к файловой структуре, переходить по папкам файловой структуры, смотреть содержимое файлов, чтобы была удобная навигация
  • как неавторизованный пользователь, я хочу видеть путь от главной страницы до той, на которой я сейчас нахожусь (хлебные крошки), для удобной навигации
  • как неавторизованный пользователь, я хочу переходить элементам хлебных крошек, что бы перейти к определенному уровню иерархии

Запуск

# запуск selenium
selenium-standalone start

# в отдельной вкладке запуск импровизированного стейдж
npm run stage

# в отдельной вкладке запуск интеграционных тестов
npm run hermione

Модульные тесты

  • нужно добавить в README список логических блоков системы и их сценариев
  • для каждого блока нужно написать модульные тесты
  • если необходимо, выполните рефакторинг, чтобы реорганизовать логические блоки или добавить точки расширения

Логические блоки и их сценарии (только публичные методы)

  • Используем хелпер navigation
    • вызываем функцию buildFolderUrl
      • получаем url по hash, без передачи path
    • вызываем функцию buildBreadcrumbs
      • получаем крошки без параметров
      • получаем крошки по hash
      • получаем крошки по hash и path
    • вызываем функцию buildObjectUrl
      • получаем url по hash и path с предачей type = tree
      • получаем url hash и path с предачей type = blob
      • получаем url hash и path hash без type
  • Используем хелпер git
    • вызываем функцию gitHistory
      • получаем ошибку Error: git log
      • получаем историю коммитов со второй позиции с лимитом два
    • вызываем функцию gitFileTree
      • получаем ошибку Error: git ls-tree
      • получаем дерево файловой системы коммита по hash
      • получаем дерево файловой системы коммита по hash и path
    • вызываем функцию gitFileContent
      • получаем ошибку Error: git show
      • получаем содержимое файла по hash

Запуск

npm run test

Отчет о покрытии

npm run test-cover

В папке coverage в корне

Рефакторинг

  • функция buildObjectUrl перенесена в хелпер navigation

  • в хелпере git добавлена возможность замены execFile на mock путем инъекции

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

  • ссылка на репо выделена в отдельный файл с подменой на импровизированном стейдже на mock bare репозиторий