Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Иван Колобаев - тестирование #39

Open
wants to merge 18 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"env": {
"browser": true,
"commonjs": true,
"es6": true,
"node": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": 2016,
"sourceType": "module"
},
"plugins": [
"prettier"
],
"rules": {
"indent": [
"error",
2,
{ "SwitchCase": 1 }
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"single"
],
"semi": [
"error",
"always"
],
"prettier/prettier": "error"
},
"globals": {
"describe": true,
"it": true
}
}
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,8 @@
node_modules
.idea/

node_modules

.nyc_output/
coverage/

hermione-html-report/
23 changes: 23 additions & 0 deletions .hermione.conf.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
module.exports = {
baseUrl: 'http://127.0.0.1:3000',
gridUrl: 'http://127.0.0.1:4444/wd/hub',
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Расскажи как устанавливал selenium? Docker/локально/глобально?

Copy link
Author

@vak1n vak1n Oct 25, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Глобально. Про докер как то не подумал (


browsers: {
firefox: {
desiredCapabilities: {
browserName: 'firefox'
}
},
chrome: {
desiredCapabilities: {
browserName: 'chrome'
}
}
},
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здорово, что два браузера 👍


plugins: {
'html-reporter/hermione': {
path: 'hermione-html-report'
}
}
};
6 changes: 6 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"useTabs": false,
"printWidth": 120,
"tabWidth": 2,
"singleQuote": true
}
87 changes: 85 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,21 @@
## Как запустить

```sh
git clone git@github.com:dima117/shri-testing-homework.git
cd shri-testing-homework.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

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

Сценарии для интеграционных тестов
Expand All @@ -26,8 +35,82 @@ npm start
- из списка файлов на страницу отдельного файла
- переходы по хлебным крошкам

#### User stories

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

#### Запуск

```sh
# запуск 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

#### Запуск

```sh
npm run test
```

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

```sh
npm run test-cover
```
В папке `coverage` в корне

## Рефакторинг

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

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

- ссылка на репо выделена в отдельный файл с подменой на импровизированном стейдже на mock bare репозиторий
7 changes: 7 additions & 0 deletions config/consts.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const { resolve } = require('path');

const REPO = process.env.NODE_ENV === 'staging' ? resolve('./fixtures/repo.git') : resolve('.');

module.exports = {
REPO
};
12 changes: 1 addition & 11 deletions controllers/filesController.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,11 @@
const { gitFileTree } = require('../utils/git');
const {
buildObjectUrl,
buildFolderUrl,
buildFileUrl,
buildBreadcrumbs
} = require('../utils/navigation');

function buildObjectUrl(parentHash, { path, type }) {
switch (type) {
case 'tree':
return buildFolderUrl(parentHash, path);
case 'blob':
return buildFileUrl(parentHash, path);
default:
return '#';
}
}

module.exports = function(req, res, next) {
const { hash } = req.params;
const pathParam = (req.params[0] || '').split('/').filter(Boolean);
Expand Down
124 changes: 124 additions & 0 deletions fixtures/git-log.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
{
"log": [
{
"hash": "a650ac6d04e840290cf02bc4e8fcf917d2f1c4d0",
"author": "Ivan Kolobaev",
"timestamp": "2018-10-21 03:12:43 +0300",
"msg": "Хелпер git переписан на класс"
},
{
"hash": "bf6f83f2779b4829ee5301211352f3a3814feedb",
"author": "Ivan Kolobaev",
"timestamp": "2018-10-21 01:00:50 +0300",
"msg": "Сценарии тестирования и тесты для хелпера navigation"
},
{
"hash": "17605188faec24540ae3f413bb6d113821f76ea6",
"author": "Ivan Kolobaev",
"timestamp": "2018-10-21 00:21:31 +0300",
"msg": "Линтер"
},
{
"hash": "ac8b1946ecbcdec188a0c67c5187cd9884c0e56c",
"author": "Ivan Kolobaev",
"timestamp": "2018-10-21 00:03:04 +0300",
"msg": "Добавлены nodemon, mocha и chai, nyc"
},
{
"hash": "79eec830de6fa907a6f6a1e176f0e4d9dea3c600",
"author": "Ivan Kolobaev",
"timestamp": "2018-10-20 23:42:10 +0300",
"msg": "Исправлена опечатка в readme"
},
{
"hash": "c81643d8fa442b8bd2ed46569f158cd27977b916",
"author": "Ivan Kolobaev",
"timestamp": "2018-10-20 23:41:24 +0300",
"msg": "Игнор настроек IDE"
},
{
"hash": "90180910fc27a11272a3e5caeeb119a51e5c0545",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 12:49:56 +0300",
"msg": "исправлена опечатка в readme"
},
{
"hash": "cc2284293758e32c50fa952da2f487c8c5e8d023",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 12:36:32 +0300",
"msg": "readme"
},
{
"hash": "7e013ae0440ad6e91082599376a6aaebe20d2112",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 12:10:05 +0300",
"msg": "codestyle"
},
{
"hash": "f2df8ac23e817f6da01624a77ec050a0147f642a",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 12:02:11 +0300",
"msg": "стили"
},
{
"hash": "0f7b962409d6980236944164c5b0c9f43f9348e9",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 11:54:32 +0300",
"msg": "хлебные крошки"
},
{
"hash": "82810cf7d56476059477aaa5ff55c99ff191be29",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 11:25:59 +0300",
"msg": "исправлена ошибка"
},
{
"hash": "30fc48ec578e6b0052f6ab9ea7a118fb31574cdc",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 11:23:01 +0300",
"msg": "ссылки на корневую папку"
},
{
"hash": "f69c43393449afe9284f3fa20010695a5faa3849",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 11:20:57 +0300",
"msg": "ссылки на корневую папку"
},
{
"hash": "5dec08da64c3b090708aa8412924b26744d60597",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 11:19:59 +0300",
"msg": "отображение списка коммитов"
},
{
"hash": "144944153a24f28bd13bcd60aa7f588523649a53",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 11:17:57 +0300",
"msg": "экранирование контента"
},
{
"hash": "e91effac1a382d9569198e0625d5c979956e9870",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 11:16:20 +0300",
"msg": "стили для списка коммитов"
},
{
"hash": "1bd9b4848866f8d83cbb45b45193c695ffebb282",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 10:15:28 +0300",
"msg": "навигация для страницы с контентом файла"
},
{
"hash": "cdd4eb0149493540c34103e7ac2a49a5f67a917b",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 09:53:14 +0300",
"msg": "просмотр содержимого файла"
},
{
"hash": "172001aeb63bdfc4e3f01f29e30876022cf6ad45",
"author": "Dmitry Andriyanov",
"timestamp": "2018-10-16 09:02:52 +0300",
"msg": "список файлов"
}
]
}
Loading