Вы находитесь на странице: 1из 184

Раздел 2:

Файловая система
В этой лекции
В этой лекции

– Event Loop (Цикл событий)


В этой лекции

– Event Loop (Цикл событий)


– Поставщики и обработчики событий (EventEmitter)
В этой лекции

– Event Loop (Цикл событий)


– Поставщики и обработчики событий (EventEmitter)
– Работа с файлами
В этой лекции

– Event Loop (Цикл событий)


– Поставщики и обработчики событий (EventEmitter)
– Работа с файлами
– Синхронные и асинхронные операции
В этой лекции

– Event Loop (Цикл событий)


– Поставщики и обработчики событий (EventEmitter)
– Работа с файлами
– Синхронные и асинхронные операции
– CRUD операции в файловой системе
В этой лекции

– Event Loop (Цикл событий)


– Поставщики и обработчики событий (EventEmitter)
– Работа с файлами
– Синхронные и асинхронные операции
– CRUD операции в файловой системе
– Тестирование кода
В этой лекции

– Event Loop (Цикл событий)


– Поставщики и обработчики событий (EventEmitter)
– Работа с файлами
– Синхронные и асинхронные операции
– CRUD операции в файловой системе
– Тестирование кода
– Фреймворки тестирования
Event loop
medium.com/devschacht/event-loop-timers-and-nexttick-18579cd122e0
Откуда берутся асинхронные операции
Откуда берутся асинхронные операции

– Работа с файлами
Откуда берутся асинхронные операции

– Работа с файлами
– Чтение/запись данных по сети
Откуда берутся асинхронные операции

– Работа с файлами
– Чтение/запись данных по сети
– Отложенные операции
Откуда берутся асинхронные операции

– Работа с файлами
– Чтение/запись данных по сети
– Отложенные операции
– Ожидание пользовательского ввода
Зачем нужен setImmediate()
Зачем нужен setImmediate()
– Даёт возможность выполнить код в пределах одно витка, но после срабатывания
обработчика
Зачем нужен setImmediate()
– Даёт возможность выполнить код в пределах одно витка, но после срабатывания
обработчика

– Позволяет разделить подписку и вызов начального события


Отличия setImmediate() от process.nextTick()
Отличия setImmediate() от process.nextTick()
– process.nextTick просто переносит выполнение в конец текущей фазы
Отличия setImmediate() от process.nextTick()
– process.nextTick просто переносит выполнение в конец текущей фазы
– setImmediate переносит выполнение в конец следующего цикла
Close events
Close events
– Функции, вызывающиеся при завершении приложения
Close events
– Функции, вызывающиеся при завершении приложения
– Позволяют доделать какие-то незавершённые действия:
Close events
– Функции, вызывающиеся при завершении приложения
– Позволяют доделать какие-то незавершённые действия:
– Удалить временные файлы
Close events
– Функции, вызывающиеся при завершении приложения
– Позволяют доделать какие-то незавершённые действия:
– Удалить временные файлы
– Корректно закрыть соединение
Close events
– Функции, вызывающиеся при завершении приложения
– Позволяют доделать какие-то незавершённые действия:
– Удалить временные файлы
– Корректно закрыть соединение
– Вывести причину закрытия приложения в консоль
Событийная модель
Событийная модель

– Если есть данные, то...


Событийная модель

– Если есть данные, то...


– Если пользователь ввёл своё имя, то...
Событийная модель

– Если есть данные, то...


– Если пользователь ввёл своё имя, то...
– Если пришли данные по сети, то...
Паттерн EventEmi9er

nodejs.org/dist/latest-v9.x/docs/api/events.html
Паттерн EventEmi9er
– Разделяет концепции слушателя и эмитента

nodejs.org/dist/latest-v9.x/docs/api/events.html
Паттерн EventEmi9er
– Разделяет концепции слушателя и эмитента
– Эмитент (Emi9er) — тот, кто предоставляет данные

