什么';为django api和react客户端设置消费者驱动的契约测试的合适方法是什么?

什么';为django api和react客户端设置消费者驱动的契约测试的合适方法是什么?,django,reactjs,testing,Django,Reactjs,Testing,我刚学了一个新名词叫 我在想,也许它可以帮助我解决为DjangoAPI提供程序编写测试的问题,并对前端架构项目做出反应 前端和Django API后端在单独的repo中,并有自己的单元测试 但是,偶尔会出现错误,因为前端假定某些字段不是Django服务后端返回的 我最初考虑编写端到端测试,但它们运行缓慢,而且非常脆弱 我发现这种由消费者驱动的契约测试听起来是正确的。但当我四处搜索时,我找不到任何合适的。甚至似乎只是为了将合同转换为消费者测试 在这种情况下,有什么合适的简单方法可以进行消费者驱动的

我刚学了一个新名词叫

我在想,也许它可以帮助我解决为DjangoAPI提供程序编写测试的问题,并对前端架构项目做出反应

前端和Django API后端在单独的repo中,并有自己的单元测试

但是,偶尔会出现错误,因为前端假定某些字段不是Django服务后端返回的

我最初考虑编写端到端测试,但它们运行缓慢,而且非常脆弱

我发现这种由消费者驱动的契约测试听起来是正确的。但当我四处搜索时,我找不到任何合适的。甚至似乎只是为了将合同转换为消费者测试


在这种情况下,有什么合适的简单方法可以进行消费者驱动的契约测试?

Kim,听起来您在寻找API集成测试,而不是真正的端到端测试

正如您所说,使用pact的价值在于获得供应商可以验证的合同。契约的运行方式与单元测试完全相同。如果您遵循前端应用程序的pact步骤,那么您最终将编写调用提供者(您的django API)的单元测试,从而建立每个调用的请求和响应

默认情况下,Pact启动一个模拟服务器,它将指向您的react前端应用程序(您的消费者测试)中Pact测试发出的请求。这些测试一旦执行,就会生成json格式的pact文件。然后,pact文件应该由API执行,以便API知道它不会破坏前端

看起来您正在尝试使用pact进行集成测试。Pact不是合适的工具,因为您只需要一个调用django API来验证响应的测试。没有一种简单的方法可以让合同测试启动并全速运行。尽管开始很容易,但如果没有正确的设置,您将无法获得所需的一切,而且还涉及到devops工作

每当我需要测试与pact外部API的集成时,我所做的是:

  • 确保API调用在方法中是隔离的,这样可以很容易地对您需要的每个API方法调用进行单元测试;这很容易被忽略,并且会导致复杂的、不可靠的测试,因为您最终不得不在测试用例中放入大量逻辑,以使它们返回您需要的响应
  • 创建一个调用该方法的测试,然后该测试将调用您的API并提供您需要的响应
快速示例: 假设您有一个允许用户创建配置文件的功能。 逻辑都在名为createNewUserProfile的函数中

  • 调用GET/user传递用户id以查看该用户是否存在
  • 调用GET/location获取用户位置信息,以便添加到用户配置文件
  • 调用POST/user将用户信息传递到后端以创建用户
  • 从GET或POST返回响应,具体取决于调用的是哪一个
此方法包含您的所有逻辑。所以你应该把它分解成

  • 执行getUser并调用GET/user的程序
  • 执行getCurrentLocation并调用GET/location的函数
  • 使用您拥有的数据创建用户调用POST/user的程序
  • 重构createNewUserProfile以调用上面列出的方法
然后,您将为每个getUser、getCurrentLocation、createUser进行一个API集成测试,而对于更广泛的createNewUserProfile,您将不需要一个API集成测试,因为如果您有几个被业务逻辑包围的调用,那么要找出失败的原因将困难得多

请告诉我,如果例子不够好,请随时给我们更多的例子,这样我可以帮助与更详细的信息


祝你好运

那么,在什么情况下,我应该使用消费者驱动的契约测试呢?能给我举个例子吗?当然。每当你的应用程序使用另一项服务时,你都会使用消费者驱动的契约测试。例如,您的应用程序通过GET/movies使用电影API。作为消费者,您希望确保对GET/movie的呼叫将以电影列表进行响应。为此,在您的应用程序中,您使用pact编写了一个单元测试,说明当对/movies发出GET请求时,您希望API以{movies:[{title:'gone the wind',publishDate:'1939'},{title:'wizard of oz',publishDate:'1939'}]响应。您的测试将生成一个契约(契约),契约将由契约代理验证。@请选择一个简单的API调用来调用您使用的任何API,然后尝试在前端应用程序中为该API调用使用契约编写单元测试,并告诉我您面临的挑战。让我知道进展如何,我可以帮你从那里走。如果你需要更多的帮助来开始,比如“我应该在react应用程序还是django应用程序中开始”只需在这里发布,我绝对可以帮助你。