何时/如何对CRUD应用程序进行单元测试?

时间:2010-07-09 17:48:29

标签: c# unit-testing

我最近听到很多关于单元测试的事情。

我想要了解的是,一个/应该如何进行单元测试一个肮脏的商业应用程序? (基本上是一个将数据写入数据库/从数据库中读取数据的应用程序。)

单元测试是否值得在那个场景中进行测试,或者您是否经常对更复杂的事情进行单元测试?

由于

7 个答案:

答案 0 :(得分:16)

单元测试是关于测试离散的代码单元 - 单一方法,不再是。

当你进入CRUD时,你正在谈论测试网络,IO,数据库和其他东西 - 这超出了单元测试的范围。在这种情况下,这称为集成测试(您正在测试代码如何与其他代码/系统集成)。

在任何软件项目,CRUD应用程序中是否存在两种类型的测试(以及其他类型 - 回归,性能等...)。

答案 1 :(得分:11)

如果您的所有应用程序都是CRUD,那么单元测试没有意义。现在,如果存在任何类型的业务逻辑操纵值,因为它们来自数据库或在它们进入之前验证它们,是的,构建单元测试是个好主意。测试CRUD部分不属于IMO的单元测试。

答案 2 :(得分:5)

Cruddy应用程序很少保持邋。。它们最终会增长到包含业务对象层。

所以,是的,我会进行单元测试。即使是基本的cruddy应用程序也应该分为交互层,数据访问层和非常简单的UI(请注意,所有UI状态都应保留在交互层中)。最终,您可能会在交互层和数据访问层之间获得业务对象层。

答案 3 :(得分:3)

我知道每个人都会继续谈论你应该如何设计测试,但是我倾向于坚持使用单元测试更复杂的东西。

我的经验法则是,我建立了自动化测试,以确保我实际上希望以稳定性打破这些事物,或者我不会立即注意到的事情会被打破。最重要的是,我希望它能够测试我不能/不会彻底重新测试自己的东西。

例如,“使用47个不同的变量计算一些大的复杂事物”模块应该有一堆测试可以实现良好的代码覆盖,并且可以覆盖所有可能的代码路径,但代码可以将该结果保存回数据库不一定需要测试,特别是如果它正在进行简单的CRUD工作。

此外,我喜欢使用自动UI测试(使用WatiN或类似的东西)为我的网站构建回归测试,这样当我更改一些核心组件时,我可以运行一个完整性检查以确保我没有吹在网站的一些隐蔽的角落。

最后,关乎投资回报率。你花了多少时间,以及你有多少时间摆脱它。如果您的单元测试在CRUDy商业应用程序的某些哑数据访问层上接近100%代码覆盖率,那么您浪费时间和雇主的钱,简单明了。但是如果你正在建造火箭飞船或医疗设备,或者如果你是一个没有QA部门资源的两个主要商店,很多单元测试可以为你节省大量的时间,金钱和/或生命

答案 4 :(得分:2)

Test everything that could possibly break

当然,您需要测试CRUD操作,特别是如果您有面向数据的应用程序。从我的经验来看,这种测试是非常有用的测试,因为它们可以捕获映射中的大量错误,存储过程逻辑,数据模型中的错误,错误的数据等。

答案 5 :(得分:1)

单元测试是关于测试SMALL简单的功能。通常,您将对应用程序的数据层进行单元测试,该数据层将处理所有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

答案 6 :(得分:0)

我相信,如果您使用的ORM受到其社区的良好测试,并遵循明确定义的模式来实施CRUD操作,则对于编写该单元测试毫无用处。

但是,如果您正在使用一些低级库与数据库进行通信,则出错的可能性很高。在那种情况下,我自己编写单元测试以使我的代码僵化并能证明错误。而且编写这些测试不需要花费很多时间,因为对于所有类而言,它们遵循相同的模式。

Web上存在大量不同的数据库及其随附的ORM,但在移动平台上存在局限性。正确的原因是,将数据存储在移动设备上并不是一个好主意,但是在某些情况下您必须这样做。在移动平台上编写CRUD时,我会编写单元测试。