Интеграционное тестирование NodeJS + PostgreSQL

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

Мои настройки: NodeJS, Postgres, Sequelize, Karma+Mocha. В настоящее время перед запуском тестов создается и переносится новая база данных, после каждого теста я запускаю необработанный запрос, который усекает все таблицы, и после завершения всех тестов тестовая база данных удаляется. Как вы, наверное, догадались, время выполнения подобных тестов довольно медленное.

Мне было интересно, есть ли способ ускорить процесс. Есть ли база данных psql в памяти, которую я мог бы использовать для своих тестовых случаев (я искал ее некоторое время, но не мог найти) или что-то в этом роде.

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


person Vedran    schedule 28.06.2019    source источник
comment
В чем проблема обрезать все таблицы?   -  person a_horse_with_no_name    schedule 01.07.2019
comment
Они слишком долго запускаются (по крайней мере, на моем компьютере), и пока у меня их всего несколько. Я беспокоюсь, что они будут работать целую вечность, как только я охватил приличное количество вариантов использования, и мне было интересно, может ли быть лучший способ.   -  person Vedran    schedule 01.07.2019
comment
Усечение даже многих таблиц не должно занимать более нескольких миллисекунд. Максимум секунды - возможно, оператор truncate ждал блокировок   -  person a_horse_with_no_name    schedule 01.07.2019


Ответы (1)


Включил https://stackoverflow.com/a/12082038/2018521 в мою очистку:

afterEach(async () => {
  await db.sequelize.query(`
    DO
    $func$
    BEGIN
      EXECUTE
      (SELECT 'TRUNCATE TABLE ' || string_agg(oid::regclass::text, ', ') || ' RESTART IDENTITY CASCADE'
        FROM   pg_class
        WHERE  relkind = 'r'  -- only tables
        AND    relnamespace = 'public'::regnamespace
      );
    END
    $func$;
  `);
});

Truncate теперь запускается почти мгновенно.

person Vedran    schedule 02.07.2019