java单元测试的两点注意事项

翻译 2006年06月22日 23:30:00

介绍
        开发人员编写单元测试来检查他们的代码。单元测试不同于集成测试和验收测试。集成测试保证各组件
的协同工作,验收测试保证程序满足客户期望。单元测试只是对代码的一个单元进行测试。在Java中,
一个单元通常指代一个类。
        单元测试要求全自动,无人工交互,非成功既失败。所以,当你运行代码,再检查他的输出是否正确,
这个过程并不是单元测试。单元测试要求写一些测试来驱动你的代码,而你可以查看工作的结果。
        一直以来,单元测试一直停留在嘴上说说的境地,不过现在它终于成为Java开发者的专业工具。成为一个大师级别的Java程序员还不足够。现在你要懂得怎样正确的测试你的代码,这样可以引领你写出高质量的代码而且具有高效率,低维护成本。
       在本章中,主要讨论两点,当Java程序员作单元测试时,一直被这这两点困扰。是否要以便利于测试的方式设计系统,怎样测试不确定性的代码。

不要为了测试而牺牲设计
        单元测试和它要测试系统之间的关系是一个很常见的问题.所以先讨论这一点。当你写单元测试的时候,有时会被迫改变代码以适应测试。尤其是当你想测试一个私有方法或属性的时候。如果你把私有方法改为公有方法纯粹是出于测试的目的,那么不要这样做。测试意味着提升代码的质量,而不是降低。
        话是这么说,有时候设计系统的时候使其便于测试还是很必要的。如果你要加入一个设计支持测试,一定要保证它会增强系统的整体质量。如果不是这样,你只是为了测试才这么设计,那么我必须要强调,这很不好。
  例如,你有一个连接数据库的系统。如果你的系统连接测试数据库和正是开发数据库一样便利,那么这样很好。
如果你把它设计成允许数据库可配置,这样方便了测试。同时你也加强了设计的质量,因为这样你的系统就更具有灵活性(你可以不用改变代码就连接到产品数据库上)。这种设计使系统和测试都受益,所以是个好决定。
        你的类只能通过工厂方法实例化。你需要测试一个类的对象,但出于某种原因,你无法调用工厂。它可能需要一些资源作为参数传入,但是你的测试环境中没有。那么是否能够将该类的默认构造方法改为公有,这样就可以在测试中实例化该类。这样做消减了系统设计的质量,允许任何人都可以访问这个构造方法。在这种情况下,程序员需要提供必需的资源,从工厂中实例化该类(可以通过使用Mock Object)。
        现在,讨论完这个问题,我们检查一些常见测试问题的解决方案。第一个问题是怎样具有测试不确定性的代码。

为不确定性的代码编写具有统计性的测试
    有的代码具有不确定性。也就是说,影响一个方法的具体结果的因素并不仅限于此方法内的代码。System.currentTimeMillis()的返回值就是一个最简单的例子。
确切的结果不是取决于代码而是底层的硬件。它返回的值是基于系统时钟,每次代码运行的时候都会有不同的返回结果。
  另一个例子是测试消息从服务端传送到浏览器的耗时。要构建一个可以预测的模型需要太多的变数。在细粒度层次上,网络是不确定的甚至是混乱的。然而,
在细粒度层次上不可预测并不表明全面行为不可预测。如果你把大量的细粒结果收集起来,你可以得到对期望值得有效预测。
   例如,你的需求是90%的网络业务要在1/100秒钟完成。简单的方法是你可以反复运行代码,保存通过和失败的数目。如果90%失败了,那么测试液就失败了。
如下的代码要确保业务的性能在一个合理的范围内:
private int doPerformanceTest(int numberOfRuns, int
   requiredTimeInMilliseconds) {
  int passed = 0;
  Fragment fragment = new Fragment();

  for(int i = 0; i < numberOfRuns; i++) {
    long startTime = System.currentTimeMillis();
    fragment.doTransaction();
    long endTime = System.currentTimeMillis();
    long runTime = endTime - startTime;
    if(runTime < requiredTimeInMilliseconds) passed++;
  }
  return passed;
}

  使用这个方法的测试应该用断言来负责验证:
