1700453270
class Apple{
1700453271
1700453272
//苹果颜色
1700453273
1700453274
private int color;
1700453275
1700453276
public int getColor(){
1700453277
1700453278
return color;
1700453279
1700453280
}
1700453281
1700453282
public void setColor(int color){
1700453283
1700453284
this.color=color;
1700453285
1700453286
}
1700453287
1700453288
}
1700453289
1700453290
这是一个简单的JavaBean,也是我们项目中经常出现的,对于此类BO(Business Object),通常情况下是不会进行单元测试的,想必你也会想这不用测试吧,很简单嘛,就一个getter/setter方法,出错的可能性不大。但这只是我们一厢情愿的想法,如果该Apple是在多线程环境下,你还认为不会出现线程不安全的情况吗?事实上,因为没有采用资源保护措施(synchronized或Lock),多个线程共同访问该对象时就会出现不安全的情况。现在问题来了:为什么在通常情况下不做此类对象的单元测试呢?
1700453291
1700453292
比如一个JEE应用,一般情况下都是多线程环境,但是我们很少对代码进行多线程测试,原因很简单,测试很复杂,很难进行全面的多线程测试。而且如果要保证在多线程下测试通过,就必须对代码增加大量的修饰,这必然会导致代码的可读性和可维护性降低,这也是我们一般都抛弃多线程测试的原因。
1700453293
1700453294
在Spring中,默认情况下每个注入的对象都是Singleton的,也就是单例的,每个类在内存中只有一个对象实例,这也是偶尔出现数据资源不一致现象的元凶:在多线程环境下数据未进行资源保护,特别是在系统压力较大、响应能力较低的情况下,数据资源出现不一致情况的可能性更大。
1700453295
1700453296
这只是一种单元测试很难覆盖的情景,还有一种情景是根本不能实施单元测试,比如不确定性算法(Nondeterministic Algorithm),什么叫不确定算法?像我们经常接触的函数f(x),给定一个确定的x值,就有确定的结果f(x),在任何时候输入x,都能获得固定的f(x),这就是确定性算法,也是我们经常接触的,但还有一种算法,比如要计算出明天通过某一个大桥的车辆数量,必须根据专家经验、天气、交通情况、是否是节庆日、是否有大型体育比赛、并行道路通行的情况等来进行计算,这些条件很多都是非确定的依据,所推导出的也是一个非确定结论的数据—明天通过大桥的车辆数量,想想看,这怎么进行单元测试,不确定算法只能无限接近而不能达到,单元测试只能对确定算法进行假设,不能对不确定算法进行验证。
1700453297
1700453298
(4)单元测试验证的是编码人员的假设
1700453299
1700453300
我们都知道单元测试是白箱测试,一般情况下测试代码是编码人员自行编写的,我们可以这样理解,编码人员根据胸中的蓝图,迅速地实行了一个算法,然后通过断言确定算法是否与预期相匹配。简单地说,我们左手画了一个圆,右手拿着一个圆规进行测试,检验这是否是一个标准的圆,但问题是是谁要求我们画一个圆的呢?谁又能确定是一个直径为2厘米的圆而不是2.1厘米的圆?—代码的意图只是反映了编码者的理解,而单元测试只是验证了这种假设。想想看,如果编码者从一开始就误解了需求意图,此时的单元测试就充当了帮凶:验证了一个错误的假设。
1700453301
1700453302
指出单元测试的缺陷,并不是为了说明单元测试不必要,相反,单元测试在项目中是必须的,而且是非常重要的,特别敏捷开发中提倡的TDD(Test-Driven Development)测试驱动开发:单元测试先行,而后才会编写生产代码,这可以大幅度地提升代码质量,加快项目开发的进度。
1700453303
1700453304
1700453305
1700453306
1700453308
编写高质量代码:改善Java程序的151个建议 建议146:让注释正确、清晰、简洁
1700453309
1700453310
从我们写第一个“Hello World”程序开始,就被谆谆教导“代码要有注释”,而且一加就是好多年,基本上是代码就有注释,而且有的还很多,甚至有的是长篇累牍的。我们先来看一些不好的注解习惯。
1700453311
1700453312
(1)废话式注释
1700453313
1700453314
比如这样的注释:
1700453315
1700453316
/*
1700453317
1700453318
*该算法不如某某算法优秀,可以优化,时间太紧,以后再说
1700453319
[
上一页 ]
[ :1.70045327e+09 ]
[
下一页 ]