本教程使用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常用于测试方法名,如ordersShouldBeCreated
,menuShouldGetActive
,以增强可读性。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/
原标题:使用JUnit进行单元测试
关键词: