Глядя на документацию, они кажутся очень похожими (BeforeAndAfterEach BeforeAndAfter). В чем принципиальная разница между ними. Каковы ситуации, когда один из них следует использовать вместо другого (и, возможно, другой даже не будет работать).
@LuisMiguelMejíaSuárez, это неправильно. Из BeforeAndAfter: Trait BeforeAndAfter предлагает один из способов устранения такого дублирования кода: предложение before, которое будет регистрировать код, который будет выполняться перед каждым тестом, и предложение after, которое будет регистрировать код, который будет выполняться после.
Чтобы уточнить, я сначала запутался с этим, потому что в тесте, который я унаследовал и над которым начал работать, отсутствовал вызов super.beforeEach()
в его реализации beforeEach()
, и я этого не заметил. Из-за отсутствующего вызова super
ничего не работало, как ожидалось, и я начал задаваться вопросом, не связано ли это с конкретным используемым свойством. Но я думаю, что это был вопрос, который мог задать кто-то другой, и теперь отличный ответ от @TomerShetah можно найти, набрав вопрос в Google.
Как следует из названия
BeforeAndAfter
запускается один раз (в начале и в конце) для тестового класса.
BeforeAndAfterEach
будет выполняться до и после каждого теста в классе.
Использование BeforeAndAfter
: Предположим, вы хотите создать базу данных в памяти для запуска тестов, вы создадите ее перед запуском тестовых случаев, а затем очистите память после выполнения всех тестовых случаев.
Использование BeforeAndAfterEach
: предположим, что у вас есть какое-то значение кеша, для которого требуется разное значение для каждого теста, в этом случае вы можете изменить значение этого кеша перед каждым тестом и очистить его после запуска одного теста.
Это неправильно. Проведите простой тест, чтобы выяснить это. Оба будут работать до и после каждого теста
В документации 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.
Первый будет выполняться до и после каждого теста, второй будет выполняться до всех тестов и после всех тестов в этом наборе.