Должен ли я использовать try-catch в тестовом случае? - PullRequest
0 голосов
/ 19 октября 2018

Я думаю, что проблема.Вот образец:

index.ts

async function getUserById(id?: number) {
  return new Promise((resolve, reject) => {
    if (id) {
      const user = { id };
      resolve(user);
    } else {
      reject(new Error('user id is required'));
    }
  });
}

export { getUserById };

index.spec.ts:

import { getUserById } from './';

const coin = () => Math.random() > 0.5;

describe('should throw an error test suites', () => {
  const testCount = 1000;

  for (let i = 0; i < testCount; i++) {
    it(`t-${i}`, async () => {
      const id = coin() ? 1 : 0;
      try {
        const user = await getUserById(id);
        expect(user).toEqual({ id });
      } catch (error) {
        expect(error.message).toBe('user id is required');
      }
    });
  }
});

Результаты испытаний:

Test Suites: 1 passed, 1 total
Tests:       1000 passed, 1000 total
Snapshots:   0 total
Time:        2.637s

Как вывидите, я динамически генерирую множество тестовых случаев.Проблема в том, что тестовые случаи всегда будут проходить в этом случае.Я думаю, что неправильно проверять части correct и exception вместе.Я прав?

Когда мне следует использовать try-catch в тестовых случаях?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Использование try-catch в тестовом коде не является проблемой как таковой.Фактически, вам даже нужно сделать это, если в тестовом коде вы хотите проверить, генерирует ли тестируемая система (SUT) ожидаемое ожидание.

Однако ваш конкретный пример делает некоторые вещи втестовый код, который имеет неблагоприятные последствия.Во-первых, ваш тестовый код объединяет тесты для двух разных аспектов (сценарий успеха и сценарий сбоя) в одну функцию тестирования.Одним из недостатков является то, что это усложняет тестовый код и порой затрудняет понимание того, какая часть установки необходима для какого теста.Вы использовали try-catch для слияния тестов, но проблема не в try-catch, а в слиянии.

И, фактически, это слияние фактически привело вас в ловушку: ваши объединенные тесты не работаютдолжным образом.Например, вы выбираете id случайным образом.Значение id из 1 должно привести к правильной доставке user.Однако вы на самом деле не проверяете это: если ваше SUT по ошибке всегда выдает исключение, вы будете считать это успешным тестом.

Во-вторых, вы выполняете 1000 тестов, но эффективно только тестдва сценария (аспекты).Поэтому 1000 тестов ничего не покупают.Скорее наоборот: слишком сложное может даже означать, что вы по ошибке (из-за ошибки в выборе сценария) не тестируете оба сценария.Или, что по стечению обстоятельств всегда выбирается один сценарий (маловероятно, допущен).В любом случае вы тратите время на выполнение 1000 тестов для эффективного значения только 2 протестированных аспектов.

0 голосов
/ 19 октября 2018

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

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

...