JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。java
从官网www.junit.org 下载 JUnit 最新版本的压缩文件。编程
笔者使用Maven(Java包管理工具)导入所须要的jar包:数组
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
复制代码
测试代码和生成代码分开放置,Maven默认目录正好符号这个要求。 框架
被测试代码放在main
下的java
目录中,junit测试代码放在test
下的java
目录中,造成一一对应关系,测试代码使用Test
开头命名。编程语言
被测试MessageDemo
代码: 函数
测试TestMessageDemo
代码: 工具
基本的已经写好了,可是如何运行测试呢? 还须要建一个运行测试的文件: 单元测试
好了,运行测试: 测试
看到true
代表测试成功,那么咱们来尝试一下测试不成功是什么状况。ui
修改TestMessageDemo
代码:
从新运行测试:
测试结果为false
,而且指明了指望输出的结果No
和实际输出的结果HelloWorld
。
什么是断言?刚开始我也很困惑,后来搞了大半天才明白断言就是"判断"。
Junit全部的断言都包含在 Assert 类中。
这个类提供了不少有用的断言方法来编写测试用例。只有失败的断言才会被记录。Assert 类中的一些有用的方法列式以下:
void assertEquals(boolean expected, boolean actual)
:检查两个变量或者等式是否平衡void assertTrue(boolean expected, boolean actual)
:检查条件为真void assertFalse(boolean condition)
:检查条件为假void assertNotNull(Object object)
:检查对象不为空void assertNull(Object object)
:检查对象为空void assertSame(boolean condition)
:assertSame() 方法检查两个相关对象是否指向同一个对象void assertNotSame(boolean condition)
:assertNotSame() 方法检查两个相关对象是否不指向同一个对象void assertArrayEquals(expectedArray, resultArray)
:assertArrayEquals() 方法检查两个数组是否相等@Test
:这个注释说明依附在 JUnit 的 public void 方法能够做为一个测试案例。@Before
:有些测试在运行前须要创造几个类似的对象。在 public void 方法加该注释是由于该方法须要在 test 方法前运行。@After
:若是你将外部资源在 Before 方法中分配,那么你须要在测试运行后释放他们。在 public void 方法加该注释是由于该方法须要在 test 方法后运行。@BeforeClass
:在 public void 方法加该注释是由于该方法须要在类中全部方法前运行。@AfterClass
:它将会使方法在全部测试结束后执行。这个能够用来进行清理活动。@Ignore
:这个注释是用来忽略有关不须要执行的测试的。beforeClass()
: 方法首先执行,而且只执行一次。afterClass()
:方法最后执行,而且只执行一次。before()
:方法针对每个测试用例执行,可是是在执行测试用例以前。after()
:方法针对每个测试用例执行,可是是在执行测试用例以后。测试用例是使用 JUnitCore 类来执行的。JUnitCore 是运行测试的外观类。要从命令行运行测试,能够运行java org.junit.runner.JUnitCore
。对于只有一次的测试运行,可使用静态方法 runClasses(Class[])
。
测试套件意味着捆绑几个单元测试用例而且一块儿执行他们。在 JUnit 中,@RunWith
和@Suite
注释用来运行套件测试。
被测试MessageDemo
代码:
新建两个测试类,用来展现套件测试:
测试TestMessageDemo
代码:
测试TestMessageDemo2
代码:
TestSuite
代码:
TestRunner
代码:
测试结果:
经过这样的方式,咱们就能够一次运行多个测试了,看起来也不是很复杂哦!
若是一个测试用例比起指定的毫秒数花费了更多的时间,那么 Junit 将自动将它标记为失败。timeout
参数和 @Test
注释一块儿使用。是否是很强大?
就像这样:
@Test(timeout=1000)
复制代码
时间单位是毫秒。
Junit 用代码处理提供了一个追踪异常的选项。你能够测试代码是否它抛出了想要获得的异常。expected
参数和 @Test
注释一块儿使用。
好比这样:
@Test(expected = ArithmeticException.class)
复制代码
Junit 4 引入了一个新的功能参数化测试。参数化测试容许开发人员使用不一样的值反复运行同一个测试。你将遵循 5 个步骤来建立参数化测试。
@RunWith(Parameterized.class)
来注释 test 类。@Parameters
注释的公共的静态方法,它返回一个对象的集合(数组)来做为测试数据集合。一旦每一行数据出现测试用例将被调用。
被测试代码PrimeNumberChecker
:
测试代码TestPrimeNumberChecker
:
测试运行代码TestRunner
:
测试运行结果: