测试包装api路由的装饰器

时间:2019-02-14 21:45:23

标签: python unit-testing flask python-decorators marshmallow

我正在构建一个REST API,当时正在为api路由,偶然发现了一个问题。我正在使用flask restplus构建api和棉花糖,以验证客户端发送的json。

我的设计:我使用了一个用于包装所有api路由的装饰器。此装饰器根据棉花糖模式验证客户端发送的json,如果json验证,则装饰器让api路由运行。否则,如果在根据架构检查JSON时使其无效,则它将使JSON无效时返回的错误返回给客户端,而无需运行路由。

我真的很喜欢这种设计,因为它显着减少了代码重复,并且可以自动验证和无效客户端发布的数据,而无需我在每个api路由中做几乎相同的事情-检查客户端发送的json,然后运行路线。

我唯一的问题是我不知道如何单元进行测试。我已经为特定的棉花糖json模式编写了测试,以检查将无效数据传递给它们时是否引发正确的验证错误。但是,现在我需要测试api路由,以检查它们是否返回由架构引起的验证错误。这似乎是单元测试的许多重复,因为我在测试架构时要检查相同的错误,而在测试api路由/装饰器时要再次检查。

因此,你们对我应该如何对它进行单元测试有任何建议。我是否应该分别测试api路由,分别装饰器和模式?还是应该只测试api路由以检查它们是否返回了架构引发的正确错误?

谢谢。

1 个答案:

答案 0 :(得分:0)

这可能是个见解。

我认为测试所有模式不是有用的,除非它们包含一些自定义代码(例如自定义字段,验证器等)。不需要测试棉花糖本身,因为棉花糖本身已被其测试广泛涵盖。因此,测试棉花糖模式仅用于检查您输入的字段名和验证器是否正确。对于低福利,恕我直言,这将是非常冗长的。

我会测试装饰器:创建一个虚拟测试路由,装饰它,检查是否返回了正确的错误。

由您决定是否值得对所有路线进行各种类型的错误测试。只要测试了装饰器,对路由进行测试就只会检查是否将装饰器应用于具有正确架构的路由。

有人会说相反,他们只关心API本身,只需要测试路由。但这意味着要在所有路径上测试所有案例,因此要重复很多。而且我认为这不算是单元测试,而是集成测试

请注意,您可以尝试使用webargs(由棉花糖团队维护)来替换装饰器,但我不知道将其与flask-restplus集成起来有多么容易。