Как написать тест для процесса, состоящего из нескольких шагов - PullRequest
0 голосов
/ 23 марта 2020

У меня есть вопрос, касающийся написания модульных тестов в процессах, состоящих из нескольких этапов.

Предположим, что для этого примера у нас есть следующий сценарий: есть веб-сайт с пользователями, у которых есть учетные записи веб-сайта. Чтобы иметь меньше пользовательских данных, на сайте есть процесс удаления неактивных учетных записей. Если учетная запись неактивна в течение года (например, пользователь не вошел в свою учетную запись), учетная запись удаляется. За четыре недели до удаления учетной записи пользователь отправляет электронное письмо, сообщающее ему, что учетная запись будет удалена. За две недели до удаления пользователю отправляется второе электронное письмо, если учетная запись все еще не активна. Это письмо будет отправлено только в том случае, если отправлено первое письмо. Затем, если пользователь еще не использовал учетную запись, учетная запись удаляется, и пользователю будет отправлено окончательное электронное письмо. Это электронное письмо будет отправлено только в том случае, если первые два письма были отправлены.

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

func test_happy_flow() {
  user_account = setup_inactive_user_account()

  date = date('four weeks before closure')
  runClosureProcess(user_account, date)
  assert(send_emails).contains(FIRST_EMAIL)

  date = date('two weeks before closure')
  runClosureProcess(user_account, date)
  assert(send_emails).contains(SECOND_EMAIL)

  date = date('closure date')
  runClosureProcess(user_account, date)
  assert(send_emails).contains(CLOSURE_EMAIL)
}

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

Еще один способ сделать это - использовать три разных теста:

func test_if_first_email_will_be_send() {
  user_account = setup_inactive_user_account()

  date = date('four weeks before closure')
  runClosureProcess(user_account, date)
  assert(send_emails).contains(FIRST_EMAIL)
}

func test_if_second_email_will_be_send() {
  user_account = setup_inactive_user_account()

  date = date('four weeks before closure')
  runClosureProcess(user_account, date)

  date = date('two weeks before closure')
  runClosureProcess(user_account, date)
  assert(send_emails).contains(SECOND_EMAIL)
}

func test_if_closure_email_will_be_send() {
  user_account = setup_inactive_user_account()

  date = date('four weeks before closure')
  runClosureProcess(user_account, date)

  date = date('two weeks before closure')
  runClosureProcess(user_account, date)

  date = date('closure date')
  runClosureProcess(user_account, date)
  assert(send_emails).contains(CLOSURE_EMAIL)
}

В нем больше кода и дублирование, но каждый сценарий тестируется индивидуально.

Существуют ли какие-либо шаблоны или «стандартные» способы тестирования таких потоков? Или предпочтительный способ будет зависеть от личных и командных предпочтений?

...