Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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# 大型企业是否使用模拟/存根?_C#_Unit Testing_Agile - Fatal编程技术网

C# 大型企业是否使用模拟/存根?

C# 大型企业是否使用模拟/存根?,c#,unit-testing,agile,C#,Unit Testing,Agile,有没有人在一家大公司或一个非常大的项目中成功地使用了单元测试 我们当前的数据库有约300个表,有约100个聚合根。总共有约4000列,完成后我们将有约200万行代码。我想知道,拥有如此规模(或更大)的数据库的公司是否真的努力模拟/存根他们的域对象以进行测试?我在一家大公司工作已经两年了,但当时所有大型应用程序都是通过集成测试进行测试的。如果单元测试需要很多设置,那么它通常是不受欢迎的 我开始觉得单元测试对于静态方法以外的任何方法来说都是浪费时间,因为我们的许多测试方法所用的时间与实际代码所用的时

有没有人在一家大公司或一个非常大的项目中成功地使用了单元测试

我们当前的数据库有约300个表,有约100个聚合根。总共有约4000列,完成后我们将有约200万行代码。我想知道,拥有如此规模(或更大)的数据库的公司是否真的努力模拟/存根他们的域对象以进行测试?我在一家大公司工作已经两年了,但当时所有大型应用程序都是通过集成测试进行测试的。如果单元测试需要很多设置,那么它通常是不受欢迎的

我开始觉得单元测试对于静态方法以外的任何方法来说都是浪费时间,因为我们的许多测试方法所用的时间与实际代码所用的时间一样长或更长。。。特别是设置/排列步骤。更糟糕的是,我们的一位开发人员不断引用单元测试和敏捷方法是如何在Kent Beck的克莱斯勒项目中失败的。。。而且这不是一种可以很好地扩展的方法


任何参考资料或经验都会很好。管理层喜欢单元测试的想法,但如果他们看到我们正在编写的额外代码的数量(以及我们的挫折感)他们很乐意让步。

我在项目中有过一些很好的模拟对象和单元测试经验,在这些项目中有大量的前期设计和舒适的时间安排——不幸的是,这通常是一种奢侈,大多数公司都承担不起风险。GTD和GTDF方法也不能解决这个问题,因为它们让开发人员处于发布的跑步机上

单元测试的一个大问题是,如果你不接受整个团队的意见,就会出现一个开发人员带着玫瑰色的眼镜看代码的情况(他们自己没有错),只实现他们所能想到的快乐路径测试。单元测试并不总是像他们应该做的那样及时,因为拐弯处的情况会发生,而且不是每个人都喝Kool-Aid。测试是一种和提出算法截然不同的思维方式,许多开发人员真的不知道如何这样想


当迭代和开发周期很紧时,我发现自己通过依赖静态分析工具和复杂性工具获得了对代码质量的更多信心。(FindBugs、PMD、Clang llvm等)即使它们位于您无法直接解决的区域,您也可以将它们标记为地雷,并帮助更好地确定在该区域实施新功能的风险

如果您发现模拟/存根是痛苦的,并且需要很长时间,那么您可能有一个不适合单元测试的设计。然后你要么重构,要么接受它

我会重构

我有一个大型的应用程序,在编写单元测试时没有遇到任何问题,当我这样做时,我知道是时候重构了

当然,集成测试没有什么问题。我实际上也有这些工具来测试DAL或应用程序的其他部分


所有的自动化测试都应该是一个整体,单元测试只是其中的一部分

是的,他们有。相当广泛

最难的部分是制定编写干净代码的规则,以及(更难的部分是)在进行重构的过程中剔除不好的代码

我曾在世界上最大的银行之一工作过一个项目,该项目已在纽约、伦敦、巴黎和东京使用。它很好地使用了mock,通过大量的训练,我们得到了非常干净的代码


我怀疑mock是个问题——它们只是一个相当简单的工具如果您必须非常依赖它们,那么可以说您需要模拟的模拟返回模拟-然后测试或代码出现了问题…

我看到TDD在大型项目中工作得非常好,特别是在帮助我们控制遗留代码库方面。我也见过大规模的敏捷工作,尽管我认为仅仅做敏捷实践是不够的。写了一篇很好的文章,讲述了随着敏捷的发展,公司的事情是如何发生变化的。我怀疑精益可能更适合组织中的高层。当然,如果在敏捷开始在多个项目中使用时,公司文化与敏捷不匹配,那么它将不起作用(但其他任何东西也不会起作用;最终的结果是,公司无法对任何一种方式的变化做出有效的反应)

无论如何,回到TDD。。。测试独立的代码单元有时会很棘手,如果涉及到大数据驱动的域对象,我通常不会模拟它。相反,我使用一个构建器模式,以便于以正确的方式设置域对象

如果域对象具有复杂的行为,我可能会对此进行模拟,以使其行为可预测

对我来说,编写单元测试的目的并不是为了回归测试。它帮助我思考代码的行为、它的责任以及它如何使用其他代码来帮助它完成它所做的事情。它为其他开发人员提供文档,并帮助我保持设计的整洁。我把它们看作是如何使用一段代码、为什么它有价值以及您可以从中期望的行为的例子

通过这种方式思考,我倾向于编写测试,使代码易于修改且安全,而不是将其固定下来,这样就没有人可以破坏它。我发现专注于模仿所有东西,尤其是域对象,可能会导致非常脆弱的测试


TDD的目的不是测试。如果你想测试一些东西,你可以让测试人员手动查看。测试人员不能每次都这样做的唯一原因是因为我们一直在更改代码,所以TDD的目的是使代码易于更改。如果你的TDD没有让事情变得更简单,那就找一种不同的方法来做。

只是好奇,你觉得单元测试对回归测试有用吗?在某种程度上,