写TDD的测试是否不应该对private方法进行测试

问题描述

再非TDD的测试中,会遇到写测试的时候想对一段逻辑(通常是函数)进行测试却发现这个函数是private在测试,不能访问的问题.遇到这种情况我一般有两种方式处理1. 将该函数声明为public的, 但是这样破坏了这个类的封装性2. 将函数声明为protected,然后将测试类放在同样的包下(不同的源码包), 但是也不是很好所以在非TDD的测试中,更多的是进行最粗粒度的service层(类似于API)的测试.现在偶在尝试TDD, 让domain有更多的职责使其丰富起来,但是这个问题依然困扰我.那么TDD是不是应该避免这个问题呢?我对于TDD是这样理解的,更多的是通过测试来进行设计,在编写测试的过程中将对象之间的交互和关系体现出来,因此主要针对Service层(系统对外部提供API)以下的测试如果我遇到在非TDD测试中访问private函数的问题的时候,我是不是就应该考虑1. 自己过于关注细节,只要看结果即可2. 是不是应该将这个方法放到其它的类中,由这个类提供public方法出来,并且根据这个类编写另外的测试(tell don't ask)不知道我对此的理解是否正确问题补充三楼发的几个链接相当不错,很全面详细地说了几种测试private的方法别的没有记住.老外的那个比喻太搞了just like mother used to say not to expose your private!!!相当雷人哈

解决方案

一般不测试private方法的,貌似都是对面向对象超级精通的大牛。人家知道哪个方法应该是private,哪些不是。对于我等彩笔,还是老老实实的写吧。http://www.artima.com/suiterunner/private2.htmljava 单元测试,使用反射, 以及一个PrivateMethodAccessor 类。来实现。缺点是测试代码比较冗长。http://kailuowang.blogspot.com/2010/08/testing-private-methods-in-rspec.htmlhttp://blog.jayfields.com/2007/11/ruby-testing-private-methods.htmlruby: (rspec), 在每个test之前,将目标方法从 private 改成 public, 之后再改回来。http://www.ruby-forum.com/topic/78762好几个人都不赞同测试private method
解决方案二:
iamlotus 写道你设计一个POS机程序的时候会测试银行内部是如何转账的吗?另外,有这个问题说明混淆了Test Driven 于 Test First。需要测试private的流程都不是TDD,最多是Test First Development。预先写了个interface就开始写full test,写着写着发现function的scope太大,分支太多,testcase不好写,于是就想直接测private function是不是简单点。这还是 Design在前的一套,只不过把 Design->Code->Test 的顺序变成了 Design->Test->Code。TDD讲究的是设计从重构中来,而不是预设计,TDD要求的第一点就是Testable,被抽取的责任需要验证的话就用一个单独的class去实现,怎么会有需要单独测试的private方法呢?这不是教条么?虽然说得有理,但是完全没有Desing就开始Test,有太大意义么?
解决方案三:
你设计一个POS机程序的时候会测试银行内部是如何转账的吗?另外,有这个问题说明混淆了Test Driven 于 Test First。需要测试private的流程都不是TDD,最多是Test First Development。预先写了个interface就开始写full test,写着写着发现function的scope太大,分支太多,testcase不好写,于是就想直接测private function是不是简单点。这还是 Design在前的一套,只不过把 Design->Code->Test 的顺序变成了 Design->Test->Code。TDD讲究的是设计从重构中来,而不是预设计,TDD要求的第一点就是Testable,被抽取的责任需要验证的话就用一个单独的class去实现,怎么会有需要单独测试的private方法呢?
解决方案四:
我觉的不该测试private方法,本身private方法一定会被protected or public方法所调用,那些才是应该测试的
解决方案五:
为什么会出现private方法?用TDD方式写程序,会产生楼主这个问题吗?
解决方案六:
不加任何修饰,然后测试代码和目标类同一个包名下。
解决方案七:
本身就不需要测试private方法~哪个SB第一个想出来要TDDprivate方法的?吃饱饭没事情做啊?
解决方案八:
不是将private修改为protect及public.而是修改成 package,包内可见.满足测试需要即可,千万不要还搞反射等SB玩意.
解决方案:
我想知道,private方法是怎么来的?
解决方案:
1 如果可以正确的判定方法的访问类型,则不用测试private。2 如果你是搞卫星,火箭,金融,医疗,还是测试一下吧。
解决方案:
sg552 写道一般不测试private方法的,貌似都是对面向对象超级精通的大牛。人家知道哪个方法应该是private,哪些不是。对于我等彩笔,还是老老实实的写吧。http://www.artima.com/suiterunner/private2.htmljava 单元测试,使用反射, 以及一个PrivateMethodAccessor 类。来实现。缺点是测试代码比较冗长。http://kailuowang.blogspot.com/2010/08/testing-private-methods-in-rspec.htmlhttp://blog.jayfields.com/2007/11/ruby-testing-private-methods.htmlruby: (rspec), 在每个test之前,将目标方法从 private 改成 public, 之后再改回来。http://www.ruby-forum.com/topic/78762好几个人都不赞同测试private method 主要是太麻烦了....为测试个private方法还得动用反射 测试出错可能性大大超过源码业务逻辑错误.如果需要测试 设计时不要设计成private才是王道 .PS:私有,公有之间还有两种声明方式的.....
解决方案:
这样的争论在tdd社区中已经持续了很长时间了。一般的看法是不应该单独测试private的方法,而应该通过测试public的方法间接达到多private的覆盖。其实,当你需要测试private方法的时候,更应该问你自己的问题是,我真的需要测试这个吗?有没有可能吧这个逻辑抽出到另外一类中?

时间: 2024-07-29 16:08:56

写TDD的测试是否不应该对private方法进行测试的相关文章

编程语言-c#实现两个相差一千位以内的整数相加,写出这样一个方法并测试两个相差一百位以上的两个数,输出结果。

问题描述 c#实现两个相差一千位以内的整数相加,写出这样一个方法并测试两个相差一百位以上的两个数,输出结果. (如:111111111111111111111111111110 + 8 ) 解决方案 如果是.NET 4.0(VS2010),不需要写什么方法,直接调用BigIntegerhttps://msdn.microsoft.com/zh-cn/library/system.numerics.biginteger.aspx 解决方案二: 2000位的整数也不在话下,加减乘除都能做.

hibernate-用ssh写的java后台,在本机上做了下并发测试,才100用户并发mysql就开始报异常了,怎么解决

问题描述 用ssh写的java后台,在本机上做了下并发测试,才100用户并发mysql就开始报异常了,怎么解决 org.hibernate.exception.JDBCConnectionException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97) at org.hibernate.exception.JDBCExceptionHe

