我有一个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个测试是相同的,因此它不是针对特定测试的。
答案 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')