В чем разница BeforeAndAfter и BeforeAndAfterEach в ScalaTest

Глядя на документацию, они кажутся очень похожими (BeforeAndAfterEach BeforeAndAfter). В чем принципиальная разница между ними. Каковы ситуации, когда один из них следует использовать вместо другого (и, возможно, другой даже не будет работать).

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

Luis Miguel Mejía Suárez 11.12.2020 14:05

@LuisMiguelMejíaSuárez, это неправильно. Из BeforeAndAfter: Trait BeforeAndAfter предлагает один из способов устранения такого дублирования кода: предложение before, которое будет регистрировать код, который будет выполняться перед каждым тестом, и предложение after, которое будет регистрировать код, который будет выполняться после.

Tomer Shetah 11.12.2020 23:02

Чтобы уточнить, я сначала запутался с этим, потому что в тесте, который я унаследовал и над которым начал работать, отсутствовал вызов super.beforeEach() в его реализации beforeEach(), и я этого не заметил. Из-за отсутствующего вызова super ничего не работало, как ожидалось, и я начал задаваться вопросом, не связано ли это с конкретным используемым свойством. Но я думаю, что это был вопрос, который мог задать кто-то другой, и теперь отличный ответ от @TomerShetah можно найти, набрав вопрос в Google.

Peter Lamberg 23.12.2020 09:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
888
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как следует из названия BeforeAndAfter запускается один раз (в начале и в конце) для тестового класса. BeforeAndAfterEach будет выполняться до и после каждого теста в классе.

Использование BeforeAndAfter: Предположим, вы хотите создать базу данных в памяти для запуска тестов, вы создадите ее перед запуском тестовых случаев, а затем очистите память после выполнения всех тестовых случаев.

Использование BeforeAndAfterEach: предположим, что у вас есть какое-то значение кеша, для которого требуется разное значение для каждого теста, в этом случае вы можете изменить значение этого кеша перед каждым тестом и очистить его после запуска одного теста.

Это неправильно. Проведите простой тест, чтобы выяснить это. Оба будут работать до и после каждого теста

Tomer Shetah 11.12.2020 22:55
Ответ принят как подходящий

В документации scalatest вы можете найти всю необходимую информацию.

TL;DR: оба имеют одинаковую функциональность. BeforeAndAfter более лаконичен, а BeforeAndAfterEach более сложен.

Рекомендуемое использование до и после:

Используйте черту BeforeAndAfter, когда вам нужно выполнить одни и те же побочные эффекты до и/или после тестов, а не в начале или в конце тестов. Примечание. Для получения более подробной информации о том, как BeforeAndAfter вписывается в общую картину, см. раздел «Общие фикстуры» в документации по выбранной вами черте стиля.

Должен ли я использовать BeforeAndAfter или BeforeAndAfterEach? (С точки зрения До и После)

Хотя BeforeAndAfter обеспечивает минимальный шаблонный способ выполнения кода до и после тестов, он не предназначен для включения стекируемых трейтов, потому что порядок выполнения был бы неочевидным. Если вы хотите выделить до и после код, который является общим для нескольких наборов тестов, вам следует вместо этого использовать трейт BeforeAndAfterEach.

Преимущество этого трейта по сравнению с BeforeAndAfterEach заключается в том, что его синтаксис более лаконичен. Главный недостаток в том, что он не штабелируется, в то время как BeforeAndAfterEach можно. То есть вы можете написать несколько трейтов, которые расширяют BeforeAndAfterEach и предоставляют методы beforeEach, которые включают вызов super.beforeEach, и смешивать их вместе в различных комбинациях. Напротив, только один вызов функции до регистрации разрешен в наборе или спецификации, которые смешиваются с BeforeAndAfter. Кроме того, BeforeAndAfterEach позволяет вам получить доступ к карте конфигурации и имени теста через TestData, переданные его методам beforeEach и afterEach, тогда как BeforeAndAfter не дает вам доступа к карте конфигурации.

Рекомендуемое использование BeforeAndAfterEach:

Используйте трейт BeforeAndAfterEach, когда вы хотите сложить трейты, которые вызывают побочные эффекты, до и/или после тестов, а не в начале или конце тестов. Примечание. Для получения дополнительной информации о том, как BeforeAndAfterEach вписывается в общую картину, см. Раздел «Общие приборы» в документации для выбранной черты стиля.

Должен ли я использовать BeforeAndAfter или BeforeAndAfterEach? (С точки зрения BeforeAndAfterEach):

Главное преимущество BeforeAndAfterEach перед BeforeAndAfter в том, что BeforeAndAfterEach. включает стек черт. Главный недостаток BeforeAndAfterEach по сравнению с BeforeAndAfter заключается в том, что BeforeAndAfterEach требует большего количества шаблонов. Если вам не нужно наложение признаков, используйте BeforeAndAfter вместо BeforeAndAfterEach. Если вы хотите использовать тестовые данные (имя теста, карту конфигурации и т. д.) в вашем методе beforeEach или afterEach, используйте вместо этого трейт BeforeAndAfterEachTestData.

P.S. Я вижу, что есть распространенная ошибка, что один будет выполняться для каждого теста, а другой нет. Для этого есть еще одна черта, которая называется BeforeAndAfterAll.

Другие вопросы по теме