Должны ли тесты e2e сохранять данные в реальных базах данных? - PullRequest
3 голосов
/ 11 марта 2019

Я много читал о тестировании e2e, и я не могу понять, насколько «реальными» должны быть тесты e2e.

Независимо от инструментов, которые я использую для тестов e2e, я видел, что большую часть времени они попадают в локальную среду, среду разработки или альфа-среду.

Если мое приложение имеет аутентификацию, должен ли я создать «тестового» пользователя с действительными учетными данными в базе данных? Должен ли я сделать это для Alpha или даже производственной среды? Как еще этот тестовый пользователь может войти в мое приложение?

Скажем, у меня есть печально известное приложение TODO. У меня есть тест, который регистрирует пользователя. После входа в систему я хочу проверить, что пользователь может создать TODO. Это TODO сохраняется в базе данных.

После запуска тестов нужно ли что-то запускать для удаления данных, созданных во время тестов e2e? Или мне следует перехватить запрос непосредственно перед его сохранением и смоделировать ответ (это будет антипаттерном для тестирования e2e)?

Ответы [ 3 ]

1 голос
/ 11 марта 2019

В настоящее время я работаю в крупной известной компании в нашей команде инструментов тестирования и фреймворков. Так что, хотя я и не эксперт, это часть моей работы. Я собираюсь говорить конкретно о веб-тестировании. Тестирование несколько отличается для нативных приложений, таких как iOS и Android, и я не очень знаком с этими аспектами.

Терминология между e2e (сквозное) и интеграционными тестами несколько взаимозаменяема, в то время как модульные тесты имеют более конкретное определение.

Как правило, e2e / интеграционные тесты должны выполняться в среде разработки и производства. В зависимости от ваших настроек, ваша среда разработки, вероятно, использует частично обновленный снимок вашей производственной базы данных. В других случаях ваша локальная среда может достигать фактического уровня производства. У обоих подходов есть свои плюсы и минусы, но это во многом зависит от масштаба вашей компании или проекта. Например, если вы работаете в большой компании с выделенными командами, вы можете наблюдать множество изменений в день, затрагивающих производственные базы данных по сравнению с небольшой командой, где еженедельный снимок prod db, вероятно, достаточно хорош для локального тестирования. я На базовом уровне все интеграционные тесты должны рассматриваться как реальные. При работе с веб-приложениями необходимо учитывать множество других факторов, таких как различные веб-браузеры, сетевая активность / доступность и т. Д. Поэтому вывод данных для вызовов API позволит провести супер быстрое тестирование, но затем добавляет еще один уровень сложности. с проверкой актуальности макетов в реальной базе данных.

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

Что касается вашего вопроса об аутентификации, ответ - да. Давайте посмотрим на 2 примера, которые показывают разные соображения.

Предположим, ваш проект очень маленький. Вы создаете несколько реальных учетных записей на производстве, и ваша база данных снимается еженедельно для использования в вашей локальной среде разработки. Вы просто запускаете интеграционные тесты с одним или несколькими из этих пользователей по мере необходимости. Поскольку локальные тесты влияют только на вашу локальную базу данных, вам не нужно беспокоиться о генерируемых данных, поскольку они не повлияют на производительность. Другие инженеры в вашей команде могут использовать тех же пользователей и не беспокоиться об этом. Если один инженер вносит некоторые изменения в схему БД, ORM и т. Д., То все просто получают новую копию снимка БД и продолжают работать.

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

Теперь наличие небольшого набора выделенных тестовых пользователей становится проблемой. Тесты проводятся постоянно, как автоматизированные, так и десятки инженеров, которые работают над своими собственными задачами. Поскольку промежуточная база данных, вероятно, является общей, вы можете легко начать получать странные конфликты, поскольку один и тот же пользователь-тестер делает все, что угодно, и начинает вызывать сбой тестирования. Хорошее решение, которое я видел для этого, является своего рода тестовым сервером проверки учетных записей. Вы создаете, скажем, 100 или 1000 (или более) тестовых учетных записей пользователей. Когда ваши интеграционные тесты запускаются, они буквально извлекают тестовую учетную запись пользователя с сервера. Когда тесты завершены, интеграционные тесты очищают все изменения, внесенные в этого пользователя, и сообщают серверу проверки, что пользователь снова свободен. Затем он случайно проверяется кем-то / чем-то другим, и цикл продолжается.

Итак, подробности, которые непосредственно связаны с вашим вопросом:

  1. У вас всегда должны быть выделенные тестовые учетные записи пользователей, точно такие же, как у обычных учетных записей, только выделенные для тестирования.
  2. В зависимости от масштаба команды и проекта, если небольшой, то подойдет несколько выделенных учетных записей. Если вы работаете в гораздо большем масштабе, вам нужно гораздо больше выделенных тестовых учетных записей и, возможно, вам нужна автоматизированная служба, которая позволяет отдельным прогонам тестов извлекать пользователей по мере необходимости.
  3. Тесты всегда должны убирать за собой. Если тест создает TODO, который сохраняется в БД. Когда тест завершен, этот TODO должен быть удален из БД. Если вы не уверены в этом, вы в конечном итоге столкнетесь с ошибками и проблемами, когда данные противоречивы. Не дай Бог, это произойдет на производстве.
  4. Беспокойство касается только данных о подделке для модульных тестов, если только вы не работаете в очень хорошей и специализированной инженерной среде, где у вас есть люди, преданные делу постоянного обновления макетов db. Если вы можете сделать это, ваши интеграционные тесты будут очень быстрыми, и вам не нужно будет особо беспокоиться о вещах с БД. Но это трудно поддерживать со временем без специальной поддержки.
