开玩笑的测试是否等待以前的异步测试解决?

时间:2019-02-06 11:03:08

标签: async-await jestjs

我已阅读到同一测试文件中的笑话测试会顺序执行。我还读到在编写涉及回调的测试时,应使用done参数。

但是当使用我在下面的代码中使用async / await语法的promise时,我可以依靠测试来按顺序运行和解决吗?

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 :(得分:1)

确保它取决于配置的测试运行器。假设Jasmine2 it seems impossible同时运行测试:

  

由于javascript是单线程的,因此实际上不可能在单个浏览器窗口中并行运行测试

但请注意docs' config section

  

-maxConcurrency =   防止Jest同时执行超过指定数量的测试。仅影响使用test.concurrent的测试。

     

-maxWorkers = |   别名:-w。指定工作池为运行测试而产生的最大工作程序数。默认为计算机上可用的内核数。在CI等资源受限的环境中进行调整可能会很有用,但默认值对于大多数用例而言都足够。

     

对于具有可变CPU的环境,您可以使用基于百分比的配置:--maxWorkers = 50%

还要查看jest-runner-concurrent的描述:

  

Jest的默认运行程序为每个测试文件使用一个新的child_process(也称为工作程序)。尽管最大数量的工作程序是可配置的,但是运行很多工作程序很慢,并且会消耗大量的内存和CPU。

因此,看起来您可以配置并行运行的测试文件(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);
    });
})

当然,上面我使用了Jasmine的语法(describeit),因此您可能需要用其他调用替换它。

答案 1 :(得分:0)

 

来自the docs

  

...默认情况下,Jest按收集阶段遇到的顺序依次运行所有测试,等待每个测试完成并整理后再继续。

因此,尽管Jest可以并行运行 test文件,但默认情况下,它会串行运行文件中的 test

可以通过以下测试验证该行为:

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
  });

});