public void testPerformanceStatistics () {
  double percentageRequired = 90.0;
  int numberOfRuns = 1000;
  int passed = doPerformanceTest(numberOfRuns, 100);
  double percentagePassed = passed / numberOfRuns;
  assertTrue("percentagePassed = " + percentagePassed,
percentagePassed >= percentageRequired);
}
  这种可统计的测试技术对于定位很多问题都很有用。尤其是测试那些结果基于日期,时间或者随机数的方法。测试性能和代码的非确定性属性是也是很有价值的。


单元测试对于程序员是很重要的工具。Java方面有很多的工具帮助进行测试用例的开发。在你的项目中,都会需要这些工具。编写单元测试相当容易,而且很有效。也不会花费太多的时间来运行。

用junit对java代码进行单元测试时需要注意的问题。

用junit对java代码进行单元测试时需要注意的问题。 1、用@Test注解的方法必须没有返回值,返回值类型无:void 2、用@Test注解的方法必须没有入参。 比如以下错误代码示例: p...
  • suyu_yuan
  • suyu_yuan
  • 2016年06月16日 17:59
  • 5954

java单元测试(使用junit)

Unit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),供Java开发人员编写单元测试之用。  1、概述  ...
  • dx01259
  • dx01259
  • 2016年03月04日 11:37
  • 1730

JAVA 单元测试总结

单元测试的重要性这里就不说了,直接进入正题。很多程序员不喜欢写单元测试,导致项目经常会花很多时间去debug,这完全得不偿失。对关键方法进行单元测试,可以在早期业务逻辑还没那么复杂的时候,尽快排除症结...
  • antony9118
  • antony9118
  • 2017年01月10日 12:42
  • 5103

菜鸟学Java(二十一)——如何更好的进行单元测试——JUnit

测试在软件声明周期中的重要性,不用我多说想必大家也都非常清楚。软件测试有很多分类,从测试的方法上可分为:黑盒测试、白盒测试、静态测试、动态测试等;从软件开发的过程分为:单元测试、集成测试、确认测试、验...
  • liushuijinger
  • liushuijinger
  • 2014年06月18日 21:23
  • 36164

单元测试规范

单元测试规范
  • iprettydeveloper
  • iprettydeveloper
  • 2017年02月15日 11:13
  • 1114

Junit4 针对Service接口的单元测试

作者:Java兔 参考资料:http://blog.csdn.net/u013041642/article/details/71430293测试环境: SpringMvc + Spring + M...
  • huangjp_hz
  • huangjp_hz
  • 2017年07月24日 18:28
  • 503

Java单元测试(Junit+Mock+代码覆盖率)

原文见此处单元测试是编写测试代码,用来检测特定的、明确的、细颗粒的功能。单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的。单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修...
  • AloneSword
  • AloneSword
  • 2014年11月19日 22:42
  • 15441

java中Junit单元测试

Junit单元测试 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。Java里单元指一个类。 JUnit ,是一个开源的Java单元测试框架,是 Java的标准单元...
  • typa01_kk
  • typa01_kk
  • 2013年01月17日 16:37
  • 24383

TestNg JAVA 自动化单元测试框架Demo

TestNg java 自动化测试
  • a542551042
  • a542551042
  • 2015年06月30日 16:23
  • 2276

Java的单元测试和集成spring单元测试

在我们编写项目过程中,经常会需要进行代码测试,那是不是在编写一个main方法之后,然后编写各种的测试代码。这样做,显然是不合适的也是很不专业的。那怎么办呢?今天我们来聊下junit(单元测试)。   ...
  • u012365780
  • u012365780
  • 2016年08月30日 21:04
  • 2056
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java单元测试的两点注意事项
举报原因:
原因补充:

(最多只允许输入30个字)