SlideShare a Scribd company logo
Никита Галкин
Ezetech
Testing in Node.js World
Галкин
Никита
Люблю и умею:
▰ Node.js, OpenSource, TypeScript, Docker, AWS
▰ Распиливать монолиты на микросервисы
Верю:
▰ Проблем нужно решать на правильном уровне
▰ Сложности в людях, а не технологиях
▰ Идеи и решения надо “продавать”
Доклады:
▰ Spec driven development in Microservices
▰ Использовании TypeScript для Node.js приложений
▰ Best practices of Node.js use in production
Ссылки:
GitHub Twitter Facebook
2
3
О чем этот доклад?
Какие проблемы?
▰ Что и как тестировать?
▰ Разные Node.js проекты требуют разного подхода. Какие и когда
применять?
▰ Как тестировать асинхронную логику?
▰ Как тратить на тесты меньше времени?
▰ Что тестировать разработчикам, а что тестировщикам?
4
5
А зачем
тестировать?
Что бы не было
багов?
Не в багах дело.
Дело в людях.
Архитектура это компромисс
между требованиями и
имеющимся ресурсами.
Она показывает как команда
может договариваться.
Что скрывается за...
Тестирование это проверка
соответствия функционала
требованиям.
Оно показывает насколько
команда понимает результат
и умеет нести за него
ответственность.
8
Термины
9
Test:
▰Case
▰Suit
▰Status
▻Passed
▻Failed
▻Skipped
▰Coverage
Термины
Lib types:
▰ Run
▰Assert or Expectation
▰Spies
▰Stubs
▰Mocks
10
11
Фреймворк это не только
набор библиотек, но и
философия
12
Как тестировать?
Формула теста
Arrange-Act-Assert VS Given-When-Then
13
Формула теста
Arrange/Given – настройка всех зависимостей и
данных.
Act/When – запуск тестируемого кода.
Assert/Then – проверка, что получен ожидаемый
результат и/или произошел side-effect.
Cleanup – очистка состояния.
14
Без формулы
15
describe('Array', function() {
describe('#indexOf()', function() {
it('should return -1 when the value is not present', function() {
assert.equal(-1, [1,2,3].indexOf(4));
});
});
});
C формулой
16
describe('Array', function() {
describe('#indexOf()', function() {
it('should return -1 when the value is not present', function() {
// arrange
const arr = [1,2,3];
const el = 4;
// act
const index = arr.indexOf(el);
// assert
assert.equal(-1, index);
});
});
});
Виды Node.js кода
17
Виды Node.js кода
CLI – консольная утилита, например webpack, yo.
Package – npm пакет.
Script – пример, конфигурация для webpack.
Microservice – одна процесс-функция, например websocket.
Monolithic APP – сразу много процессов.
18
CLI tool
19
process.stdin Node.js process.stdout
System
DB
Boundaries
Business Logic
nginx
Микросервис
Рекомендация по структуре
Аналог Entity-Control-Boundary
/boundaries
/rest
smtp.js
/services
users.js
app.js
21
Виды тестирования
22
Unit
23
Integration
Component
E2E
Виды тестов
Unit – тестирование одного файла (класса).
Integration – тестирование взаимодействия кода.
Component – тестирование всего приложения.
End-to-end – тестирование всей системы.
Contract – тестирование контракта/интерфейса.
24
Когда применять
Unit – Business Logic.
Integration – Microservice.
Component – CLI.
End-to-end – Monolithic.
Contract – REST API, TypeScript definition.
25
Что применять
Unit – mocha+chai+sinon, jest.
Integration – nock, supertest, etc.
Component – spawn from child_process.
End-to-end – WebDriver for Browser or Custom Solution.
Contract – Abao, TypeScript.
nyc for code coverage.
26
Integration
27
const app = require('./../src/app');
const request = require('supertest');
describe('GET /ping', function (){
it('should return status 200', function (done) {
request(app)
.get('/ping')
.expect('Content-Type', /json/)
.expect(200, {response: 'success'}, done);
});
});
Component
28
describe('CLI', function () {
let messageCallback, errorCallback, closeCallback
function startCLI(commandOptions) {
let childProcess = require('child_process').spawn('path/to/cli', commandOptions)
childProcess.stdout.on('data', messageCallback)
childProcess.stderr.on('data', errorCallback)
childProcess.on('close', closeCallback)
return childProcess
}
it('should stopping gracefully', function(done) {
closeCallback = (code) => {
expect(code).to.equal(0)
done()
}
errorCallback = done
let cli = startCLI([`-f=example`])
setTimeout(() => cli.kill('SIGTERM'), 1000)
})
})
Одни тесты для
разных видов
тестирования?
NOCK_OFF
Contract
import StatusClient = require("tc-status-client");
const options = {
namespace: 'monitoring:status',
statusCheckInterval: 50
};
let client = new StatusClient(options);
client.register('example', () => true);
client.run();
client.terminate();
client.isRunning();
30
declare class StatusClient {
constructor(options?: {
namespace?: string;
statusCheckInterval?: number;
statusMessageTtl?: number;
blacklistedKeyPatterns?: RegExp[];
});
run(): StatusClient;
register(serviceName: string, serviceCheck: () => boolean):
StatusClient;
isRunning(): boolean;
terminate(): void;
}
declare module "tc-status-client" {
export = StatusClient;
}
31
Все виды тестирования
можно писать на Node.js
F.I.R.S.T.
По мотивам книги “Чистый код”
32
БЫСТРОТА
Тесты должны выполняться
быстро.
Используйте стабы (stubs) и
моки (mock).
Запускайте тесты
параллельно с помощью ava
или jest.
Fast
33
Независимость
Результаты выполнения
одного теста не должны быть
входными данными для
другого.
Для создания состояния
используйте beforeEach.
Independent
beforeEach(function() {
return db.clear()
.then(function() {
return db.save([tobi, loki, jane]);
});
});
34
Повторяемость
Тесты должны давать
одинаковые результаты
независимо от среды
выполнения.
В крайнем случае
используйте skip
Repeatable
it('should write to log', function (done) {
// @todo Fix on travis file writing
if (process.env.TRAVIS) {
return this.skip()
}
// main logic ...
}
35
Очевидность
Тест либо прошел, либо не
прошел, либо не запускался.
Это должно быть легко
понятно любому
разработчику.
Self-Validating
36
Своевременность
Тесты должны создаваться
своевременно.
Потом никогда не наступит.
Timely
37
Пиши тесты
38
That's All Folks!
@galk_in
39

More Related Content

PDF
"Prom.ua shopping cart workflow as a microfrontend", Danylo Kazymyrov
PPTX
Сергей Мелашич "Настройка SEO для одностраничных web-приложений на Angular"
PDF
"Web Vitals monitoring & optimizations", Erik Himiranov
PPTX
Codeception + Docker + Robo и что из этого вышло
PPTX
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
PPTX
Docker + Selenium Webdriver в рамках Continuous Integration
PDF
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
PPTX
Готовим Docker для Автоматизации Тестирования
"Prom.ua shopping cart workflow as a microfrontend", Danylo Kazymyrov
Сергей Мелашич "Настройка SEO для одностраничных web-приложений на Angular"
"Web Vitals monitoring & optimizations", Erik Himiranov
Codeception + Docker + Robo и что из этого вышло
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
Docker + Selenium Webdriver в рамках Continuous Integration
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
Готовим Docker для Автоматизации Тестирования

What's hot (20)

PDF
"Electron. How the most modern framework works" Oleksii Holubiev
PPTX
Kubernetes
PDF
Jenkins Imperative Pipeline vs Declarative Pipeline
PDF
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"
PDF
Continuous Delivery with Jenkins: Lessons Learned
PPTX
selenium stack in python
PPTX
Use Grunt Luke
PPTX
Тестирование REST-сервисов с применением инженерных практик
PDF
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
PDF
Apache JMeter vs LoadRunner: на заре справедливости, сравнение инструментов н...
PDF
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
PDF
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
PPTX
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
PPTX
Docker + Selenium Webdriver в рамках Continuous Integration
PDF
Иван Крутов - Автоматизация сборки Java-проекта
PPTX
Кирилл Комлев. О реализации continuous integration для web проектов
PDF
BDD girls Battle: Cucumber VS. JBehave
PDF
Артем Титаренко
PDF
Svyatoslav Login "How to test authentication and authorization for security"
PPTX
Jenkins 2.0: Организуем тестирование в составе Continuous Delivery
"Electron. How the most modern framework works" Oleksii Holubiev
Kubernetes
Jenkins Imperative Pipeline vs Declarative Pipeline
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"
Continuous Delivery with Jenkins: Lessons Learned
selenium stack in python
Use Grunt Luke
Тестирование REST-сервисов с применением инженерных практик
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Apache JMeter vs LoadRunner: на заре справедливости, сравнение инструментов н...
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Docker + Selenium Webdriver в рамках Continuous Integration
Иван Крутов - Автоматизация сборки Java-проекта
Кирилл Комлев. О реализации continuous integration для web проектов
BDD girls Battle: Cucumber VS. JBehave
Артем Титаренко
Svyatoslav Login "How to test authentication and authorization for security"
Jenkins 2.0: Организуем тестирование в составе Continuous Delivery
Ad

Similar to Никита Галкин "Testing in Node.js World" (20)

PPTX
Создаем масштабируемое корпоративное JavaScript-приложение, Влад Плотник
PPTX
Nikita Galkin "5 production Node.js stories"
PDF
Wild microservices and imaginary DevOps
PDF
Дикие микросервисы на JUG Екатеринбург
PDF
Python Development process in Yandex
PDF
Процессы разработки в Яндексе
PDF
Микросервисная архитектура на базе CoreOS и Kubernetes
PDF
Архитектурные решения при создании облачного сервиса на Asp.Net
PDF
Программируемость фабрики ACI. Объектная модель, REST API, ACI Python SDK
PDF
DevOps guide for awesome quality assurance
PPTX
Использование Mock-объектов в TDD на платформе .NET
PPTX
Повышение качества тестов и автоматическая валидация REST API документации
PPTX
Микросервисы в .NET Core
PDF
IT-инфраструктура. FAQ для разработчика
PPTX
Разработка модуля для отладки приложений на языке ActionScript 3 в среде Visu...
PDF
Continuous integration testing of mobile SDK
PPTX
Online TechTalk “Flutter Mobile Development”
PDF
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...
PDF
Как Cluster Membership Software может помочь QA
PDF
Desktop app based on node js and html5
Создаем масштабируемое корпоративное JavaScript-приложение, Влад Плотник
Nikita Galkin "5 production Node.js stories"
Wild microservices and imaginary DevOps
Дикие микросервисы на JUG Екатеринбург
Python Development process in Yandex
Процессы разработки в Яндексе
Микросервисная архитектура на базе CoreOS и Kubernetes
Архитектурные решения при создании облачного сервиса на Asp.Net
Программируемость фабрики ACI. Объектная модель, REST API, ACI Python SDK
DevOps guide for awesome quality assurance
Использование Mock-объектов в TDD на платформе .NET
Повышение качества тестов и автоматическая валидация REST API документации
Микросервисы в .NET Core
IT-инфраструктура. FAQ для разработчика
Разработка модуля для отладки приложений на языке ActionScript 3 в среде Visu...
Continuous integration testing of mobile SDK
Online TechTalk “Flutter Mobile Development”
TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirS...
Как Cluster Membership Software может помочь QA
Desktop app based on node js and html5
Ad

More from Fwdays (20)

PDF
"Mastering UI Complexity: State Machines and Reactive Patterns at Grammarly",...
PDF
"Effect, Fiber & Schema: tactical and technical characteristics of Effect.ts"...
PPTX
"Computer Use Agents: From SFT to Classic RL", Maksym Shamrai
PPTX
"Як ми переписали Сільпо на Angular", Євген Русаков
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
PDF
"Validation and Observability of AI Agents", Oleksandr Denisyuk
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
PPTX
"Co-Authoring with a Machine: What I Learned from Writing a Book on Generativ...
PPTX
"Human-AI Collaboration Models for Better Decisions, Faster Workflows, and Cr...
PDF
"AI is already here. What will happen to your team (and your role) tomorrow?"...
PPTX
"Is it worth investing in AI in 2025?", Alexander Sharko
PDF
''Taming Explosive Growth: Building Resilience in a Hyper-Scaled Financial Pl...
PDF
"Scaling in space and time with Temporal", Andriy Lupa.pdf
PDF
"Database isolation: how we deal with hundreds of direct connections to the d...
PDF
"Scaling in space and time with Temporal", Andriy Lupa .pdf
PPTX
"Provisioning via DOT-Chain: from catering to drone marketplaces", Volodymyr ...
PPTX
" Observability with Elasticsearch: Best Practices for High-Load Platform", A...
PPTX
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
PPTX
"Istio Ambient Mesh in production: our way from Sidecar to Sidecar-less",Hlib...
"Mastering UI Complexity: State Machines and Reactive Patterns at Grammarly",...
"Effect, Fiber & Schema: tactical and technical characteristics of Effect.ts"...
"Computer Use Agents: From SFT to Classic RL", Maksym Shamrai
"Як ми переписали Сільпо на Angular", Євген Русаков
"AI Transformation: Directions and Challenges", Pavlo Shaternik
"Validation and Observability of AI Agents", Oleksandr Denisyuk
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
"Co-Authoring with a Machine: What I Learned from Writing a Book on Generativ...
"Human-AI Collaboration Models for Better Decisions, Faster Workflows, and Cr...
"AI is already here. What will happen to your team (and your role) tomorrow?"...
"Is it worth investing in AI in 2025?", Alexander Sharko
''Taming Explosive Growth: Building Resilience in a Hyper-Scaled Financial Pl...
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Database isolation: how we deal with hundreds of direct connections to the d...
"Scaling in space and time with Temporal", Andriy Lupa .pdf
"Provisioning via DOT-Chain: from catering to drone marketplaces", Volodymyr ...
" Observability with Elasticsearch: Best Practices for High-Load Platform", A...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"Istio Ambient Mesh in production: our way from Sidecar to Sidecar-less",Hlib...

Никита Галкин "Testing in Node.js World"