单元测试又名模块测试,是对软件设计最小单元进行白盒测试验证,一般在修改代码后都需要执行一次单元测试,以确保程序功能正确。
现在主流开源软件提交代码合入请求时都需要提供相应的单元测试代码,越来越多的大型企业对其产品的单元测试代码覆盖率有着明确的要求(常见覆盖率要求50% ~ 80%)。
软件准备
我们以Maven构建Java程序为例,只需在pom.xml中添加对JUnit 4的依赖即可:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
单元测试的一般性约束
- 代码目录
单元测试代码一般存放在项目的src/test/java
目录下 - 命名约束:
- 测试类命名:
测试类名以Test结尾,例如
LogWriterTest.java
- 测试方法命名:
测试类中的测试方法命名一般为“test” + “待测方法/功能/异常”,例如:
public void testWrite()
- 测试类命名:
JUnit单元测试的方法注解
-
@Test
表示该方法是一个测试方法,在执行mvn test
时会被自动执行。 -
@Test(timeout = 100)
该方法执行时间超过100毫秒时,测试将会失败。 -
@Test(expected = xxxException.class)
该方法期望执行过程中抛出指定异常,否则测试将会失败。 -
@BeforeClass
用于注解静态方法,方法会在测试类实例化前被调用一次,一般用于初始化资源。 -
@Before
测试方法每次执行前,都会调用该方法一次。 -
@AfterClass
用于注解静态方法,方法会在所有测试用例结束后被调用一次,一般用于释放资源。 -
@After
测试方法每次执行后,都会调用该方法一次。 -
@Ignore
忽略该测试方法(静态忽略)。如用于注解测试类,则该类中所有测试方法都不会被执行。
如果需在运行时动态决定是否要忽略测试方法,可借助
Assume.assumeTrue
方法实现。
Assert断言
断言用于标识某一具体状态下程序验证与开发者预期结果是否一致,如果断言成功则测试方法可以继续执行,否则测试方法将会失败。
JUnit提供了多种断言方法:fail
、assertTrue
、assertEquals
、assertNull
,示例如下:
assertTrue(list.isEmpty());
示例程序
被测代码:HelloWorld.java
public class HelloWorld {
public String sayHello(String name) {
return "hello:" + name;
}
}
测试代码:HelloWorldTest.java
import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
public class HelloWorldTest {
private static HelloWorld helloWorld;
@BeforeClass
public static void initHelloWorld() {
helloWorld = new HelloWorld();
}
@Test
public void testSayHello() {
assertEquals("hello:world", helloWorld.sayHello("world"));
}
}
使用mvn test
命令执行测试:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running HelloWorldTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.129 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
网友评论