ESlint. Code coverage. Load testing. Continuous integration
Жигалов Сергей
The pluggable linting utility for JavaScript and JSX![]()
function getPokerHand(dice) {
if (Array.isArray(dice))
console.log('Dise is', typeof dice);
throw new Error('Dice is not array');
return 'Покер';
}
/**
* Represents a sum
*
* @param a The first number.
* @param {number} b
*/
function sum(a, b) {
return a + c;
}
# Установка eslint
npm install eslint --save-dev
# Создание конфига
./node_modules/.bin/eslint --init
# Запуск eslint
./node_modules/.bin/eslint .
// .eslintrc.json
{
"env": {
"es6": true,
"node": true
},
"parserOptions": {
"ecmaVersion": 2017
},
"rules": { /* ... */ }
}
// .eslintrc.json
{
/* ... */
"rules": {
"no-unused-vars": 0, // выключено
"max-len": [1, 100], // предупреждение
"max-params": [2, 3] // ошибка
}
}
--fix
function formatDate(date) {
var hours=('0'+date.getHours()).slice(-2)
const minutes=('0'+date.getMinutes()).slice(-2);
let nextDay=new Date(date.setDate(date.getDate()+1)).toDateString();
if (nextDay==new Date())
return 'в '+hours+':'+minutes
/* ... */
}
--fix
function formatDate(date) {
const hours = (`0${date.getHours()}`).slice(-2);
const minutes = (`0${date.getMinutes()}`).slice(-2);
const nextDay = new Date(date.setDate(date.getDate() + 1)).toDateString();
if (nextDay == new Date()) { return `в ${hours}:${minutes}`; }
/* ... */
}
function controller(err, req, res, next) {
console.error(err.stack);
res.status(500).send('Something broke!');
}
function controller(err, req, res, next) {
/* eslint max-params: 0, no-unused-vars: 0 */
console.error(err.stack);
res.status(500).send('Something broke!');
}
istanbul
# Установка istanbul
npm install istanbul --save-dev
# Запуск istanbul
./node_modules/.bin/istanbul cover
./node_modules/.bin/_mocha
qa-task-03/tests
# Открываем отчет с результатом coverage
open coverage/lcov-report/index.html
DEMO
istanbul
Отчет
./node_modules/.bin/istanbul cover ...
====== Coverage summary =======
Statements : 95.24% ( 20/21 )
Branches : 93.75% ( 15/16 )
Functions : 100% ( 3/3 )
Lines : 95.24% ( 20/21 )
===============================
100% покрытие не означает хорошее
function playPoker(firstDice, secondDice) {
const first = getPokerHand(firstDice);
const second = getPokerHand(secondDice);
const compareHands =
pokerHands.indexOf(first) -
pokerHands.indexOf(second);
return compareHands === 0
? 'Ничья'
: compareHands > 0 ? 'Первый' : 'Второй';
}
describe('playPoker', () => {
it('should return `Ничья` for equal poker hand', () => {
const actual = playPoker([1, 1, 2, 3, 4], [1, 1, 2, 3, 5]);
assert.equal(actual, 'Ничья');
});
it('should return `Первый` when first hand great then second', () => {
const actual = playPoker([1, 1, 1, 1, 4], [1, 1, 1, 3, 4]);
assert.equal(actual, 'Первый');
});
/* ... */
});
unit-coverage
# Устанавливаем unit-coverage
npm install --save-dev unit-coverage
# Запускаем ковередж
node_modules/.bin/unit-coverage run
-s 'qa-task-03/src/**'
-t 'qa-task-03/tests/**'
-S relative
-O sources=qa-task-03/src
-O tests=qa-task-03/tests
-- --recursive qa-task-03/tests/
Ковередж проверяет только вызовы. Правильность проверяет разработчик.
CI - это практика разработки программного обеспечения, которая заключается в слиянии рабочих копий в общую ветвь разработки несколько раз в день и выполнении частых автоматизированных сборок проекта
Дает быструю обратную связь
Дисциплинирует команду
Неизбежное тестирование кода
Автоматизация рутины
.travis.yml
.travis.yml
language: node_js
node_js:
- "node"
before_script:
- npm run cover
(англ. load testing) — подвид тестирования производительности, сбор показателей и определение производительности и времени отклика программы в ответ на внешний запрос с целью установления соответствия требованиям, предъявляемым к программе
— это инструмент для нагрузочного тестирования и анализа производительности веб-сервисов и приложений.
человек, который проводит нагрузочное тестирование
сервер, с которого отправляются http-запросы.
приложение на одном или нескольких серверах, которое обслуживает запросы пользователей.
запрос от нагрузочного сервера к приложению.
Танкисты заряжают ленты с патронами и стреляют по мишеням из танков на полигоне.
(англ. Service Level Agreement) — договор между заказчиком и поставщиком, содержащий <...> согласованный уровень качества предоставления данной услуги.
95% пользователей получат ответ не позже чем через 300ms
ab -c 2 -n 100 https://some/url
Requests per second: 3.78 [#/sec] (mean)
Time per request: 264.300 [ms] (mean, across all concurrent requests)
Connection Times (ms)
min mean[+/-sd] median max
Connect: 95 111 11.5 112 157
Processing: 198 416 645.6 296 5271
Waiting: 134 341 645.7 222 5194
Total: 302 527 645.1 407 5385