测试手机网页的5大方法

@陈子木 细心的同学不难发现,现在用手机访问优设网有了全新的阅读体验,而且速度很快.有这样的改变其实也是收到了很多来自微信.微博粉丝的建议,大家想在上班.下班及睡觉的时候阅读收藏在微博和浏览器(同步)里的优设文章. 我们知道手机浏览器的使用量每天都在增长,根据StatCounter的统计数据,手机和平板的使用量约占30%的网络流量,这意味着消费者耗费在移动版网页上的时间比以往任何时候都高.可即使具备诸如移动端优先的响应式设计,由于目前设备尺寸和种类的繁杂,在加载前对终端屏幕进行测试也是压力山大的

Qunit使用场合的问题?一开始编写一个ajax方法就测试吗

问题描述 Qunit使用场合的问题?一开始编写一个ajax方法就测试吗 有谁知道哇?我觉得断言和js去比较没什么区别呀,我是菜鸟求帮忙 解决方案 它是一个自动测试框架,参考http://tech.ddvip.com/2013-08/1375646488200262.html 解决方案二: 它是jquery提供的官方测试套件,进行单元测试的,应该是你实现了你功能模块等后,对模块进行ut时使用这个框架,这样以后你再次修改模块等,就可以用这个写好的ut程序测试你的代码改动是否带来副作用.

通过Java测试几种压缩算法的性能(附测试代码下载)_java

本文将会对常用的几个压缩算法的性能作一下比较.结果表明,某些算法在极端苛刻的CPU限制下仍能正常工作. 文中进行比较的算有: JDK GZIP --这是一个压缩比高的慢速算法,压缩后的数据适合长期使用.JDK中的java.util.zip.GZIPInputStream / GZIPOutputStream便是这个算法的实现. JDK deflate --这是JDK中的又一个算法(zip文件用的就是这一算法).它与gzip的不同之处在于,你可以指定算法的压缩级别,这样你可以在压缩时间和输出文件大

VS2010测试功能之旅:编码的UI测试(2)-操作“.NET研究”动作的录制原理(下)

回顾 在本章上部分介绍了操作动作的录制原理,描述了操作动作是如何录制,UIMap.uitest和UIMap.Designer.cs的代码如何生成,以及他们的结构.在这个部分,将着重说明如何通过修改UIMap1.uitest文件的操作动作部分的代码来控制UIMap1.Designer.cs操作动作部分代码的生成,实现第一种方式的自定义编码. 内容简介  在上个部分,已经说明了UIMap.uitest文件的结构如下: 其中InitializeActions,ExecuteActions,Cleanu

arraylist-JAVA小白问题:测试Iterable接口的Iterator迭代器方法时遇到的疑问

问题描述 JAVA小白问题:测试Iterable接口的Iterator迭代器方法时遇到的疑问 创建个Arraylist集合,放几个数据,然后用迭代器循环遍历,同时想做个判断,如果等于指定的数值的数据出现了,就删除它,继续迭代别的元素,单独用remove删除方法没问题,但把它和next方法合起来用,就报错了,求解,谢谢! 解决方案 既然你自己也标注了正确的和错误的,我给你提一下,你这里有三个点: 分别是,it.hasnext(),第一个it.next(),第二个next. 先解释一下it.hasn

JAVA_数组_泛型:我写了一个数组结合泛型的通用求和方法,求帮忙优化,写的太烂了

问题描述 JAVA_数组_泛型:我写了一个数组结合泛型的通用求和方法,求帮忙优化,写的太烂了 =====<求求大神帮我优化下啊,我写的太烂了>==== public static void main(String[] args) { Number[] num1 = {2, 3, 3, 4, 5}; //Integer Number[] num2 = {1.1, 2.0, 3.0, 4.0, 5.0}; //Double System.out.println(num1[0].getClass()

ipvs nat-用ipvs做负载均衡(nat)方法,测试失败

问题描述 用ipvs做负载均衡(nat)方法,测试失败 在windows下安装了3台虚拟机,防火墙全部关闭 windows的网络配置 ip-192.183.3.228 gateway-192.183.3.1 server 1 eth0 ip-192.168.179.137 gateway-192.168.179.2 1.安装ipvs 2.配置转发 echo 1 > /proc/sys/net/ipv4/ip_forward 3.配置ipvs ipvsadm -C ipvsadm -A -t 19