1 голос
/ 12 марта 2019

Я много читал о тестировании e2e, и я не могу понять, насколько «реальными» должны быть тесты e2e.

E2e должен максимально близко имитировать производственную систему, более того, вы можете использовать автоматизацию e2e для воспроизведения любой производственной проблемы с производством, подобным данным,

Независимо от инструментов, которые я использую для тестов e2e, я видел, что большую часть времени они попадают в локальную среду, среду разработки или альфа-среду.

Автоматизация e2e должна работать с любыми ресурсами / базами данных / хранилищем данных / шиной сообщений и т. Д., А также с любым enironmet, включая локальную / удаленную или облачную платформы

Если мое приложение имеет аутентификацию, должен ли я создать «тестового» пользователя с действительными учетными данными в базе данных? Должен ли я сделать это для Alpha или даже для производственной среды? Как еще этот тестовый пользователь может войти в мое приложение?

Поскольку учетные данные приложения являются частью конфигурации приложения, вы можете гибко управлять учетными данными, предназначенными для тестирования. Я настоятельно рекомендую использовать параллельную полностью автоматизированную специализированную инфраструктуру e2e, которая не ставит под угрозу и не делится секретами производства.

Скажем, у меня есть печально известное приложение TODO. У меня есть тест, который регистрирует пользователя. После входа в систему я хочу проверить, что пользователь может создать TODO. Это TODO сохраняется в базе данных.

При тестировании e2e вы заинтересованы в идентификации всех применяемых входных данных (например, взаимодействия с пользовательским интерфейсом или запросов REST / HTTP), файлов конфигурации и выходных данных с правилами проверки. Это включает в себя изменения пользовательского интерфейса, журналы / сообщения, изменения хранилища данных / базы данных.

После запуска тестов нужно ли что-то запускать для удаления данных, созданных во время тестов e2e? Или мне следует перехватить запрос непосредственно перед его сохранением и смоделировать ответ (это будет антипаттерном для тестирования e2e)?

В рамках тестирования e2e вам необходимо позаботиться об установке начального состояния приложения, а также состояния для каждого случая использования, если это применимо. С тестированием e2e вы хотите протестировать все поведение вашего приложения, поэтому здесь нет места для насмешек. После запуска тестирования вы можете уничтожить все ресурсы приложения, очистить базу данных служб. Я считаю, что это необязательный шаг, так как настройка приложения или состояния использования адресов ресурсов / подготовка базы данных.

Наконец, e2e-тестирование может оказаться непростым делом, если у вас нет нужного набора инструментов и хорошей стратегии организации данных, особенно если со временем у вас появятся сотни тестов вариантов использования для приложений малого и среднего размера. Кроме того, вам нужен инструмент тестирования e2e, который работает с приложениями с несколькими стеками, написанными на любых языках (java, javascript golang, вы называете его), и поддерживает автоматизацию для любой платформы, включая localbox, docker, kubernetess, облачное хранилище без серверов.

Вот несколько интересных чтений:

1 голос
/ 11 марта 2019

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

Определение Technopedia

E2E тестированиеэто самый абстрактный вид тестирования.Он проверяет «поток» и «целостность» интегрированных компонентов.Более или менее, как тест, это полный Blackbox, и все части должны быть взаимозаменяемыми.Интеграционные тесты, проверьте, являются ли компоненты кода взаимозаменяемыми.E2E находится на ступеньку выше в иерархии тестирования (nginx или Apache? PHP или Java? Ms oder MySQL?)

Кроме того, определение тестов E2E является прямым переводом из бизнес-требований и более или менее предопределенопроцесс разработки требований.

Например, Gurkin - это язык для преобразования вариантов использования в функции и сценарии.Пример:

Feature:  Login functionality of social networking site Facebook. 
Given:  I am a facebook user. 
When: I enter username as username. 
And I enter the password as the password 
Then I should be redirected to the home page of facebook 

Вариант использования / функция сама по себе может состоять из нескольких или нескольких предложений, в зависимости от сложности темы.В любом случае: оно должно быть полностью независимым от вашего приложения.

Как обрабатывать тесты, зависит от вас и зависит от вашего приложения:

Вы можете поймать определенные случаи (зарегистрировать пользователя?) или вы хотите очистить базу данных с помощью ежедневного Cron?

Кроме того, достаточно производительности, чтобы написать тест для КАЖДОЙ функции.В большинстве случаев вы пишете эти тесты для пошаговых инструкций (наиболее важные части вашего приложения - откуда поступают деньги) или для функций, которые очень важны, но никогда активно не тестируются (информация о файлах cookie, отказ от подписки по электронной почте, юридическая информация и т. Д.)..)

...