Ожидают ли jest-тесты разрешения предыдущих асинхронных тестов? - PullRequest
0 голосов
/ 06 февраля 2019

Я прочитал, что jest тесты в одном и том же файле тестов выполняются последовательно.Я также читал, что при написании тестов с обратными вызовами следует использовать параметр done.

Но при использовании обещаний с использованием синтаксиса async / await, который я использую в своем коде ниже, могу ли я рассчитывать на тесты, но они выполняются и разрешаются в последовательном порядке?

import Client from '../Client';
import { Project } from '../Client/types/client-response';

let client: Client;

beforeAll(async () => {
    jest.setTimeout(10000);
    client = new Client({ host: 'ws://127.0.0.1', port: 8080 , logger: () => {}});
    await client.connect();
})


describe('Create, save and open project', () => {
    let project: Project;
    let filename: string;

    beforeAll(async () => {
        // Close project
        let project = await client.getActiveProject();
        if (project) {
            let success = await client.projectClose(project.id, true);
            expect(success).toBe(true);
        }
    })

    test('createProject', async () => {
        project = await client.createProject();
        expect(project.id).toBeTruthy();
    });

    test('projectSave', async () => {
        filename = await client.projectSave(project.id, 'jesttest.otii', true);
        expect(filename.endsWith('jesttest.otii')).toBe(true);
    });

    test('projectClose', async () => {
        let success = await client.projectClose(project.id);
        expect(success).toBe(true);
    });

    test('projectOpen', async () => {
        project = await client.openProject(filename);
        expect(filename.endsWith('jesttest.otii')).toBe(true);
    });
})

afterAll(async () => {
    await client.disconnect();
})

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Из документов :

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

Так что, хотя Jest может запускать тестовых файлов параллельно, по умолчанию он запускает тесты в файле последовательно.

Такое поведение можно проверить с помощью следующего теста:

describe('test order', () => {

  let count;

  beforeAll(() => {
    count = 0;
  })

  test('1', async () => {
    await new Promise((resolve) => {
      setTimeout(() => {
        count++;
        expect(count).toBe(1);  // SUCCESS
        resolve();
      }, 1000);
    });
  });

  test('2', async () => {
    await new Promise((resolve) => {
      setTimeout(() => {
        count++;
        expect(count).toBe(2);  // SUCCESS
        resolve();
      }, 500);
    });
  });

  test('3', () => {
    count++;
    expect(count).toBe(3);  // SUCCESS
  });

});
0 голосов
/ 06 февраля 2019

Конечно, это зависит от настроенного тестового прогона.Скажем, для Jasmine2 кажется невозможным одновременное выполнение тестов:

Из-за однопоточности javascript на самом деле невозможно параллельно запускать ваши тесты в одномокно браузера

Но просматривая раздел конфигурации docs :

- maxConcurrency = Запрещает Jest выполнять больше указанного количества тестов вв то же время.Влияет только на тесты, использующие test.concurrent.

- maxWorkers = |Псевдоним: -w.Задает максимальное количество рабочих, которые рабочий пул будет порождать для выполнения тестов.По умолчанию это число ядер, доступных на вашем компьютере.Это может быть полезно для настройки в средах с ограниченными ресурсами, таких как CI, но значение по умолчанию должно быть адекватным для большинства случаев использования.

Для сред с переменными ЦП, вы можете использовать процентную конфигурацию: --maxWorkers = 50%

Также смотрите описание для jest-runner-concurrent :

По умолчанию бегун Jest использует новый child_process (также известный как рабочий)для каждого тестового файла.Хотя максимальное количество рабочих можно настраивать, многие из них работают медленно и потребляют тонны памяти и ЦП.

Похоже, что вы можете настроить количество тестовых файлов, работающих параллельно (maxWorkers), а также одновременных тестовых случаев в рамках одного работника (maxConcurrency).Если вы используете jest в качестве тестового бегуна.И это касается только test.concurrent() тестов.

По какой-то причине я не смог найти ничего на test.concurrent() на их главном сайте документации.

В любом случае вы можете сами проверить свою среду:

describe('checking concurrent execution', () => {
    let a = 5;

    it('deferred change', (done) => {
        setTimeout(() => { 
            a = 11;
            expect(a).toEqual(11); 
            done();
        }, 1000);
    });

    it('fails if running in concurrency', () => {
        expect(a).toEqual(11);
    });
})

Конечно, выше я использовал синтаксис Жасмин (describe, it), поэтому вам, возможно, придется заменить его на другойвызовы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...