最近我听到了很多关于单元测试的事情。
我想弄清楚的是,如何进行单元测试,或者说在业务较为糟糕的应用程序中是否应该进行单元测试(基本上是一个从数据库中读取/写入数据的应用程序)。
在这种情况下,单元测试是否值得投入精力,还是你通常会对更复杂的东西进行单元测试呢?
谢谢!
最近我听到了很多关于单元测试的事情。
我想弄清楚的是,如何进行单元测试,或者说在业务较为糟糕的应用程序中是否应该进行单元测试(基本上是一个从数据库中读取/写入数据的应用程序)。
在这种情况下,单元测试是否值得投入精力,还是你通常会对更复杂的东西进行单元测试呢?
谢谢!
单元测试是关于测试离散的代码单元——仅限于一个方法。
当你涉及到CRUD(增删改查)时,你需要测试网络、IO、数据库和其他事物,这超出了单元测试的范畴。在这种情况下,这被称为集成测试(你正在测试你的代码如何与其他代码/系统集成)。
在任何软件项目中,无论是CRUD应用程序还是其他类型的应用程序,都需要进行这两种类型的测试(以及其他类型的测试——回归、性能等)。
糟糕的应用很少会一直保持糟糕。它们最终会发展成一个业务对象层。
因此,是的,我会进行单元测试。即使是基本的糟糕应用也应该被拆分为交互层、数据访问层和非常简单的UI(请注意,所有UI状态都应该保存在交互层中)。最终,您可能会在交互和数据访问层之间获得一个业务对象层。
当然,如果你有一个面向数据的应用程序,你需要测试你的CRUD操作。根据我的经验,这种测试非常有用,因为它们可以捕捉到映射、存储过程逻辑、数据模型错误、错误数据等方面的许多错误。
单元测试是关于测试小而简单的功能模块。通常,您会对应用程序的数据层进行单元测试,该层将处理所有CRUD功能。创建和检索的测试可能如下所示:
PrimaryKey = InsertObject(TestObject)
if PrimaryKey = 0 then
AssertTestFailed("Primary Key Not Returned.")
end if
NewInstanceOfObject = GetObject(PrimaryKey)
If NewInstanceOfObject <> TestObject then
AssertTestFailed("Record not located.")
else
AssertTestPassed("This Code is awesome UnitTest Passed.")
end if
CRUD(Create、Retrieve、Update、Delete)类型的应用很难进行单元测试,正如@oded所写:这些类型的应用通常需要进行集成测试。
但是,如果您正确地分层您的代码,您就可以隔离业务逻辑并对其进行单元测试。
例如,如果您使用“清洁架构”,那么您的API将会分为以下几个部分:
在这种结构下,您可以轻松地模拟存储库(它们是唯一处理状态的部分)并对服务进行单元测试。
处理器本身不应包含任何逻辑(它们只验证输入、将其传递给服务并显示响应),因此可能不会进行单元测试。
希望这可以帮助您:-)
我相信,如果你使用的ORM已经由社区进行了充分测试,并且遵循了定义良好的模式来实现CRUD操作,那么写单元测试就没有必要了。
但是,如果你使用一些低级别的库与数据库通信,则错误的机会就会增加。在这种情况下,我会编写单元测试来使我的代码更加严谨和防错。编写这些测试并不需要花费很多时间,因为所有类都遵循相同的模式。
网上有大量不同的数据库及其相关的ORM,但移动平台上的选择却有限。这是正确的,因为在移动设备上存储数据并不是一个非常好的想法,但在某些情况下确实需要。在移动平台上编写CRUD时,我会编写单元测试。