无论CircleCI为何,首次赛普拉斯测试始终会失败

时间:2019-08-08 13:26:26

标签: docker-compose continuous-integration cypress circleci

我有一个CircleCI配置,其中运行机器执行程序,使用docker-compose启动我的应用程序,然后针对不在该应用程序中的docker在Cypress中运行E2E测试。赛普拉斯基本上会启动一个无头浏览器,并尝试访问指定的URL。

现在,无论我的第一次测试总是失败。我已经创建了10个测试,这些测试只需点击根URL并单击一个按钮。我先运行那些测试。第一个总是失败。

错误是

CypressError: cy.visit() failed trying to load:

http://localhost:3000/

这基本上意味着没有响应或4-500

我虽然该应用程序可能尚未准备好,所以我在开始测试之前添加了睡眠。我将其设置为9分钟(在CircleCI上超时10分钟)。第一次测试失败。我把时间缩短了2分钟。第一次测试失败。

同样要清楚的是,前10个测试是相同的,因此它不是针对特定测试的。

更新

我有crossposted this to the CircleCI forum

3 个答案:

答案 0 :(得分:0)

我认为您的服务器尚未准备就绪。

在运行赛普拉斯测试之前,您必须等待服务器。

如果是这样,请不要使用睡眠。 您可以使用等待或启动服务器测试。 您可以检查此文档。 https://docs.cypress.io/guides/guides/continuous-integration.html#Boot-your-server

答案 1 :(得分:0)

因此TJ Jiang的回答很贴切。不幸的是,等待等待不适用于CircleCI。

所以我写了自己的书

timeout 540 bash -c 'while [ $(curl -s -o /dev/null -w %{http_code} localhost:3000) != "200" ]; do sleep 15; done' || false

这会每15秒对URL进行一次ping操作,持续9分钟,直到它收到http状态代码200或退出。

具体来说,我编写了一个使用上面那行的Makefile目标,我不知道将其粘贴到config.yml中是怎么工作的。

因此,在运行cypress测试之前,将此步骤实际上运行确实可以使所有5个相同的测试通过。

现在,它会响约3 1/2分钟,然后继续进行。我已经测试了长达9分钟的睡眠,并且结果始终相同。所以我不知道为什么这种方法比睡眠更好,但是显然可以。

答案 2 :(得分:0)

我有同样的问题。通过服务器/路由/等待解决。我首先启动服务器,然后创建一个路由别名,等待它调用Api端点(触发应用程序填充dom),然后进行其余操作(cy.get / click)。

之前的示例:

cy.get('myCssSelector')

服务器/路由/等待之后:

cy.server()
cy.route('GET', '*/project/*').as('getProject')

cy.wait('@getProject')
   .then(resp => {
     expect(resp.status).to.eq(201)
   })

cy.get('myCssSelector')