Просто напиши тест

Alexey Raspopov, DataRobot.

Писать тесты это
не больно

Писать тесты это
не больно?

Вы уверены в работоспособности вашего кода?

Какие ваши доказательства?

Тесты это дёшево. У вас просто нет достаточно веcкой причины не писать их.

Настройка окружения это просто. Проще чем настроить вебпак.

Никакого rocket science. Поговорим о том как быстро начать и чтобы это приносило пользу.

JavaScript очень долго использовался для несущественных модификаций веб-страниц. Инструменты для тестирования развивались медленно и не получали нужного внимания.

Сейчас можно с уверенностью сказать, что проблема отсутствия и сложности инструментов устранена.

  1. QUnit
  2. Mocha
  3. Karma

npm install jest

npm install babel-jest

/* package.json */
			"scripts": {
			  "test": "jest --coverage"
			}
		
			/core
			
			  HTTPClient.js
			/user
			
			  UserAPI.js
		
			/* core/UserAPI.js */
			import HTTPClient from 'core/HTTPClient';
			export default class Users {
			  create(data) {
			    return HTTPClient.post(...);
			  }
			  retrieve(query) {
			    return HTTPClient.get(...);
			  }
			}
		
			/* core/__mocks__/HTTPClient.js */
			export default {
			  get: jest.fn(),
			  post: jest.fn(),
			};
		
			/* user/__tests__/UserAPI-test.js */
			jest.mock('core/HTTPClient');
			import HTTPClient from 'core/HTTPClient';
			import Users from 'user/UserAPI';
			
		

npm install protractor

/* protractor.config.js */
			exports.config = {

			

			

			

			};
		
/* package.json */
			"scripts": {
			  "test-e2e": "protractor protractor.config.js"
			}
		

Page Object Pattern

When you write tests against a web page, you need to refer to elements within that web page in order to click links and determine what's displayed. However, if you write tests that manipulate the HTML elements directly your tests will be brittle to changes in the UI.

A page object wraps an HTML page, or fragment, with an application-specific API, allowing you to manipulate page elements without digging around in the HTML.

Код element.all(by.css('.label')) о манипуляции HTML элементами.

Код getTodos() о манипуляции данными приложения.

			export default class TodosPage {
			  constructor() {
			    this.newTodoInput = by.css('.new-todo');
			    this.todos = by.css('.todo-list .view label');
			  }
			  getTodos() {
			    return element.all(this.todos).map(e => e.getText());
			  }
			  createTodo(text) {
			    return element(this.newTodoInput)
			      .sendKeys(text, protractor.Key.ENTER);
			  }
			}
		
			import TodosPage from './Todos.object';
			describe('Todos', () => {
			  const todos = new TodosPage();
			  it('should add new todo to the list', async () => {
			    await browser.get('/');
			    await todos.createTodo('Send an email');
			    expect(todos.getTodos()).toContain('Send an email');
			  });
			});
		

Лайкос, шейр, подписон

Ссылка на это слайды — alexeyraspopov.github.io/just-test-it

Спасибо за внимание