你的位置:首页 > Java教程

[Java教程]使用JUnit进行单元测试


本教程使用JUnit4.x介绍单元测试,包含创建JUnit测试,也涉及用Eclipse IDE的进行测试。

软件测试的目的

软件测试执行的软件以验证状态和行为。
软件单元测试帮助开发人员验证小段程序的逻辑是正确的。
自动化回归测试可以提高代码覆盖率,节省大量人力。

测试术语

 

单元测试执行指定代码中的功能并验证其行为或状态。

被测代码的百分比叫做覆盖率。

单元测试针对一小段代码(类,方法),又叫本地测试,应该被移除外部依赖,例如用测试框架的测试实现或者mock对象替换外部依赖。

单元测试并不适合复杂的UI或组件交互,这是集成测试的工作。

 

集成测试测试组件的行为或组件之间的集成。

性能测试使用基准测试反复测试软件组件。确保测试的代码运行在速度够快(甚至高负载下)。

 

 

行为测试(也叫交互测试)不验证的方法调用的结果,但检查方法是否用正确的输入参数调用。
状态测试验证的结果。

算法或者系统功能以状态测试为主

 

测试组织

通常单元测试是在单独的工程或源文件夹,和真正的代码独立。

测试内容是一个非常有争议的话题。一些开发人员认为代码中的每条语句都需要进行测试。在任何情况下都应该测试应用程序的关键和复杂的部分。引入新的功能,扎实的测试套件可以快速进行回归测试。

可以忽略一些简单的代码,例如getter和setter方法​​,它是简单地赋值。编写这些测试非常耗时,而且毫无意义的,因为你在测试Java虚拟机。 JVM本身已经有测试,开发最终用户的应用程序可以认为字段赋值在Java中能工作。

如果接手的工程中没有测试代码,最好为过去经常发生错误的部分写测试,这样就能集中精力去做关键部分。

Java中常见的测试框架有Junit和TestNG。

使用Junit

JUnit的4.x版使用注解来指定测试。主页参见http://junit.org/和https://github.com/junit-team/junit。

JUnit测试是类中用于测试的方法。使用注解@org.junit.Test。方法中使用的断言方法(JUnit或其他断言框架提供),检查代码的执行的实际结果与预期。

下面的代码演示JUnit测试。该测试假定MyClass类存在,并且有multiply(int, init)方法。

import static org.junit.Assert.assertEquals;import org.junit.Test;public class MyTests { @Test public void multiplicationOfZeroIntegersShouldReturnZero() {  // MyClass is tested  MyClass tester = new MyClass();  // assert statements  assertEquals("10 x 0 must be 0", 0, tester.multiply(10, 0));  assertEquals("0 x 10 must be 0", 0, tester.multiply(0, 10));  assertEquals("0 x 0 must be 0", 0, tester.multiply(0, 0)); }} 

在广泛使用的Junit命名方法是类名称下测试和“测试”加Test后缀。should常用于测试方法名,如ordersShouldBeCreatedmenuShouldGetActive,以增强可读性。Maven通过surfire插件自动生成Tests后缀的测试类。

多个测试类可以组合成test suite。运行test suite将在该suite按照指定的顺序执行所有测试类。下面演示包含两个测试类 (MyClassTest和MySecondClassTest)
的测试集,通过@Suite.SuiteClasses statement可以增加测试类。

package com.vogella.junit.first;import org.junit.runner.RunWith;import org.junit.runners.Suite;import org.junit.runners.Suite.SuiteClasses;@RunWith(Suite.class)@SuiteClasses({ MyClassTest.class, MySecondClassTest.class })public class AllTests {} 

 

test suite中也可以包含test suite。

 

通过标准的Java代码可以在Eclipse之外运行JUnit测试。Apache Maven的或Gradle框架之类的构建框架通常与持续集成服务器(如Hudson或Jenkins)组合定期自动执行测试。

org.junit.runner.JUnitCore类的runClasses()方法允许运行测试类,返回为org.junit.runner.Result对象,包含测试结果信息。

下面类演示如何运行MyClassTest。这个类将执行测试类,输出潜在错误到控制台。

package de.vogella.junit.first;import org.junit.runner.JUnitCore;import org.junit.runner.Result;import org.junit.runner.notification.Failure;public class MyTestRunner { public static void main(String[] args) {  Result result = JUnitCore.runClasses(MyClassTest.class);  for (Failure failure : result.getFailures()) {   System.out.println(failure.toString());  } }} 

以上类可以像Java类一样从命令行运行,你只需要添加JUnit Jar到classpath即可。

基本的JUnit测试代码构建

 

参考资料

Unit Testing with JUnit - Tutorial

http://azyet.github.io/2015/05/19/junitNote1/