我有一个在localhost:8000上运行的API项目连接到测试数据库,我有一个在localhost:9000上运行的前端角度应用程序。在每个前端测试用例运行后如何重置数据库?我使用Protractor进行前端E2E测试。我不想嘲笑整个后端。虽然这会使我的测试运行得更快,但是,每次用户交互都会导致对服务器状态的更改,然后是对同一服务器端点的更多请求,在不同点处以不同的返回方式存根这些端点可能代码太多而不仅仅是说话到真正的服务器。我宁愿将数据库重置为初始状态或刷新所有表。
一种可能的方法是在我的API项目中编写我的前端E2E测试套件。从现在开始,它由后端测试运行程序运行,它可以在每个测试用例之前轻松重置数据库。但我宁愿将测试保留在我的前端项目中,因为我的api也会为其他客户服务,而不仅仅是浏览器客户端。由于我的后端是在PHP中并使用Phpunit进行测试,而我使用Protractor测试我的前端,将它集成到后端似乎有点错位。
您是否遇到过这个问题以及您的解决方案是什么?如何协调E2E(或集成?)测试中的两个项目?
答案 0 :(得分:1)
在客户端路由失败后,我去了API项目中编写所有E2E测试。权衡取舍:
API包含可用于引导测试用例的所有工厂和模型。如果仅从客户端进行测试,我必须重新创建模型关系和工厂以使其工作,并且必须跟踪API模型中的所有更改。
每次运行E2E测试之前,我都必须手动设置客户端以与测试api环境通信。并手动将api服务器设置为测试模式。因为您需要让实际的API Web服务器在某个地方运行,以便客户端能够访问。
目前还很难找到一种方法将这种非常自定义的测试设置移动到云端,从而与持续集成服务器集成,因为客户端和api是两个独立的项目。但我终于在我的本地机器上运行了一些客户端端E2E测试,这比没有测试好。
答案 1 :(得分:1)
我遇到了同样的问题。我的解决方案是添加一个“重置”api端点,将数据库恢复到E2E测试开始之前的状态。
我们正在使用ASP.NET WebApi来构建RESTful服务。这是我的代码结构。
[HttpGet]
[Route("reset")]
public IHttpAction Reset(){
// check and remove records added in the e2e tests
// check and restore the records modified in the e2e tests
}
因此,对此test/reset
方法的api调用有助于将后端数据库恢复到其原始状态。我们可以将调用置于afterAll()
内(如果您使用的是JasmineJS)。或者您可以通过Postman或Fiddler的GET
电话进行手动重置。
有时,我有多个重置api方法可以调用。这样我就可以按功能组进行测试和重置。比如,对用户管理功能执行e2d测试并重置该部分数据,然后转到下一个功能。
有一点需要注意的是,如果对表的主键进行排序,则删除测试中添加的数据将会破坏该序列。确保我们的测试不会在主键上“预期”。
整个目标是能够重新运行e2e测试并获得相同的结果。
当然,如果允许,另一个好方法是在我们的e2e测试之前备份数据库并在测试完成后恢复它。手动,愚蠢但有时方便且足以让我们的e2e测试重新运行。