如何测试对REST服务的调用

时间:2016-09-26 11:11:59

标签: javascript rest testing supertest node-rest-client

我设置了一个为客户端提供多个端点的服务器,我有一个客户端使用node-rest-client包到post数据到后端。

我想为客户端编写一些单元测试,确保数据正确发送到端点。

我一直在考虑为测试设置虚拟服务器,但这感觉不对。

我怎样才能实现这样的测试?

如果有任何遗漏数据,请告诉我。

提前致谢!

修改

我一直在查看supertest包,但看起来这用于测试REST API服务本身而不是测试来自客户端的REST调用

1 个答案:

答案 0 :(得分:1)

设置一个dummmy服务器是合法的方法,作为您的接受测试的一部分"战略。与单元测试不同,验收测试单独测试单个组件(由多个单元组成),剔除任何外部因素,如数据库或后端HTTP服务。如果要测试客户端作为一个整体如何与后端HTTP服务交互,那么拥有一个虚拟服务器可能是一个很好的方法。验收测试通常更广泛,数量更少,并且比单元测试慢。这就是启动虚拟HTTP服务器的原因。

但是,如果你真的想单独测试调用服务器的单个javascript单元,那么这实际上有点棘手。您不想在单元测试中启动真正的HTTP服务器,因为它会使它们变慢并且无法并行运行。

最佳方法取决于您使用的技术。例如,AngularJS提供了一种称为$httpBackend的单元测试HTTP调用的方法。基本上它虚拟HTTP服务器,但它实际上并没有通过HTTP(所有请求都留在内存中)。这是可能的,因为Angular团队将可测试性视为优先事项,并从头开始设计。

我不认为node-rest-client提供了类似的模拟HTTP服务器,因此单元测试客户端可能会很困难。最好的方法可能是将node-rest-client的所有用法包装在一个独立的javascript对象中,该对象本身没有单元测试,但很容易在单元测试中模拟出客户端代码的其他部分。然后,可以针对虚拟HTTP服务器测试这个未经单元测试的对象,作为单独测试套件的一部分,或者您甚至可以依靠集成测试来捕获此部件的任何问题。

与往常一样,最好将您对依赖于集成测试(连接到后端的实际实例)的依赖降至最低,因为它们很慢且不可靠。这些测试应该仅用于验证顶级详细信息,例如性能,连接详细信息,配置兼容性等。

如果你采用包装方法,重要的是在包装器中尽可能少的逻辑,因为它不会被单元测试!

请注意,无论您的测试策略如何,将所有HTTP调用包装在javascript服务对象中都是很好的做法,因为它会将node-rest-client的所有用法限制在代码中的一个位置。