Вам дано приложение на 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
Сценарии для интеграционных тестов
- на всех страницах (история коммитов, просмотр файловой системы, просмотр содержимого файла) правильно отображается их содержимое;
- правильно работают переходы по страницам
- из списка коммитов на список файлов
- из списка файлов во вложенную папку
- из списка файлов на страницу отдельного файла
- переходы по хлебным крошкам
- как неавторизованный пользователь, я хочу открыть главную страницу, чтобы увидеть список из 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
- вызываем функцию buildFolderUrl
- Используем хелпер git
- вызываем функцию gitHistory
- получаем ошибку Error: git log
- получаем историю коммитов со второй позиции с лимитом два
- вызываем функцию gitFileTree
- получаем ошибку Error: git ls-tree
- получаем дерево файловой системы коммита по hash
- получаем дерево файловой системы коммита по hash и path
- вызываем функцию gitFileContent
- получаем ошибку Error: git show
- получаем содержимое файла по hash
- вызываем функцию gitHistory
npm run test
npm run test-cover
В папке coverage
в корне
-
функция buildObjectUrl перенесена в хелпер navigation
-
в хелпере git добавлена возможность замены execFile на mock путем инъекции
В итоге отдал предпочтение этому варианту взамен переписыванию модуля на класс или фабричную функцию, так как несет меньше рефакторинга. При таком подходе конечно в тестах этого модуля придется следить за тем, чтобы предыдущая инъекция не влияла на результаты следующих тестов. Но если бы проект был большой, то рефакторить пришлось бы ощутимо больше, чем пару-тройку контролеров.
-
ссылка на репо выделена в отдельный файл с подменой на импровизированном стейдже на mock bare репозиторий