English 中文(简体)
由于编译速度慢,使用大型C#解决方案的TDD几乎不可能实现
原标题:TDD with large C# solution virtually impossible due to slow compile speed

我正在开发一个目前有60个程序集的大型解决方案。有许多部件定义了解决方案的通用零件,然后是系统的一些入口点部件。

目前,TDD几乎是不可能的,因为在最低域层中的一行更改会强制重建几乎整个解决方案,因为测试组件引用了解决方案的各个层。

What is best practice, to bring the build time down from its current 75seconds to a more acceptable 5 seconds or so? This will make TDD feasible again.

在进行单元测试时,一些类需要由其他程序集的接口定义的mock,因此必须在测试程序集中引用。因此,除了在解决方案的最低级别之外,对其他程序集进行单一引用并不总是可能的。

问题回答

IMHO the problem lies here: "as the test assembly references various layers of the solution."
You should have one test assembly per assembly you want to test.
When you still reference many assemblies in each of your test assemblies, you have a different problem: You are creating integration tests. That s not what you want to do in TDD.

In addition to the update to your question:
Normally, you would define the interfaces in another assembly than the implementation. So a change to the implementation of a low level class should have no impact on the higher level classes that use those interfaces...

其他人告诉你重构etc,如果你能,那就太好了…

还有一些其他事情更容易做到:

  • 将小项目合并为大项目,因为构建解决方案时每个项目都有很大的开销。(使用依赖如果需要控制跨层调用,可以在”代码查询语言”,然后作为构建的一部分进行检查)

  • 将所有项目构建到某个输出目录中,然后在所有项目引用上将“copy local”设置为false——这可能会由于IO减少而导致速度大大加快。

  • 打开你的病毒检查器,看看它是否有多大区别;如果是,请查找更快的病毒检查程序,或从病毒检查程序扫描中排除“热门”文件夹

  • 使用性能监视器和系统内部工具来查看编译是如何花费这么长时间的。

  • 考虑一个ram磁盘来放置输出目录。

  • 考虑使用SSD,这是一个很大的收益而且它们越来越便宜。

  • 更多的内存有时会产生很大的影响——(减少机器中的内存——如果你通过移除一个小内存来获得很大的减速,那么你可能会通过添加更多内存来获得更大的速度)

  • 删除不必要的项目引用(您可能必须先删除不需要的“using”)

(更快的构建也会使重构更快!)

将整个解决方案拆分为更小的基于层(甚至更具体)的解决方案,并让每个解决方案都有一组特定的单元测试。你不能真的认真对待这个问题——一个解决方案中有60个项目——为什么有人想使用它?对你来说,在一小时内对其中的10个进行更改是一项常见的任务吗?

对于TDD和大型项目,问题通常是测试运行缓慢,而不是编译时间。让整个构建过程由一些特殊的构建机器来处理,并执行整个构建&;整个单元测试仅在签入时运行。

这将使您的开发恢复到正常的TDD。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签