我已阅读到同一测试文件中的笑话测试会顺序执行。我还读到在编写涉及回调的测试时,应使用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();
})
答案 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的语法(describe
,it
),因此您可能需要用其他调用替换它。
答案 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
});
});