在生产代码中使用断言?(Node.js中的TDD)



我已经开始用 Node.js(使用 TypeScript(为后端编写单元测试,使用 Mocha+Chai+Sinon 库

作为使函数为任何给定输入返回正确输出的一部分, 例如,在登录方法中是有意义的:login(userName: string, password: string) : LoginResult我认为必须验证给定的用户名和密码是字符串而不是未定义的。

当给定的输入不是字符串时,TypeScript 引擎会发出警报,但它不会提醒给定的输入未定义,这是该单元(测试方法(的无效输入。

因此,在代码的开头,我正在使用断言:

assert(userName !== undefined, 'Given "userName" is "undefined"); assert(password !== undefined, 'Given "password" is "undefined");

我想知道这是否是在生产代码中使用断言进行 TDD/防御性编程输入验证并验证来自其他方法的响应的正确选择,或者可以以某种方式改进。

我正在使用assert-plus库,它可以根据环境变量禁用生产断言,这是一个加号,但我不确定我是否应该这样做,因为断言允许给出更多的指示性错误并避免在意外情况下运行代码。

谢谢!

输入验证非常重要,但它取决于代码在软件中的位置,最终归结为判断调用。 有两种思考方式,你通常会看到这两种观点不一致。

始终在任何地方进行验证

这假设您的代码将被断章取义,因此您需要在使用函数之前验证函数中的无效用户输入。这通常由有据可查的漏洞利用来支持。在这种情况下,您希望转换每个可断言的情况并将其转换为 if 并抛出@Estus正如 Flask 所评论的那样。这样做的明显缺点是,您可能会花费大量时间一遍又一遍地验证同一条数据。

如果您遵循此生理学,请不要在生产代码中使用断言,将每个断言转换为 if 语句,并使用合理的可读错误消息来说明异常。

在系统边界处验证

这假定您具有定义良好的客户端代码,并且不会将无效数据传递到关键部分。尽管您仍然会尽一切努力防止远程代码执行,但对于行为异常的客户端代码,访问未定义值的成员并"崩溃"是可以接受的行为。该错误存在于客户端代码中,不应将无效数据传递到函数中。然后,输入验证全部在应用程序/库的最外层完成。(例如,在 REST 路由处理程序中(但是,以断言的形式记录代码中有关数据的断言仍然有意义。出于性能原因,这些断言可能应该在生产中退出,但在暂存和测试代码中是可以接受的。(您可以在蓝色/绿色部署过程中保持打开状态,以检查新代码的行为。

如果您遵循此生理学,请在生产代码中使用断言来记录代码对输入数据和世界状态所做的断言。这些断言应该在大多数时候关闭。

相关内容

  • 没有找到相关文章

最新更新