mock1234 写道
zhang_xzhi_xjtu 写道
在用反射做UT时,注意,使用的是getDeclaredMethod方法而不是getMethod,同时注意使用method.setAccessible(true)来使方法可以被访问。在实现的时候,最好有一个方法的转调,以减少代码重构对test的影响(这样只有一个地方hard code)。
比如我们有一个
private int getUserAge(String userId) 的方法,为了测试......
UT还private?更进一步地说,UT还纠结于单元测试?
如果你真的做UT,你在动手写代码之前就有关于用户行为(这里的用户不仅仅指最终用户,如果你是发布一组工具那么你的用户就是其它开发组中的程序员)的设计了,你可以将这种设计写为测试程序(而不是满足在可以随便忽悠着解释的文档),然后才开始开发。如果编译不通过,就让它编译通过;如果针对数据输入输出的断言不通过,就让断言通过!
你做UT时还纠结于private,甚至纠结于单元测试,咄咄怪事。(因为单元测试工具只是一个驱动测试开始执行的工具,而你要的是针对UT的对象而不是什么代码函数单元啊)。
更进一步说,好的测试是对重构提供支持的。你纠结于那些“单元”,还能重构吗?使用你的所谓单元测试代码维系垃圾代码,当作餐桌上的主菜,是不是本末倒置了?
我给你提供一个测试的“原则”作为参考。对于纯粹功能性的开发,我在写测试时保持大致1个半小时的开发时间(因为之前需要10~30分钟编写测试代码的时间),这就是我写测试的原则。
每当重构了,当然要回归运行那些测试代码。因此这些测试时为了支持重构这种高度灵活性的东西而准备的。
怎么可能像你那样,先写完了实现代码,然后才钻到垃圾堆底层private单元集合里边去翻最臭味道的代码单元来编织到“测试系统”里呢?
你说的这些我都是同意的,如果条件允许的话,我当然也是这么做,事实上,TDD的开发精髓就是测试驱动设计。
问题是我现在面临的场景中,业务逻辑很复杂,于是,为了方法的内聚性,一个public的方法往往需要调用拆分出去多个private方法,这是,如果坚持一套完整的测试的话,那么测试环境的搭建将变得复杂,或者说关注点不集中,因为测试的分支是成指数级别增长的,而为了系统的稳定性,我们需要覆盖掉所有的分支。我选择用反射来测试这些private方法可以分离测试的关注点。当然,这个对重构是有不好的影响的,权衡利弊,我只能采取一些措施降低这种影响,但是还是要保全一个test的完整性和专注性。
举个例子,
public Object f(Object input){
根据input计算出s1,s2,s3,s4,flag
if(flag){
a=g(s1,s2);
return a;
}else{
b=g(s3,s4);
return b;
}
}
public void f1(){
调用g.
}
private Object g(Object o1,Object o2){
}
flag有2种状态。
假设g方法的参数o1,o2各有3种状态。
如果采用先test后code的方法,为了完整的测试f的功能,那么我们需要控制input来生成所有的2*3*3=18个test才能完全覆盖到所有的分支。当然,也可以控制input生成flag为true的9种情况,以及1个flag为false的情况。
但是我觉得这样的测试关注点不够集中,我的思路是,可以先为f写两个test,来覆盖flag的两个分支,然后coding,保证f的两个分支都被测试到,即g都被调用过,至于g自己的方法约定,应该属于g自己的事情,可以用反射来测试。
我们在考虑一下如果f,f1都要调用g方法的情况,那么我们有必要为测试f,f1都建立g的9种状态吗?如果还有更多的f2,f3,...fn呢?
传统的test是一种黑盒测试,而用反射是白盒测试。我认为程序员是可以利用关于实现的知识进行测试的。利用反射,虽然一方面增加了重构的难度,但是,可以提高测试的关注点,同时,白盒测试也有利于重构出被多个public方法调用的private方法。
分享到:
相关推荐
12. **膝跳反射实验失败原因**:测试同学叩击速度过快、被测试同学未放松、测试部位不准确都会导致实验失败,而被测试同学绷紧膝关节也会阻碍反射的正常表现。 13. **非反射行为**:含羞草受到振动叶片闭合是植物的...
这篇资料是针对五年级科学课程的一个综合测试题集,主要涉及解释的概念、模型的理解以及科学解释的形成过程。下面将详细展开这些知识点。 一、解释的性质与形成 1. 解释是对事物发展变化的(原因)、(规律)等情况...
7. 人类特有的反射:涉及语言和文字的反射是人类特有的,如听到特定词汇或句子引发的情绪反应。例如,“杯弓蛇影”是复杂反射,与心理暗示有关;“画饼充饥”是人类通过想象力产生的复杂心理反应;“谈虎色变”则...
还需要适当的刺激才能引发反射活动。 5. 人类特有的反射 - 人类特有的反射不仅限于与书面文字有关的,也包括与语言、哑语、盲文等其他形式的符号交流。 6. 反射弧结构 - 灰质(甲)主要由神经元的细胞体构成,...
通过反射阳光,可以在远处引起注意,提高获救几率。拥有化妆镜意味着有80%的机会被发现。 2. **一件厚衣服**:在极端的温度变化中,衣物可以帮助保持体温,减少水分蒸发,延长生存时间。 3. **四公升水**:水是...
同时,通过探究复杂反射,如语言文字引起的反应,让学生意识到学习的重要性。实验和讨论环节还能增强学生的团队合作意识。 **教学重点**是让学生掌握人体神经调节的基本方式,即反射。而**教学难点**在于引导学生...
审题、思考和作答等活动的神经中枢位于大脑。 综上所述,本专题涵盖了人体神经系统的重要组成部分,如脑干、甲状腺激素、生长激素、反射弧、触觉中枢和语言中枢的作用,以及视觉形成和人体生命活动调节的基础知识,...
当前,认知心理学已经成为教育领域的重要理论基础,尤其在中等职业教育(中职)中,对提高教学质量起到了关键作用。 【认知心理学知识分类】 1. 陈述性知识:这是关于事实、概念和事件的知识,可以直接用言语表述...
通过本实验,学生将深入理解无线通信中信号衰减的复杂性,以及如何评估和应对这些现象,这对于优化无线网络设计和提高通信质量至关重要。在进行实验时,学生应认真思考并记录准确的数据,以确保报告的科学性和准确性...
6. **实验与反向思考**:动物智力研究也引发我们思考如果动物有机会进行实验,它们会如何测试人类。例如,家猫可能通过与主人的互动进行条件反射的学习研究。如果动物主导实验,它们可能会测试人类的耐心、忠诚度和...
条件反射的理论由巴甫洛夫提出,他区分了第一信号系统(由具体刺激引发的反应)和第二信号系统(由语言符号引发的反应),强调了人特有的第二信号系统在心理活动中的作用。高级神经活动包含兴奋和抑制过程,这两者...
7. “望梅止渴”是经典条件反射的例证,源自巴甫洛夫的实验,通过条件刺激(望梅)引发预期的反应(唾液分泌,类似吃梅子时的反应)。 8. 促进心理学从非科学状态转变为科学状态的根本原因是自然科学方法的引入,这...
教师可以通过播放一段关于自然界中生物互动的视频,引发学生对大自然的兴趣和好奇心,然后引出本单元的主题“大自然的启示”。 2. 讲解课文《自然之道》: 首先,教师讲解课文的背景和主要事件,引导学生关注文中...
【教师招聘考试】是针对教育行业的专业招聘考试,主要测试考生的教学能力、教育心理学知识以及学生指导技巧。在这些题目中,我们可以看到涉及多个教育心理学和教学法的知识点。 1. 性格描绘:性格是个人对现实和...
这份模拟试卷旨在测试考生对于教育心理学、教学方法以及中学生物基础知识的理解和应用。 1. 教育心理学部分: - 学习过程是教育心理学研究的核心内容,它涉及学生如何获取、理解和应用知识。 - 教师的"传道者角色...
- **定向反射**:由新奇环境引发的反射行为,存在于人和动物中。 - **发散思维**:探索多个解决方案的思维模式。 - **反射**:中枢神经系统参与下的对外界刺激的规律性响应。 - **非智力因素**:涵盖动机、兴趣...
在IT行业中,设计装置往往涉及到用户体验、人机交互...综上所述,即使是一个简单的"方便阅读的卷纸筒"设计,也能引发我们对IT行业多个领域的思考,从中学习到如何将技术与日常生活更好地融合,创造出更加人性化的产品。
这篇资料是关于研究生英语真题的一个部分,主题是"动物智力与生存寿命的关系"。文章通过分析果蝇实验,探讨了...总的来说,这篇文章通过对动物智力的研究,引发了对人类智能本质和我们对周围世界的认知程度的深入思考。
3. **测试稳定性**:测试的信度是指在同一测试条件下,多次测量结果的一致性,是评估测试可靠性的指标。 4. **知识概括方法**:有效概括知识的方法包括比较、分类、归纳和演绎推理,通过这些方法可以帮助学生理解和...