Стратегии тестирования

Тестирование в Angular делится на несколько уровней: юнит-тесты, интеграционные тесты и энд-то-энд тесты. Каждый уровень имеет свои цели, инструменты и методы.

Юнит-тестирование компонентов

Юнит-тесты проверяют отдельные компоненты, сервисы и пайпы. Для Angular используется Jasmine и тестовый раннер Karma. Основная цель — убедиться, что компонент работает корректно изолированно, без зависимости от внешних сервисов.

Пример теста компонента:

describe('AppComponent', () => {
  let component: AppComponent;
  let fixture: ComponentFixture<AppComponent>;

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [AppComponent],
      imports: [HttpClientTestingModule]
    }).compileComponents();

    fixture = TestBed.createComponent(AppComponent);
    component = fixture.componentInstance;
  });

  it('должен создать компонент', () => {
    expect(component).toBeTruthy();
  });

  it('должен инициализировать значение title', () => {
    expect(component.title).toEqual('AngularApp');
  });
});

Интеграционное тестирование

Проверяет взаимодействие между несколькими компонентами или между компонентом и сервисом. Часто используется TestBed, позволяющий создавать реальную среду работы компонента с модулями и сервисами.

Пример интеграционного теста с сервисом:

it('должен получать данные от сервиса', () => {
  const service = TestBed.inject(DataService);
  spyOn(service, 'getData').and.returnValue(of(['item1', 'item2']));
  
  fixture.detectChanges();
  
  expect(component.items.length).toBe(2);
});

Энд-то-энд тестирование (E2E)

E2E-тесты симулируют действия пользователя на реальном приложении. В Angular используется Protractor или Cypress. Они позволяют проверять навигацию, форму, клики и анимации в браузере.

Пример Cypress-теста:

describe('Главная страница', () => {
  it('отображает заголовок', () => {
    cy.visit('/');
    cy.contains('h1', 'Добро пожаловать');
  });
  
  it('переход на страницу деталей', () => {
    cy.get('a.details-link').click();
    cy.url().should('include', '/details');
  });
});

Стратегии покрытия

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

Советы по организации тестов

  • Использовать beforeEach для подготовки среды и afterEach для очистки состояния.
  • Избегать тестирования сторонних библиотек, сосредотачиваться на собственном коде.
  • Следить за поддержанием читаемости и модульности тестов, чтобы они оставались понятными и простыми в сопровождении.