Сохранять БД между тестами в Codeception

Я тестирую приложение CRUD, написанное на L5, с использованием приемочных тестов Codeception. Мне было интересно, как вы, ребята, поступаете с этим.

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

Есть ли способ сделать это без специального создания дампа БД специально для тестирования?

Я надеялся, что смогу пройти следующие тесты в таком порядке:

  • Создать элемент
  • Читать элемент
  • Обновить элемент
  • Удалить пункт

и проверяйте БД на каждом этапе, чтобы убедиться, что он прошел успешно.

Любая помощь будет принята с благодарностью.

Привет, Дэрил


person Daryll Doyle    schedule 15.02.2015    source источник
comment
Я также ищу что-то подобное, но специально для некоторых тестов, например, я хочу, чтобы тест 2 зависел от теста 1, не выполняя тесты в одной функции. Я имею в виду, что хочу, чтобы изменения теста 1 сохранялись в тесте 2.   -  person Pedro Silva    schedule 06.05.2015
comment
Проверка БД - ужасная идея. Работал над проектом, который сделал это. Вместо того, чтобы тестировать свой код, вы тестируете. Сама БД, драйвер PHP, DBLA и все это является обязанностью создателя этих компонентов... Кроме того, тесты, привязанные к БД, очень и очень медленные, поэтому ваш тест в какой-то момент займет вечность.   -  person E_p    schedule 01.06.2016
comment
В качестве дополнения к предыдущему комментарию используйте DI и имитацию DBAL, чтобы вы могли убедиться, что вызываются правильные методы. Не проверять данные.   -  person E_p    schedule 01.06.2016


Ответы (2)


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

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

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

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

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

Я считаю, что вы можете остановить поведение с помощью такого рода вещей в конфигурации, но это не то, что вы хотите!:

class_name: FunctionalTester
modules:
    enabled: [Filesystem, FunctionalHelper, Laravel4, Asserts]
    config:
        Laravel4:
            environment: 'testing'
            cleanup: false
person Paul Stanley    schedule 30.05.2016
comment
Я следую вашей логике, но изоляция каждого отдельного теста чрезвычайно требовательна в сложном приложении. Скажем, вы рефакторите один компонент, влияющий на базу данных, и 10 других тестов, для которых вам теперь нужно изменить все фикстуры для всех из них — что может быть утомительным процессом! Как вам это удается? - person TheStoryCoder; 25.03.2021
comment
Хороший вопрос: я предполагаю, что вам приходилось иметь дело с макетом базы данных и соответствующими фикстурами, что утомительно и на порядок сложнее. Если ваши пробные тесты не работают, но ваш код правильный: ваши макеты не подвергались рефакторингу, чтобы имитировать ваш новый код. Переписывать фиктивный код утомительно. Обновление приборов базы данных — нет, просто обновите свои данные с помощью своего графического интерфейса и экспортируйте в git, вот и все. Если ваши тесты базы данных ломаются, ваш код на самом деле неисправен. Макеты ломаются каждый раз, когда код, который они имитируют, изменяется, а переписывание макетов — это шаг, который вам не нужно делать при тестировании базы данных. - person Paul Stanley; 25.03.2021

У меня есть опыт работы с крупномасштабным приложением, где в какой-то момент было принято решение проверять БД при каждом тесте. 2 года спустя мир боли и бесполезных, медленных, неуправляемых испытаний. Итак, уроки, извлеченные из этого: Не проверяйте данные в БД на модульном тестировании.

Целью модульных тестов является проверка кода, который вы написали!

Когда вы проверяете, что правильные данные попали в БД, вы проверяете:

  1. Драйвер DBAL (Larvel).
  2. Драйвер БД PHP (независимо от того, что использует larvel).
  3. Сама БД (любая БД).

Это создает ненужную сложность теста:

  1. В каждой тестовой среде должны быть правильно настроены все эти компоненты.
  2. Вы должны убедиться, что данные согласуются между тестами. Самый простой способ - очистить данные после каждого теста, и каждый тест должен создавать свои собственные данные (очень медленно).
  3. А вы повторяете работу, проделанную создателями БД, создателями Драйверов и Ларвелом...

В результате: Тесты становятся медленнее, управление тестовой средой усложняется. Это приводит к тому, что вы перестаете писать тесты...

Поэтому решение состоит в том, чтобы написать свои классы для использования DI и Mock DBAL в тестах. Существуют библиотеки, которые могут помочь с насмешкой над БД. Но в самом конце вы должны просто протестировать свой код. Что он вызывает правильные функции с правильными данными и правильно реагирует на данные, поступающие из БД.

И если вы хотите убедиться, что ваш DBAL работает правильно, запустите его unittest.

Что касается проекта, над которым я работал, то есть попытка перенести все тесты из БД в макеты, а улучшение скорости составляет х 1000 для тестов, которые были изменены.

person E_p    schedule 01.06.2016