使用 SQLite3 进行单元测试
Unit Testing with SQLite3
我正在编写单元测试并在他的内存模式下使用 SQLite3。
我这样做是因为我需要为每个测试创建一个新的数据库,这样我就可以 运行 并行测试而不会相互影响。
但是,当然,我进行的测试越多,速度就越慢。
我可以用 sqlite3 做任何优化,另一个更好的工作流程(例如一个好的模拟库)或另一个解决这个问题的方法吗?我需要 运行 原始查询。
目前我使用 knexjs 但这与几乎所有数据访问库都相关。
您不需要 运行 对数据库进行原始查询。
在单元测试范围内,您可以假设您的持久层工作正常,即它能够更新插入和删除。
编写单元测试时,模拟掉你的数据库连接。关于单元测试,针对数据库执行查询并不重要,重要的是您的业务逻辑在获取特定输入时以特定方式运行。 (这也可能意味着让您的模拟数据库连接抛出异常以确保您的应用程序以故障安全方式运行。)
无论环境如何(本地、暂存甚至生产),实际执行 运行 对测试数据库的查询的集成测试都是有价值的。
然而,根据定义,它们设置起来更慢、更难,并且只能在一定程度上并行化。 (如果你太依赖他们,your test setup resembles an ice cone and not a pyramid。)
它们对于关键业务功能(例如购物车点击)仍然有意义。然而,如果您的重点是编写单元测试,请确保对您的应用程序而不是持久层进行单元测试。
我正在编写单元测试并在他的内存模式下使用 SQLite3。
我这样做是因为我需要为每个测试创建一个新的数据库,这样我就可以 运行 并行测试而不会相互影响。
但是,当然,我进行的测试越多,速度就越慢。
我可以用 sqlite3 做任何优化,另一个更好的工作流程(例如一个好的模拟库)或另一个解决这个问题的方法吗?我需要 运行 原始查询。
目前我使用 knexjs 但这与几乎所有数据访问库都相关。
您不需要 运行 对数据库进行原始查询。
在单元测试范围内,您可以假设您的持久层工作正常,即它能够更新插入和删除。
编写单元测试时,模拟掉你的数据库连接。关于单元测试,针对数据库执行查询并不重要,重要的是您的业务逻辑在获取特定输入时以特定方式运行。 (这也可能意味着让您的模拟数据库连接抛出异常以确保您的应用程序以故障安全方式运行。)
无论环境如何(本地、暂存甚至生产),实际执行 运行 对测试数据库的查询的集成测试都是有价值的。
然而,根据定义,它们设置起来更慢、更难,并且只能在一定程度上并行化。 (如果你太依赖他们,your test setup resembles an ice cone and not a pyramid。)
它们对于关键业务功能(例如购物车点击)仍然有意义。然而,如果您的重点是编写单元测试,请确保对您的应用程序而不是持久层进行单元测试。