最近在学习测试驱动开发(TestDriven Development,简称TDD)。我的感受可以用这句来形容比较贴切,“理想总是饱满的,现实都是骨感的”。
当我说“理想总是饱满的”时,那是因为TDD所致力于的目标所带来的好处,确实很诱人。代码松耦合、不惧代码重构等等,这些都是极具价值的。
当我说“现实都是骨感的”时,那是因为想用TDD去开发项目,需要了解的东西确实比较多,不然你会发现实践TDD很难很难!怎样让代码具有可测试性,怎样处理依赖,怎样创建好的单元测试等等,这些都是要深入了解的。
以下是一些个人觉得一些很重要的知识点,仅供参考。每一个知识点都值得我们好好深究。我们的终极目标是理想和现代都应该是饱满的。
SOLID
- SRP:Single ResponsibilityPrinciple
- OCP:Open ClosedPrinciple
- LSP:Liskov SubstitutionPrinciple
- ISP:Interface SegregationPrinciple
- DIP:DependencyInversion Principle
Uncle Bob著名的五大原则总结得非常好。你可能觉得很好理解,但付诸实践好像不是那么简单。当你真正能得心应手地付诸实践时,你会发现SOLID能极大地改善我们的代码。尤其是DIP,对TDD来说,很重要很重要。如果不能实现依赖隔离,我们就无法把测试仅仅局限在一小段代码内,于是那些没有隔离的依赖代码也会影响单元测试!
FIRST
- Fast
- Independent
- Repeatable
- Self-validating
- Timely
这是写单元测试时,应该谨记的五大原则。
依赖注入(DependencyInjection)
单独拿出来说,那是因为太重要了。我们写代码的时候要特别注意依赖,我们常用依赖注入来创建接缝(Seam),这样在单元测试的时候才能模拟各种依赖。
Moq / AutoMoq
第三方库,利用他们可以轻易实现各种依赖的模拟。
Ninject、Autofac等
第三方库,这些能帮助我们自动地建立程序需要的对象树。
MVVM
程序高层架构应该实现分层。只用让UI层和业务逻辑层(business logic)分成,我们才能测试业务逻辑层。MVVM是一个非常好的架构,如果你开发基于XAML的程序,MVVM一定要掌握!
Prism、MVVM Light Toolkit等
第三方库,这些是帮我们更快实现MVVM的辅助库。非常好用。
我的近期目标是也能写出好的能测试业务逻辑层的单元测试。我觉得业务逻辑层的单元测试比较难,只有很好的掌握了好多知识以后,才能写出很好的业务逻辑层的单元测试。加油!