Czytelne testy z AAA: Arrange, Act, Assert

Czy słyszałeś/słyszałaś kiedyś o Arrange, Act Assert? W dzisiejszym wpisie powiem Ci co to jest, do czego służy i dlaczego warto używać tego podejścia do pisania testów. Dowiesz się jak pisać czytelne i poprawnie poukładane testy, dzięki wspomnianemu wzorcowi AAA.

Wzorzec do pisania testów

Okazuje się, że świat IT wymyślił również wzorce do pisania testów! Jednym z takich podejść jest chwytliwe AAA czyli Arrange, Act, Assert. Zostało ono stworzone głównie na potrzeby testów jednostkowych, jednak może być z powodzeniem stosowane również w innych rodzajach testów. Służy ono do ustrukturyzowania metod testowych, w taki sposób, aby dzieliły się one na trzy sekcje: przygotowania (arrange), akcji (act) oraz właściwego testowania, asercji (assert). Istnieją framework-i testowe, które domyślnie dostarczają odpowiednich, dedykowanych mechanizmów dla wzorca AAA, lecz tak naprawdę ich nie potrzebujemy. Konkretne sekcje w metodzie testowej możemy uwypuklić za pomocą komentarzy czy też nowych linii przed konkretną sekcją.

koncepcja AAA: Arrange, Act, Assert

Zalety stosowania AAA, dlaczego warto?

Wiemy już czym jest AAA, ale po co ono tak naprawdę powstało? Jak zawsze przy wzorcach, czy to projektowych, architektonicznych czy testowych, zawsze chodzi o rozwiązanie pewnego problemu. W tym przypadku, chodziło o wprowadzenie standardu pisania testów, po to aby zmiana, bądź rozbudowa funkcji testującej była łatwiejsza. Na pierwszy rzut oka używanie tego podejścia wydawać by się mogło, że niepotrzebnie komplikuje nasze testy. Nic bardziej mylnego! Dzięki AAA nasze testy są czytelne, ponieważ w każdej sekcji mamy zgrupowany odpowiedni rodzaj kodu. Wprowadzamy więc standard, a jak wiadomo standaryzacja, to przeważnie bardzo dobry pomysł.

Przykład testu z AAA

Tak, jak wspomniałem metodykę Arrange, Act, Assert do swoich testów możemy wprowadzić poprzez zadeklarowanie granic poszczególnych sekcji w teście. Jest to możliwe np. poprzez rozdzielanie ich za pomocą nowych linii, tak, jak w tym przykładzie:

test('something', async () => {
  const userData = { id: randomUUID(), name: 'John' };

  const result = await repo.findOneById(userData.id);

  expect(findOneByIdDAOSpy).toHaveBeenCalledTimes(1);
  expect(findOneByIdDAOSpy).toHaveBeenCalledWith(userData.id);
  expect(result).toEqual(new UserEntity(userData));
});

Jeżeli jesteśmy fanami wielu nowych linii pomiędzy blokami kodu, to taki podział może być dla nas problematyczny. Wtedy możemy wprowadzić stosowne komentarze nad każdą sekcją i jawnie pokazać o jaki blok nam chodzi:

test('something', async () => {
  // Arrange
  const findOneByIdDAOSpy = jest.spyOn(UserDao.prototype, 'findOneById');

  const userData = { id: randomUUID(), name: 'John' };

  // Act
  repo.add(userData);

  const result = await repo.findOneById(userData.id);

  // Assert
  expect(findOneByIdDAOSpy).toHaveBeenCalledTimes(1);

  expect(findOneByIdDAOSpy).toHaveBeenCalledWith(userData.id);

  expect(result).toEqual(new UserEntity(userData));
});

Podsumowanie

  • AAA, to wzorzec do pisania czytelnych metod testowych.
  • Zakłada on podział testu na trzy sekcje: Arrange, Act, Assert.
  • Poszczególne sekcje w funkcji testującej możemy rozdzielić np. nową linią lub stosownym komentarzem.
Autor wpisu

blog@orbisbit.com

Komentarze

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Sprawdź również
  • CQRS – Command Query Responsibility Segregation

    Command Query Responsibility Segregation czyli CQRS. Jest to wzorzec projektowy, który rozdziela zadania odczytu i zapisu do osobnych modeli. Sprawdź ten wpis, aby dowiedzieć się kiedy i jak z niego skorzystać.

    Zobacz wpis

  • GRASP – kolejny zbiór zasad Clean Code do zapamiętania

    Pewnie większość z Was słyszała o zasadach SOLID. Są one bardzo rozpowszechnione i dosyć często stosowane, ale czy słyszeliście o GRASP? General Responsibility Assignment Software Patterns, to kolejna dawka zasad czystego kodu do zapamiętania.

    Zobacz wpis

  • Wzorzec strategia (strategy pattern)

    Jeżeli masz dość if-ologii w swoim kodzie, to konieczne sprawdź czym jest czynnościowy wzorzec projektowy strategia. Pozwala on mądrze obsługiwać różne scenariusze w procesie i jednocześnie być fancy pod względem zasad SOLID.

    Zobacz wpis