1、为什么要进行测试?
大家经常会问这个问题,尽管答案是显而易见的,但是仍然有必要在这里作出回答。单元测试有很多作用,下面进行简要的说明:
1.1 对代码进行测试
对于程序员和他所在的公司来说,单元测试使检查程序员编写的代码的基本操作成为可能。当一个人开始写代码时,当要将传递给"测试人员"以及客户时,手工启动功能测试(在代码、main()函数中打印语句)必须被启动多次。
使用JUnit进行单元测试,刚开始时成本较高,但是从长远来看,将可节省时间,因为它们的运行仅需要几秒钟。它们可以保证我们在工作中的预期行为是切实可行的。
1.2 接口文档化
单元测试使我们思考类暴露的接口。此外,也迫使我们更加关注文档的作用(而不是文档是怎么设计的)。
通常,程序员几乎没有时间来写文档。单元测试,通常会使代码和接口持久行为很容易文档化。在那以后,如果接口优化/移动,则测试也必须优化/移动。否则将变成废弃的或者停止通过。
1.3 定位bug
代码编写完,通常会运行的很好。但是事后如果代码由其他人员接手,他没有花时间去了解代码编写人员的意图,就会有可能引入bug。
定期使用自动化方式运行单元测试,将会使发现和修改这些功能性回归更加简单、快速。
1.4 修改bug
证明Bug的正确性首先需要编写为了重现这个bug的Junit单元测试。然后,我们知道当测试正常通过时表示bug被修改了。
因为我们也可以运行一个回归测试集,这将只需要几秒钟,并且我们知道如果我们的改变也可能再引入其他bug。
2、JUnit
JUnit已经迅速成为Java测试的实际标准。其更大的优势是易于使用:
功能测试
所有你需要做的就是建立一个小型程序架构,用来调用程序去测试和调用预期输出来对比结果。
就是这样。
可以用一个TestSuite将多个测试组合在一起,这样允许我们关联一个项目时执行所有的测试,或者关联一个子项目,而不用加载整个应用。
也有像HttpUnit和Jakarta Cactus这样的工具用来建立复杂的测试环境,使测试web projects-servlets客户/服务器应用、执行Javascript以及表单提交变得简单容易。
3、如何使用JUnit
这里有一个小例子
让我们想象一个用一组整数来计算某种特定数学关系(加和、平均值、中位数、最大、最小)的java类。我们将忽略这一点的技术问题(当然有更好的方法来做到这一点)。我们的目标是显示这个类带给我们的预期输出。
3.1 类的开始
这里有一个我们将要测试的MathOps.java:
package org.dneary.math; public class MathOps { } |
package org.dneary.math.test; import junit.framework. *; public class MathOpsTest extends public TestCase { |