nodejs.org/dist/latest-v9.x/docs/api/events.html
Паттерн EventEmi9er
– Разделяет концепции слушателя и эмитента
– Эмитент (Emi9er) — тот, кто предоставляет данные
– Слушатель (Listener) — тот, кто заинтересован в данных

nodejs.org/dist/latest-v9.x/docs/api/events.html
Интерфейс
Интерфейс

– Метод emit — говорит, что появились новые данные


Интерфейс

– Метод emit — говорит, что появились новые данные


– Метод on — подписывает слушателя на получение новых данных
Интерфейс

– Метод emit — говорит, что появились новые данные


– Метод on — подписывает слушателя на получение новых данных
– Если в качестве слушателя используется функция с контекстом, то контекст будет
подменён при вызове на объект самого EventEmi9er
Event Emitter
Event Emitter
– Подписки на события:
Event Emitter
– Подписки на события:
– addListener/prependListener/on
Event Emitter
– Подписки на события:
– addListener/prependListener/on
– removeListener/removeAllListeners
Event Emitter
– Подписки на события:
– addListener/prependListener/on
– removeListener/removeAllListeners
– once/prependOnceListener
Event Emitter
– Подписки на события:
– addListener/prependListener/on
– removeListener/removeAllListeners
– once/prependOnceListener
– Методы и поля самого EventEmi9er:
Event Emitter
– Подписки на события:
– addListener/prependListener/on
– removeListener/removeAllListeners
– once/prependOnceListener
– Методы и поля самого EventEmi9er:
– emit
Event Emitter
– Подписки на события:
– addListener/prependListener/on
– removeListener/removeAllListeners
– once/prependOnceListener
– Методы и поля самого EventEmi9er:
– emit
– eventNames
Event Emitter
– Подписки на события:
– addListener/prependListener/on
– removeListener/removeAllListeners
– once/prependOnceListener
– Методы и поля самого EventEmi9er:
– emit
– eventNames
– События самого EventEmi9er:
Event Emitter
– Подписки на события:
– addListener/prependListener/on
– removeListener/removeAllListeners
– once/prependOnceListener
– Методы и поля самого EventEmi9er:
– emit
– eventNames
– События самого EventEmi9er:
– Event: 'newListener'
Event Emitter
– Подписки на события:
– addListener/prependListener/on
– removeListener/removeAllListeners
– once/prependOnceListener
– Методы и поля самого EventEmi9er:
– emit
– eventNames
– События самого EventEmi9er:
– Event: 'newListener'
– Event: 'removeListener'
Особенности
Особенности

– EventEmi9er всегда синхронный и вызывает всех своих слушателей в порядке


подписки
Особенности

– EventEmi9er всегда синхронный и вызывает всех своих слушателей в порядке


подписки

– У EventEmi9er есть специальное событие error, если оно произошло и нет ни одного
обработчика error, то будет выброшено исключение
Особенности

– EventEmi9er всегда синхронный и вызывает всех своих слушателей в порядке


подписки

– У EventEmi9er есть специальное событие error, если оно произошло и нет ни одного
обработчика error, то будет выброшено исключение

– У EventEmi9er есть ограничение на максимальное кол-во обработчиков для одного


события. По умолчанию оно равно 10
Вся экосистема Node.js пронизана EventEmi9er
Объект Process тоже EventEmi9er

process.on('uncaughtException', (err) => {


console.log(`Caught exception: ${err}\n`);
});

