Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时/如何对CRUD应用程序进行单元测试?_C#_Unit Testing - Fatal编程技术网

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

C# 何时/如何对CRUD应用程序进行单元测试?,c#,unit-testing,C#,Unit Testing,最近我听到很多关于单元测试的事情 我试图理解的是,一个人/应该如何对一个粗糙的商业应用程序进行单元测试?(基本上是在数据库中写入数据或从数据库中读取数据的应用程序) 在这种情况下,单元测试是否值得呢?或者,您通常对更复杂的事情进行单元测试吗 谢谢单元测试是关于测试离散的代码单元的-一种方法,不再是了 在您进入CRUD的那一刻,您正在谈论测试网络、IO、数据库和其他东西——这超出了单元测试的范围。在本例中,这称为集成测试(您正在测试代码如何与其他代码/系统集成) 在任何软件项目中,无论是否存在CR

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

我试图理解的是,一个人/应该如何对一个粗糙的商业应用程序进行单元测试?(基本上是在数据库中写入数据或从数据库中读取数据的应用程序)

在这种情况下,单元测试是否值得呢?或者,您通常对更复杂的事情进行单元测试吗


谢谢

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

在您进入CRUD的那一刻,您正在谈论测试网络、IO、数据库和其他东西——这超出了单元测试的范围。在本例中,这称为集成测试(您正在测试代码如何与其他代码/系统集成)


在任何软件项目中,无论是否存在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
PrimaryKey=InsertObject(TestObject)
如果PrimaryKey=0,则
AssertTestFailed(“未返回主键”)
如果结束
NewInstanceOffObject=GetObject(PrimaryKey)
如果NewInstanceFobject TestObject,则
AssertTestFailed(“未找到记录”)
其他的
AssertTestPassed(“此代码已通过UnitTest。”)
如果结束

如果应用程序所做的只是CRUD,那么单元测试就没有意义了。现在,如果有任何类型的业务逻辑在值从数据库出来时对其进行操作,或者在值进入数据库之前对其进行验证,那么构建单元测试是一个好主意。测试CRUD部件不属于单元测试IMO。

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


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

我知道每个人都在不断地讨论您应该如何首先测试设计所有东西,但我倾向于坚持使用更复杂的单元测试

我的经验法则是,我为那些我实际上希望打破常规的东西,或者那些我不会立即注意到的东西,构建自动测试。最重要的是,我希望它能测试我不能/不会彻底重新测试自己的东西

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

此外,我喜欢使用自动化UI测试(使用WatiN或类似的工具)为我的站点构建回归测试,这样当我更改一些核心组件时,我可以运行一个健全性检查,以确保我没有破坏站点的某些观察角落

最后,这一切都与投资回报率有关。你投入了多少时间,又从中得到了多少。如果你的单元测试在你粗制滥造的商业应用程序的某个愚蠢的数据访问层上接近100%的代码覆盖率,那么你就是在浪费你的时间和你雇主的钱,简单明了。但是,如果你正在建造火箭飞船或医疗设备,或者你是一个没有质量保证部门资源的两大商店,那么大量的单元测试可以为你节省大量的时间、金钱和/或生命。


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

我认为,如果您使用的ORM经过其社区的良好测试,并且遵循定义良好的模式来实现CRUD操作,那么为其编写单元测试是没有用的

但是,如果您使用一些低级库与数据库通信,那么出错的可能性很大。在这种情况下,我自己编写单元测试,使我的代码具有刚性和防错性。编写这些测试不会花费很多时间,因为所有类都遵循相同的模式


在web上有大量不同的数据库及其附带的ORM,但在移动平台上受到限制。这是正确的,因为在移动设备上存储数据不是一个很好的主意,但有时你不得不这样做。在移动平台上编写CRUD时,我会编写单元测试。

TestFirst与单元测试无关。它是关于一种称为TDD(有些称为BDD)的设计方法的,所以从我对这些响应的理解来看,我不应该对数据库进行读/写单元测试。我更愿意测试业务逻辑代码,测试所有可能破坏的东西。单元测试可以测试不同的SUT(被测系统):两个方法,甚至一堆类。单元测试之间的区别非常模糊,单元测试和集成测试的SUT的大小和属性没有明确的定义。@Yauheni Sivukha-来自维基百科:单元是应用程序中最小的可测试部分@奇怪的是,维基百科并没有说最小的可测试部分是方法。这取决于上下文。若测试按顺序验证总计,则应填充订单行。顺便说一句:@Yauheni Sivukha-不管怎样,当测试代码要求数据库在线时,在我看来,在这一点上,它离开了单元测试的领域,实际上是一个集成测试。根据集成测试只针对应用程序的一小部分,所以您是否建议“CRUD打开?”