如何在Jest中运行并发测试,每个请求有多个测试?

1sbrub3j  于 2023-03-06  发布在  Jest
关注(0)|答案(2)|浏览(217)

我希望同时运行Jest测试,但是我遇到了一个场景的问题:
我正在测试一个端点上的结果,我想测试它的多个方面。因此,在我的beforeAll函数中,我发出请求并存储响应,然后在多个测试中测试响应。这可以同步运行,但当我使测试并发时,它不再允许您将变量传递到测试中,所以这是不可行的。或者,我可以将请求放在测试本身中,然后期待关于响应的许多事情,但是如果失败,我就没有粒度来查看哪里出错了。
这种情况有什么解决办法吗?
这是可行的:

let data;

beforeAll(async () => {
  data = await getDataFromRequest();
});

it('value1 should be truthy', () => {
  expect(data.value1).toBeTruthy();
});

it('value2 should be truthy', () => {
  expect(data.value2).toBeTruthy();
});

这也适用于:

it.concurrent('data should have correct values', async () => {
  const data = await getDataFromRequest();
  expect(data.value1).toBeTruthy();
  expect(data.value2).toBeTruthy();
});

但我想要的是:

let data;

beforeAll(async () => {
  data = await getDataFromRequest();
});

it.concurrent('value1 should be truthy', () => {
  expect(data.value1).toBeTruthy();
});

it.concurrent('value2 should be truthy', () => {
  expect(data.value2).toBeTruthy();
});
6vl6ewon

6vl6ewon1#

似乎值得指出的是,也有一个关于这个讨论在一个笑话的问题:https://github.com/facebook/jest/issues/4281
要点:它不是这样工作的,也不是计划好的。可能的解决方法:

const dataPromise = getSomeDataPromise();

test.concurrent('one', async () => {
  const data = await dataPromise;
});

test.concurrent('two', async () => {
  const data = await dataPromise;
});
im9ewurl

im9ewurl2#

在使用Playwright进行浏览器测试时遇到了同样的问题,其中一个测试套件只需要一个浏览器示例。必须用带有setInterval的Promise Package 它。在您的情况下,它应该如下所示:

let data;

beforeAll(async () => {
    data = await getDataFromRequest();
}
test.concurrent('value1 should be truthy', async () => {
    await waitForData();
    expect(data.value1).toBeTruthy();
}
test.concurrent('value2 should be truthy', async () => {
    await waitForData();
    expect(data.value2).toBeTruthy();
}

/**
 * @param {number} interval -  the interval to check data availability
 * @param {number} timeout -  the overall timeout value
 * @return Promise of your data OR reject if timeout.
 */
function waitForData(interval = 500, timeout = 5000){
  let acc = 0; // time accumulation
  return new Promise((resolve, reject) => {
    const i = setInterval(() => {
      acc += interval;
      if (data) {
        clearInterval(i);
        resolve(data);
      }
      if (acc > timeout) {
        clearInterval(i);
        reject();
      }
    }, interval);
  });
}

因此,您只需要分配适当的检查intervaltimeout,它们应该足够长,以便您的数据asycn调用返回。

相关问题