setTimeout(() => {
console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.


nonexistentFunc();
console.log('This will not run.');

nodejs.org/dist/latest-v9.x/docs/api/process.html#process_process_events
Демо
Работа с файлами
Файл
Файл

– Путь
Файл

– Путь
– Расширение
Файл

– Путь
– Расширение
– Кодировка, если это текстовый файл
Файл

– Путь
– Расширение
– Кодировка, если это текстовый файл
– Уровень доступа
Файл

– Путь
– Расширение
– Кодировка, если это текстовый файл
– Уровень доступа
– Режим (чтение, запись, чтение и запись)
Файл

– Путь
– Расширение
– Кодировка, если это текстовый файл
– Уровень доступа
– Режим (чтение, запись, чтение и запись)
– Ссылка
Синхронное чтение файла
Синхронное чтение файла

– Прочитать содержимое файла


Синхронное чтение файла

– Прочитать содержимое файла


– Ждать пока читается содержимое файла
Синхронное чтение файла

– Прочитать содержимое файла


– Ждать пока читается содержимое файла
– Ждать пока читается содержимое файла
Синхронное чтение файла

– Прочитать содержимое файла


– Ждать пока читается содержимое файла
– Ждать пока читается содержимое файла
– Ждать пока читается содержимое файла
Синхронное чтение файла

– Прочитать содержимое файла


– Ждать пока читается содержимое файла
– Ждать пока читается содержимое файла
– Ждать пока читается содержимое файла
– Ждать пока читается содержимое файла
Синхронное чтение файла

– Прочитать содержимое файла


– Ждать пока читается содержимое файла
– Ждать пока читается содержимое файла
– Ждать пока читается содержимое файла
– Ждать пока читается содержимое файла
– Вывести содержимое файла
Асинхронное чтение файла
Асинхронное чтение файла

– Прочитать содержимое файла


Асинхронное чтение файла

– Прочитать содержимое файла


– Передать функцию обратного вызова, как только файл будет прочитан
Асинхронное чтение файла

– Прочитать содержимое файла


– Передать функцию обратного вызова, как только файл будет прочитан
– Перейти к выполнению другого действия
Асинхронное чтение файла

– Прочитать содержимое файла


– Передать функцию обратного вызова, как только файл будет прочитан
– Перейти к выполнению другого действия
– Как только файл прочитан, вызвать функцию обратного вызова
Асинхронное чтение файла

– Прочитать содержимое файла


– Передать функцию обратного вызова, как только файл будет прочитан
– Перейти к выполнению другого действия
– Как только файл прочитан, вызвать функцию обратного вызова
– Вывести содержимое файла
libuv
libuv
– Предоставляет кросс-платформенную прослойку между API Node.js и ОС
libuv
– Предоставляет кросс-платформенную прослойку между API Node.js и ОС
– Создаёт универсальный интерфейс для асинхронной работы с файловой системой
libuv
– Предоставляет кросс-платформенную прослойку между API Node.js и ОС
– Создаёт универсальный интерфейс для асинхронной работы с файловой системой
– Предоставляет единый универсальный интерфейс для работы со стеком TCP
libuv
– Предоставляет кросс-платформенную прослойку между API Node.js и ОС
– Создаёт универсальный интерфейс для асинхронной работы с файловой системой
– Предоставляет единый универсальный интерфейс для работы со стеком TCP
– Изолирует работу потоков в ОС от синхронного кода в Node.js
Возможности
Возможности

– Операции делятся на синхронные и асинхронные


Возможности

– Операции делятся на синхронные и асинхронные


– Файлы можно читать/изменять/удалять/копировать/менять доступ и т.д.
Возможности

– Операции делятся на синхронные и асинхронные


– Файлы можно читать/изменять/удалять/копировать/менять доступ и т.д.
– На разных операционных системах могут быть недоступны те или иные возможности
Возможности

– Операции делятся на синхронные и асинхронные


– Файлы можно читать/изменять/удалять/копировать/менять доступ и т.д.
– На разных операционных системах могут быть недоступны те или иные возможности
– Нужно учитывать асинхронную природу работы с файлами
Возможности

– Операции делятся на синхронные и асинхронные


– Файлы можно читать/изменять/удалять/копировать/менять доступ и т.д.
– На разных операционных системах могут быть недоступны те или иные возможности
– Нужно учитывать асинхронную природу работы с файлами
– Содержимое файла можно получить как строку или как буффер
Операции над файловой системой
Операции над файловой системой

– Чтение файла — fs.readFile


при чтении директории может вернуть ошибку или содержимое директории
Операции над файловой системой

– Чтение файла — fs.readFile


при чтении директории может вернуть ошибку или содержимое директории

– Чтение директории — fs.readdir


Операции над файловой системой

– Чтение файла — fs.readFile


при чтении директории может вернуть ошибку или содержимое директории

– Чтение директории — fs.readdir


– Создать директорию — fs.mkdir
Операции над файловой системой

– Чтение файла — fs.readFile


при чтении директории может вернуть ошибку или содержимое директории

– Чтение директории — fs.readdir


– Создать директорию — fs.mkdir
– Запись в файл — fs.writeFile
Операции над файловой системой

– Чтение файла — fs.readFile


при чтении директории может вернуть ошибку или содержимое директории

– Чтение директории — fs.readdir


– Создать директорию — fs.mkdir
– Запись в файл — fs.writeFile
– Удаление файла — fs.unlink
Операции над файловой системой

– Чтение файла — fs.readFile


при чтении директории может вернуть ошибку или содержимое директории

– Чтение директории — fs.readdir


– Создать директорию — fs.mkdir
– Запись в файл — fs.writeFile
– Удаление файла — fs.unlink
– Удаление директории — fs.rmdir
Операции над файловой системой
Операции над файловой системой

– Проверка доступа — fs.access


Операции над файловой системой

– Проверка доступа — fs.access


– Информация о пути — fs.stat
Операции над файловой системой

– Проверка доступа — fs.access


– Информация о пути — fs.stat
– Изменение владельца — fs.chown
Операции над файловой системой

– Проверка доступа — fs.access


– Информация о пути — fs.stat
– Изменение владельца — fs.chown
– Изменение прав доступа — fs.chmod
Операции над файловой системой

– Проверка доступа — fs.access


– Информация о пути — fs.stat
– Изменение владельца — fs.chown
– Изменение прав доступа — fs.chmod
– Создание символьной ссылки — fs.symlink
Синхронные операции
Ко всем операциям выше есть такие же синхронные
версии операций — syncReadFile, syncStat, syncAccess...
Но использование синхронной версии не
рекомендуется
Альтернативные операции
Альтернативные операции

– f—операции — отличие от обычной операции заключается в использовании


специального file-descriptor вместо пути до файла (например, fchown, fstat)
Альтернативные операции

– f—операции — отличие от обычной операции заключается в использовании


специального file-descriptor вместо пути до файла (например, fchown, fstat)

– l—операции — позволяют работать со ссылкой, вместо перехода по ней (например,


lstat, lchown)
Особенности
Особенности

– Некоторые операции требуют явного закрытия работы с файлом, например


операция open требует явного закрытия file-descriptor — fs.close, иначе это может
привести к утеканию ресурсов в ОС
Особенности

– Некоторые операции требуют явного закрытия работы с файлом, например


операция open требует явного закрытия file-descriptor — fs.close, иначе это может
привести к утеканию ресурсов в ОС

– Раньше Node.js разрешал не передавать последний параметр и операция


становилась синхронной, теперь это API запрещён (deprecated) и вызывает
предупрежение
Особенности

– Некоторые операции требуют явного закрытия работы с файлом, например


операция open требует явного закрытия file-descriptor — fs.close, иначе это может
привести к утеканию ресурсов в ОС

– Раньше Node.js разрешал не передавать последний параметр и операция


становилась синхронной, теперь это API запрещён (deprecated) и вызывает
предупрежение

– Ошибка в обработчике всегда идёт первым параметром


Обработка ошибок

const fs = require(`fs`);

fs.readFile(__filename, (err, data) => {


if (err) {
console.error(err.message);
}
console.log(data.toString(`utf8`));
});
Обработка ошибок

const fs = require(`fs`);

fs.readFile(__filename, (err, data) => {


if (err) {
console.error(err.message);
}
console.log(data.toString(`utf8`));
});
Обработка ошибок

const fs = require(`fs`);

fs.readFile(__filename, (err, data) => {


if (err) {
console.error(err.message);
return;
}
console.log(data);
});
Обработка ошибок

const fs = require(`fs`);

fs.readFile(__filename, (err, data) => {


if (err) {
return console.error(err.message);
}
return console.log(data.toString(`utf8`));
});

eslint.org/docs/rules/handle-callback-err
Buffer
структура данных, которая хранит блок
«чистых» (необработанных) данных. Ведёт себя так
же как массив с зафиксированной длиной, т.е.
размер однажды созданного буффера никогда не
меняется
Проверка доступа и чтение
fs.access('myfile', (err) => {
if (err) {
if (err.code === 'ENOENT') {
console.error('myfile does not exist');
return;
}

throw err;
}

fs.open('myfile', 'r', (err, fd) => {


if (err) throw err;
readMyData(fd);
});
});
Проверка доступа и чтение
fs.access('myfile', (err) => {
if (err) {
if (err.code === 'ENOENT') {
console.error('myfile does not exist');
return;
}

throw err;
}

fs.open('myfile', 'r', (err, fd) => {


if (err) throw err;
readMyData(fd);
});
});
Проверка доступа и чтение
fs.open('myfile', 'r', (err, fd) => {
if (err) {
if (err.code === 'ENOENT') {
console.error('myfile does not exist');
return;
}

throw err;
}

readMyData(fd);
});
Тестирование
Тест —
это процедура, которая позволяет либо
подтвердить, либо опровергнуть
работоспособность кода
Википедия

https://ru.wikipedia.org/wiki/Разработка_через_тестирование
Тестирование
Тестирование

– ручное
тестирование производится человеком
Тестирование

– ручное
тестирование производится человеком

– автоматическое 🤖🔫🤖
тестирование производится программами
Тестирование

– ручное
тестирование производится человеком

– автоматическое 🤖🔫🤖
тестирование производится программами

– функциональное тестирование
проверка, правильно ли работает программа
Тестирование

– ручное
тестирование производится человеком

– автоматическое 🤖🔫🤖
тестирование производится программами

– функциональное тестирование
проверка, правильно ли работает программа

– тестирование производительности
проверка, достаточно ли быстро работает программа
Тестирование

– ручное
тестирование производится человеком

– автоматическое 🤖🔫🤖
тестирование производится программами

– функциональное тестирование
проверка, правильно ли работает программа

– тестирование производительности
проверка, достаточно ли быстро работает программа

– тестирование безопасности
проверка, безопасна ли программа
Тестирование

– ручное
тестирование производится человеком

– автоматическое 🤖🔫🤖
тестирование производится программами

– функциональное тестирование
проверка, правильно ли работает программа

– тестирование производительности
проверка, достаточно ли быстро работает программа

– тестирование безопасности
проверка, безопасна ли программа
Тестирование
Тестирование

– юнит-тестирование
тестирование отдельных модулей программы. Проверяется, правильно ли работает
каждая из частей программы в отдельности
Тестирование

– юнит-тестирование
тестирование отдельных модулей программы. Проверяется, правильно ли работает
каждая из частей программы в отдельности

– интеграционное тестирование
проверка, правильно ли взаимодействуют компоненты системы
Тестирование

– юнит-тестирование
тестирование отдельных модулей программы. Проверяется, правильно ли работает
каждая из частей программы в отдельности

– интеграционное тестирование
проверка, правильно ли взаимодействуют компоненты системы

– системное тестирование
проверка, правильно ли работает вся система
Тестирование

– юнит-тестирование
тестирование отдельных модулей программы. Проверяется, правильно ли работает
каждая из частей программы в отдельности

– интеграционное тестирование
проверка, правильно ли взаимодействуют компоненты системы

– системное тестирование
проверка, правильно ли работает вся система
Тесты в JS
Тесты
Тесты
1. что тестировать
Тесты
1. что тестировать

2. как тестировать
Что тестировать
Что тестировать
• test runner — программа, которая запускает тестовые файлы и показывает результат
их выполнения
Что тестировать
• test runner — программа, которая запускает тестовые файлы и показывает результат
их выполнения

• тестовый фреймворк — набор команд для проверки результатов выполнения кода


*.test.js
тесты создаются как отдельные JS-файлы,
использующие основные файлы как зависимости
и запускающие проверки кода
☕ mocha
(мокка, сорт кофе) тест-фреймворк — набор
методов, который позволяет описывать тесты в
коде. Отвечает на вопрос «что тестировать»:
позволяет описывать наборы тестов и тестовые
случаи
Фреймворк mocha
Фреймворк mocha
1. Наборы тестов (test suites): describe/suite(string, Function)
группы проверок, связанные одной общей темой, например проверка отдельного
набора функций модуля, выполняющего одну задачу
Фреймворк mocha
1. Наборы тестов (test suites): describe/suite(string, Function)
группы проверок, связанные одной общей темой, например проверка отдельного
набора функций модуля, выполняющего одну задачу

2. Тестовые случаи (test cases): it/case(string, Function)


конкретные проверки правильно ли работают определенные выражения в коде
assert
стиль проверки выражений — подразумевает под
собой наличие эталона с которым будет сравнивать
получившийся вариант
assert
принимает на вход значение, которое переводит в boolean. Если значение равно true,
продолжает выполнение, если false — выдает ошибку (останавливает JS)

Хороший код
assert
принимает на вход значение, которое переводит в boolean. Если значение равно true,
продолжает выполнение, если false — выдает ошибку (останавливает JS)

Хороший код

circleLen === 2*PI*radius


assert
принимает на вход значение, которое переводит в boolean. Если значение равно true,
продолжает выполнение, если false — выдает ошибку (останавливает JS)

Хороший код

Проходите
assert
принимает на вход значение, которое переводит в boolean. Если значение равно true,
продолжает выполнение, если false — выдает ошибку (останавливает JS)

Хороший код
assert
принимает на вход значение, которое переводит в boolean. Если значение равно true,
продолжает выполнение, если false — выдает ошибку (останавливает JS)

Хороший код

10 - 8 === 11
assert
принимает на вход значение, которое переводит в boolean. Если значение равно true,
продолжает выполнение, если false — выдает ошибку (останавливает JS)

Хороший код

🔫
assert
assert
– assert
проверяет на правдивость выражение
assert
– assert
проверяет на правдивость выражение

– assert.equal/notEqual/strictEqual/notStrictEqual
проверяет, равны ли два значения
assert
– assert
проверяет на правдивость выражение

– assert.equal/notEqual/strictEqual/notStrictEqual
проверяет, равны ли два значения

– assert.deepEqual/notDeepEqual
проверяет равны ли объекты по значению
assert
– assert
проверяет на правдивость выражение

– assert.equal/notEqual/strictEqual/notStrictEqual
проверяет, равны ли два значения

– assert.deepEqual/notDeepEqual
проверяет равны ли объекты по значению

– assert.throws/assert.doesNotThrow
проверяет, падает ли функция с ошибкой
Как тестировать
Как тестировать
Как тестировать
• Test-driven Development (разработка через тестирование) — сначала написать тесты,
а потом код
Как тестировать
• Test-driven Development (разработка через тестирование) — сначала написать тесты,
а потом код

• Behaviour-driven development
Как тестировать
• Test-driven Development (разработка через тестирование) — сначала написать тесты,
а потом код

• Behaviour-driven development

• Test-last Development (тестирование потом) — сначала пишется код и только потом


он покрывается тестами
Как тестировать
• Test-driven Development (разработка через тестирование) — сначала написать тесты,
а потом код

• Behaviour-driven development

• Test-last Development (тестирование потом) — сначала пишется код и только потом


он покрывается тестами

• Behaviour-last development ;)
Test Last Development (TLD)
Test Last Development —
(тесты потом) разработка по принципу написания
тестов для уже готового кода. После того как код
написан, пишутся тесты, которые проверяют,
работает ли программа так, как задумано
Test Last Development
подходит в ситуации, когда нужно сформировать
набор тестов для уже имеющегося кода
Test Last Development
Test-driven Development (TDD)
методология подхода к написанию ПО на основе
тестов
Test-driven Development (TDD) —
сначала пишутся тесты, для того, чтобы закрепить
поведение программы, а потом пишется код, на
котором тесты будут выполняться без ошибок
Behavior-driven development (BDD)
набор практик и подходов к написанию тестов.
Диктует стиль написания и формулирования тестов.
Основан на подходе TDD

codeutopia.net/blog/2015/03/01/unit-testing-tdd-and-bdd
[ ] Тест 1
слайды корректно переключаются

[ ] Тест 2
не происходит переполнения вправо

[ ] Тест 3
не происходит переполнения влево
[
[x]
] Тест 1
слайды корректно переключаются

[ ] Тест 2
не происходит переполнения вправо

[ ] Тест 3
не происходит переполнения влево
[
[x]
] Тест 1
слайды корректно переключаются

[
[x]
] Тест 2
не происходит переполнения вправо

[ ] Тест 3
не происходит переполнения влево
[
[x]
] Тест 1
слайды корректно переключаются

[
[x]
] Тест 2
не происходит переполнения вправо

[
[x]
] Тест 3
не происходит переполнения влево
Test-driven Development
разработка ведется короткими итерациями,
по определенному алгоритму
Test-driven Development —
Test-driven Development —
1. написать тест
тест используется для описания функциональности, формализует задачу
Test-driven Development —
1. написать тест
тест используется для описания функциональности, формализует задачу

2. запустить тесты и проверить, проходят ли они


не должны
Test-driven Development —
1. написать тест
тест используется для описания функциональности, формализует задачу

2. запустить тесты и проверить, проходят ли они


не должны

3. написать код
который будет решать поставленную задачу так, чтобы
тесты начали проходить. Код не должен быть идеальным,
он просто должен выполнять поставленную задачу
Test-driven Development —
1. написать тест
тест используется для описания функциональности, формализует задачу

2. запустить тесты и проверить, проходят ли они


не должны

3. написать код
который будет решать поставленную задачу так, чтобы
тесты начали проходить. Код не должен быть идеальным,
он просто должен выполнять поставленную задачу

4. запустить тесты
проверить, проходят ли тесты теперь
Test-driven Development —
1. написать тест
тест используется для описания функциональности, формализует задачу

2. запустить тесты и проверить, проходят ли они


не должны

3. написать код
который будет решать поставленную задачу так, чтобы
тесты начали проходить. Код не должен быть идеальным,
он просто должен выполнять поставленную задачу

4. запустить тесты
проверить, проходят ли тесты теперь

5. оптимизировать код
после решения задачи, можно улучшить код: оптимизировать алгоритмы, оптимизировать
расположение модулей
Test-driven Development
ключевой момент в разработке через тестирование
даже не само написание тестов до кода, а именно
короткие итерации написания полностью
протестированного кода

habrahabr.ru/post/314994/
Behaviour-last Development
(поведение потом) разработка после того как придет
менеджер и заставит что-то делать

XD
#include <iostream>

int main()
{
std::cout << "¡Adiós!";
return 0;
}

Вам также может понравиться