设为首页 加入收藏

TOP

TDD学习笔记【三】---是否需针对非public方法进行测试?(二)
2019-09-03 00:01:41 】 浏览:31
Tags:TDD 学习 笔记 --- 是否 针对 public 方法 进行 测试
tected method,是一件正确且重要的事。

所以将这样的思考与推论过程,分享给各位朋友参考,不一定完全符合Visual Studio 2012 移除accessor ??的原因,这只是我自己的理解与想法而已,但从我一开始接触单元测试,怎么测private method 就一直困扰我很久,虽说脑袋中有点轮廓,却一直无法明确厘清。

 

补充

这边有一篇写的很不错的文章,讲的相当全面,包括概念、现实上的考量、过程中的考量,都写得很清楚。请参考:Testing Private Methods with JUnit and SuiteRunner

2012/11/09 补充:VS2012 将accessor ??与自动产生单元测试代码的功能移除的另一个原因是:因为原本accessor ??的产生机制,与MS Test 的耦合度太高了。(在Visual Studio 2012 后,期望可以很弹性的与其他Unit Test Provider 结合。)

 

读者的疑问

针对读者的一些疑问,我就补充在文末,大家若还有什么想了解或发问的,欢迎留言。

 

Q1. 文章上只提到了 public, protected, private,那麼 internal 呢?

答: 这是一个很棒的问题,因为我文中的确没提到internal 的部份。

首先internal 的定义/用意,是指在同一组件内才能看的到,也就是我这对象希望在我这组件里是公开的,但组件外的人看不到也用不到。(这样设计可以有效控制相依范围)

而单元测试如前面所说,是针对「对象」的互动,来进行模拟使用。那声明成internal 的对象,到底要不要测试,当然要,因为的确有其他对象会使用它,我们就要思考:「怎么使用它」。

但一般测试项目的角度来看,是参考生产代码 的library,所以对测试项目的角度,是看不到生产代码 里面声明成internal 的对象的,??但我又想去测试生产代码 中internal 的对象,该怎么办?

在.NET中相当简单,只需要通过:InternalsVisibleToAttribute这个属性设定即可。将生产代码 library指定给test project可见,就可以解决这个问题。

 

Q2. 若没针对private测试,当发生问题时,我怎么知道是哪一段code错了?或是它没被涵盖到,就代表没有受到测试保护。

答:这个问题,就是慢慢消化这篇文章,并实际动手做之后,就会渐渐的拨开云雾见青天了。

当只用测试的思维来看,那不去「针对」private method 测试,是一件很奇怪的事,因为它活着,但没有测试可以马上知道它对不对。

这也是跨入TDD 的其中一道门槛。回过头来看前几篇的宗旨,系统的存在,到底为了什么?

为了可以正确的满足使用者的需求,外部使用的需求。既然用了对象导向来设计,既然把这些东西封装起来,外部的使用者就根本看不到、用不到,也不该看到用到。而我们封装的意义就在于封装变化。这时候用其他方式,硬干进去对象中去测试private method,也只是增加自己未来的负担,因为它肯定会一直变。

原本private 的改变,可以几乎不影响任何部分,除了对象本身内部。所以它可以放变化。

现在外面看的到这个方法,你就不能轻易改变,一旦要改,可能会影响许多测试程式,反倒是生产代码 不会有太多影响。但测试程式如果因此要维护或是要重写,这就都是根本没必要的东西。

最后,如??果你用TDD的方式开发,就根本更不会碰到这个问题。

因为,你只针对public 行为,来进行预期,永远切入点都是撰写public 的内容。大概只有重构的时候,会出现private 跟protected。而这个时候,被放到private 的方法,当然是你原本放在public 方法内的内容。

那如果原本public 方法code coverage 是100%,那也不会因为你搬到private,code coverage 就变成50%。如果出现了因为重构,就没有涵盖到的范围,那就是over design 的bad smell,是个征兆。

这边就是需要搭配TDD 与Refactoring 的手法,才能一体成型,享受其美妙之处而无后顾之忧。再强调一次,private / protected的方法内容,在TDD里面,基本上都是因为refactoring的extract method所产生的,都是一些原本放在public / internal的function内容。而不会是直接动手去写private function,除非你是top-down的先订出程序的框架。但最终,private function仍属于public function内容的一部分。

所以要特别满足的应该是:您是否有针对外部可见的行为,进行了所有具代表性的情境来做测试。如果真的涵盖了所有,包括exception handling,那么这个对象内,没被涵盖到的部份,基本上都可以删除了。绝不会对外部使用造成任何影响。

 

备注:这个系列是我毕业后时隔一年重新开始进入开发行业后对大拿们的博文摘要整理进行学习对自我的各个欠缺的方面进行充电记录博客的过程,非原创,特此感谢91 等前辈

 

 

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇坑人的运算符 下一篇使用LINQ 對List分頁/區

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目