Качество кода. Покрытие кода. Нагрузочное тестирование. Непрерывная интеграция
Жигалов Сергей
function getPokerHand(dice) {
if (Array.isArray(dice))
console.log('Diсe 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;
}
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
/* ... */
}
./node_modules/.bin/eslint eslintWrongExamples/codestyle.js --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 getPokerHand(dice) {
console.log(dice);
/* ... */
}
# Установка eslint
npm install eslint --save-dev
# Создание конфига
./node_modules/.bin/eslint --init
? How would you like to configure ESLint?
Answer questions about your style
❯ Use a popular style guide
Inspect your JavaScript file(s)
# Запуск eslint
./node_modules/.bin/eslint .
// .eslintrc.js
module.exports = {
"extends": "yandex",
"rules": {
"no-unused-vars": 0, // выключено
"max-len": [1, 100], // предупреждение
"max-params": [2, 3] // ошибка
}
}
# Установка 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
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
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
language: node_js
node_js:
- "node"
script:
- npm run cover
подвид тестирования производительности, сбор показателей и определение производительности и времени отклика программы в ответ на внешний запрос с целью установления соответствия требованиям, предъявляемым к программе
— это инструмент для нагрузочного тестирования и анализа производительности веб-сервисов и приложений
человек, который проводит нагрузочное тестирование
сервер, с которого отправляются http-запросы
приложение на одном или нескольких серверах, которое обслуживает запросы пользователей
запрос от нагрузочного сервера к приложению
процесс в ходе которого танкист готовит патроны, проводит нагрузочное тестирование и анализирует результаты
увеличивать нагрузку до тех пор, пока тестируемое приложение (мишень) не перестанет отвечать
набор операций с заданной интенсивностью
для измерения максимального количества одновременных обращений к сервису
line(1, 2000, 3h)
step(1, 2000, 30, 4m)
для измерения времени ответа сервиса и определения утечек ресурсов
const(10, 24h)
const(1, 10m) step(1, 2000, 10, 5m)
const(1, 10m) line(1, 1000, 1h) const(1000, 1h) line(1000, 1, 1h)
const(10, 10m) const(1000, 1m) const(10, 10m)
(англ. 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
23 мая в 19:30 в 509 аудитории
Результаты