为什么我的 websocket 变量在测试之间消失了?

问题描述 投票:0回答:2

我正在使用 Cypress 通过浏览器的 web-socket API 直接连接到 web-socket 服务器。

在我的实现中,一个

it()
块是一个测试步骤,一个
describe()
块是一个测试。

例如

const ws = new WebSocket(wsUrl);

  it("Send a message to WSS", (done) => {
    ws.onopen = () => {
      ws.send(Message);
      done();
    };
  });

  it("Close WSS connection", (done) => {
    ws.close();

    ws.onclose = () => {
      done();
    };
  });`

当我在测试运行器中单独运行测试时,一切正常,但是当我运行测试套件时,即多个测试(每个测试打开和关闭连接),第一个测试通常会通过,而第二个测试在建立连接时会失败。我收到 200 状态代码,表示握手失败消息。

但它非常不稳定,有时 2 个测试通过,而第 3 个测试失败。有时他们都会通过。

在每次测试和每个文件都有 1 个描述块后,我努力等待,以便会话在基础设施中清除,但无济于事。

websocket cypress
2个回答
5
投票

如果您想使用

describe()
块作为“测试”并使用
it()
块作为“步骤”,则需要在
describe()
级别设置测试隔离关闭。

const ws = new WebSocket('ws://localhost:8080')

describe('this sequence of tests are connected', {testIsolation: false}, () => {

 it("Send a message to WSS", (done) => {
    ws.onopen = () => {
      ws.send(Message);
      done();
    };
  })

 it("Close WSS connection", (done) => {

    ws.onclose = () => {
      done();
    };

    ws.close();       // also reverse the order of these lines 
                      // (event listener is set up before the event is triggered)
  })
})

测试隔离旨在清除测试之间的变量,以防止由于数据跨越测试边界而导致意外结果。

由于您定义的测试与 Cypress 期望的方式不同(每个

it()
块一个测试),因此您需要向测试运行者表明这一意图。测试隔离标志就是做到这一点的方法。

您获得不稳定结果的原因可能是由于使用了 WS 事件,该事件与测试代码异步触发,尽管您正确地使用

done()
向测试表明它需要等待 webSocket 事件才能完成.


0
投票

因此,在 Cypress Test Runner 中,似乎所有三个 WebSocket 连接都在第一个测试开始时建立,因为

const ws = new WebSocket(wsUrl);

测试文件加载后立即执行语句。这是在任何特定测试(它阻止)之外,因此它在解析脚本后立即运行,而不是在实际执行测试时运行。

所以答案是与 wss 的连接必须位于“it”块中,否则它将在测试套件执行开始时立即执行所有测试。

例如:

let ws;

// Pre-conditions & action
it("Connect to & send a message", (done) => {
    ws = new WebSocket(wsUrl);
    ws.onopen = () => {
        ws.send(message);
        done();
    };
});
© www.soinside.com 2019 - 2024. All rights reserved.