Як я можу перевірити свій веб-сервіс REST?


16

Я новачок у тестуванні одиниць, у мене є один веб-метод REST, який просто викликає БД та заповнює DTO. Псевдокод є

public object GetCustomer(int id)
{
  CustomerDTO objCust = //get from DB
  return objCust;
}

Мої сумніви в тому, як написати тести для цих методів та тип тестів (Інтеграція / Підрозділ), які слід включити. А для одиничних тестів, чи потрібно потрапляти в БД. Якби це було, і я передаю ідентифікатор клієнта і роблю кілька тверджень, дані можуть з часом змінитися, що призведе до збоїв.

Я думаю, я щось тут пропускаю, розуміючи ці поняття.


5
У коді, який ви опублікували, слід перевірити: (1) Чи можете ви зателефонувати на GetCustomer з int як параметр. (2) Чи повертає він об'єкт CustomerDTO? (3) Чи заповнюється цей об'єкт із БД, як очікувалося. (4) Чи трапляється очікувана поведінка, якщо її викликають з int, який не відповідає дійсному клієнту? Нічого з цього ще не пов'язане з REST. Коли ви будете готові написати код, який відповідає на RESTful запити, тоді ви напишете тести на нього.
DavidO

@DavidO: "Чи об'єкт заповнений із БД, як очікувалося." це, очевидно, не є одиничним тестом (щодо коду ОП). Це інтеграційний тест.
Flater

Так, ви праві. Якби я міг повернутися назад і змінити коментар, щоб згадати, що в тесті інтеграції ви перевірите компонент БД і в іншому випадку знущаєтесь над ним, я зробив би це редагування, але вікно редагування для коментарів за 5 хвилин, а коментар був зроблений шість багато років тому. :)
DavidO

Відповіді:


18

Незважаючи на тестування одиниць, ви не будете тестуватись із базою даних або, принаймні, не з базою даних, яку ви не підготували для тестування одиниць. Тестування з базою даних і, як таке, тестування різних шарів вашої програми одночасно, як правило, сприймається як тести інтеграції . За допомогою одиничних тестів ви повинні перевірити лише те, що робить ваш метод, що він повертає залежно від різних параметрів, а коли (чи ні) він повинен вийти з ладу.

Дуже очікується, що у своєму методі ви здійснюєте дзвінки до методів X з інших класів. Ви не випробовуєте ці X- методи, тому вам потрібно знущатися над цими методами.

Я гадаю, що ви пишете свій код на Java, у такому випадку у вас є чудові рамки глузування, такі як Mockito, які можуть бути корисними для вас. Незалежно від того, ви використовуєте глузливі рамки - це ваш вибір, я просто скажу, що вони заощадять вам багато часу, і той, про який я принаймні згадував, насправді не складний.

Якщо ви просто хочете написати власний макет для експерименту, то припустімо, що у вас є такий CustomerRepositoryклас:

public class CustomerRepository {
 public CustomerDTO getCustomer(int id) {
   ...
 }
}

Ви можете написати власний глузливий і брудний CustomerRepositoryклас наступним чином:

public class MockedCustomerRepository extends CustomerRepository {
 public boolean bThrowDatabaseException;
 public boolean bReturnNull;
 public boolean bReturnCustomerWrongId;
 public boolean bReturnCustomerWithId;
 public CustomerDTO getCustomer(int id) {
  if(bThrowDatabaseException) { 
    throw new DatabaseException("xxx"); 
  } else if(bReturnNull) { 
    return null; 
  } else if(bReturnCustomerWrongId) { 
    throw new CustomerNotExistException(id);
  } else if(bReturnCustomerWithId) { 
    return new CustomerDTO(id); 
  }
 }
}

Потім у вашому тестовому випадку ви в основному замінюєте свій "стандартний" екземпляр CustomerRepositoryз глузливим екземпляром, який дозволить перевірити свій метод на різні результати getCustomer:

public class CustomerRestTest {
  public void testGetCustomer_databaseFailure() {
    MockedCustomerRepository dto = new MockedCustomerRepository();
    dto.bThrowDataBaseException = true;
    yRestClass rest = new MyRestClass();
    rest.dto = dto;
    rest.getCustomer(0);
    // depending on what you do in your getCustomer method, you should check if you catched the exception, or let it pass, etc.. Make your assertions here

  public void testGetCustomer_customerNotExist() {
    // etc.
  }
}

Як правило, кожен метод тестування повинен перевіряти лише одне, це допомагає зберегти ваші тести невеликими та зосередженими на одному завданні.

Я повторю це :-) Написання цілого знущаного заняття потребує певного часу, як ви бачите. Подумайте, як використовувати глузуючий фреймворк, чим менше пише код, тим менше помилок робить , правда? Знущання над методом, який викидає виняток або повертає задане значення для заданого параметра, - це шматок пирога і займає 2 або 3 рядки (з макеті принаймні)

Сподіваємось, що допоможе протестувати ваш метод REST.


4
Зазвичай у ваших класах DTO немає логіки, особливо жодної, яка взаємодіє із вашим сховищем даних.
JustA AnotherUserYouMayKnowOrNot

1
Це був лише приклад, але ви абсолютно праві. Я збираюся змінити приклади, щоб вони краще відповідали теорії.
Джалайн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.