Перейти к содержанию

Unit-тестирование

Unit-тестирование (англ. unit testing) - это проверка корректности работы отдельных частей приложения в изолированной среде независимо друг от друга.

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

Регрессионная ошибка - ошибка, которая возникает в работе функции, при внесении изменений в другой части приложения.

Для unit-тестирования в Angular приложениях используется фреймворк Jasmine.

Созданное с помощью Angular CLI новое приложение по умолчанию устанавливает все инструменты, необходимые для unit-тестирования, и уже содержит тест для компонента AppComponent. Для его запуска из директории проекта выполните:

ng test

Команда собирает приложение в режиме отслеживания изменений и запускает все имеющиеся тесты. Файлы тестов должны быть названы в формате *.spec.ts. При создании элементов через Angular CLI эти файлы тестов создаются по умолчанию автоматически.

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

После выполнения команды ng test запустится браузер, в окне которого будет представлен результат тестирования. Отчет о тестировании также дублируется в консоль.

Рассмотрим структуру теста. Откройте файл /src/app/app.component.spec.ts для наглядности.

Общая структура теста:

import {...} from '...';
...

describe('related tests group', () => {
    beforeEach(() => {...});

    it('test description', async(() => {
        expect(...).toBe(...);
    }));

    ...
});

Сперва импортируются зависимости. В Angular unit testing это всегда элементы библиотеки @angular/core/testing и сущности, для которых пишется тест.

Далее описываются сами тесты.

Функция describe() объединяет в себе группу взаимосвязанных тестов. Первым параметром она принимает текстовое описание группы, вторым - функцию, которая содержит конфигурацию и набор тестов.

Общепринято объединять в группу тесты, относящиеся к одному компоненту, сервису и т. д., а саму группу называть именем компонента, сервиса и т. д.

describe('AppComponent', () => {
    ...
});

В describe() сам тест описывается функцией it(). Она также принимает в качестве параметров текстовое описание и функцию, в которой описана вся логика.

Проверка результата выполнения осуществляется с помощью функции expect(), принимающей итоговое значение, в связке с одной из функций соответствия

it('expect example', () => {
  let a = 5
  a = a + 7

  expect(a).toBe(12)
})

Функция beforeEach() используется для задания исходного состояния и вызывается перед каждой функцией it(). Например, перед запуском каждого теста необходимо создать экземпляр класса тестируемого компонента, и чтобы не делать это в каждой функции it(), можно использовать beforeEach().

beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [AppComponent]
  }).compileComponents()
}))