单元测试的好处
1. 让你写出更好的代码:职业高内聚、低耦合而且接口设计合理的代码才易于测试;
2. 让你在修改代码时更有信心。
JUnit4 注解
- @Test (expected = Exception.class) 表示预期会抛出Exception.class 的异常
- @Ignore 含义是“某些方法尚未完成,暂不参与此次测试”。这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把@Ignore注解删去,就可以进行正常的测试。
- @Test(timeout=100) 表示预期方法执行不会超过 100 毫秒,控制死循环
- @Before 表示该方法在每一个测试方法之前运行,可以使用该方法进行初始化之类的操作
- @After 表示该方法在每一个测试方法之后运行,可以使用该方法进行释放资源,回收内存之类的操
- @BeforeClass 表示该方法只执行一次,并且在所有方法之前执行。一般可以使用该方法进行数据库连接操作,注意该注解运用在静态方法。
- @AfterClass 表示该方法只执行一次,并且在所有方法之后执行。一般可以使用该方法进行数据库连接关闭操作,注意该注解运用在静态方法。
TestSuite
如果有多个测试类, 可以合并成一个测试套件进行测试, 运行一个 Test Suite, 那么就会运行在这个 Test Suite 中的所用的测试.
例如:
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class)
@SuiteClasses({JUnitTest1.class, JUnitTest2.class})
public class AllTests { }
这里定义了一个 Test Suite,这个Test Suite包含了两个测试类:JUnitTest1和JUnitTest2,因此运行这个Test Suite时,就会自动运行这两个测试类了。
IDE中自动生成测试类
一般来说IDE都提供了自动生成测试类的功能,当然了,里面的具体测试代码还是要自己写的。
比如在IDEA中就是,在 HelloWorld 类名上按下 alt + enter 后, 就可以自动生成测试类了。
使用断言而不是Print语句
许多新手开发人员习惯于在每行代码之后编写System.out.println语句来验证代码是否正确执行。这种做法常常扩展到单元测试,从而导致测试代码变得杂乱。除了混乱,这需要开发人员手动干预去验证控制台上打印的输出,以检查测试是否成功运行。更好的方法是使用自动指示测试结果的断言。
Junit3和Junit4都提供了一个Assert类(虽然package不同,但是大致差不多)。Assert类中定义了很多静态方法来进行断言。列表如下:
assertTrue(String message, boolean condition) 要求condition == true
assertFalse(String message, boolean condition) 要求condition == false
fail(String message) 必然失败,同样要求代码不可达
assertEquals(String message, XXX expected,XXX actual) 要求expected.equals(actual)
assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual)
assertNotNull(String message, Object object) 要求object!=null
assertNull(String message, Object object) 要求object==null
assertSame(String message, Object expected, Object actual) 要求expected == actual
assertNotSame(String message, Object unexpected,Object actual) 要求expected != actual
assertThat(String reason, T actual, Matcher matcher) 要求matcher.matches(actual) == true
测试负面情景和边缘情况
通常,开发人员会花费大量的时间和精力编写测试用例,以确保应用程序按预期工作。然而,测试负面测试用例也很重要。负面测试用例指的是测试系统是否可以处理无效数据的测试用例。例如,考虑一个简单的函数,它能读取长度为8的字母数字值,由用户键入。除了字母数字值,应测试以下负面测试用例:
- 用户指定非字母数字值,如特殊字符。
- 用户指定空值。
- 用户指定大于或小于8个字符的值。
类似地,边界测试用例测试系统是否适用于极端值。例如,如果用户希望输入从1到100的数字值,则1和100是边界值,对这些值进行测试系统是非常重要的。