1、静态引入
jdk1.5可以引入一个静态类的所有方法。引入以后在类中直接使用静态方法,无须加类名.
语法:
import static org.junit.Assert.*;
2、assertThat:hamcrest断言
assertThat 可以替代其他所有的assert方法,在后续的测试中,建议使用assertThat方法。
assertThat匹配符:一般匹配符,字符匹配符,数值匹配符,collection匹配符
一般匹配符:
allOf:所有的条件都满足才通过,相当于“与”(&&)
anyOf:所有的条件只要有一个满足即通过,相当于“或”(||)
anything:无论什么条件,都是通过
is:前面待测的object等于后面给出的object,则测试通过。
not:与is相反,前面给出的待测的object不等于后面给出的object,测试才通过。
字符串相关的匹配符:
containsString:前面待测的字符串包含后面给出的字符串,则测试通过。。
endsWith:前面待测的字符串以后面给出的字符串结尾,则测试通过。
startsWith:前面待测的字符串以后面给出的字符串开头,则测试通过。
equalTo:前面待测的对象等于后面给出的对象则测试通过。可用于测试数值之间,字符串之间和对象之间是否相等,相当于Ojbect的equals方法
equalToIgnoringCase:忽略大小写
equalToIgnoringWhiteSapce:忽略头尾的空格,注意:字符串内部的空格不能忽略。
数值之间匹配符:
closeTo:在范围内
greaterThan:
lessThan:
greaterThanOrEqualTo:
lessThanOrEqualTo:
Collection匹配符:
hasEntry:map对象包含给出的key和value
hasItem:迭代对象包含给出的元素
hasKey:map对象包含给出的key
hasValue:map对象包含给出的value
3、failures和errors
failures表示是测试失败,即受测的方法没有按照设计实现
errors表示测试代码存在错误,或者系统运行环境出现问题。
4、Annotation
@Test(timeout,excepted)
被@Test修饰的方法,在junit中会被自动执行,只能修饰public void 方法。两个参数timeout表示该方法执行的时间,必须在该时间内执行完毕才通过。excepted参数指定抛出的异常,该方法必须抛出指定的异常,才能测试通过。
@Ignore
暂时忽略需要测试的方法。
@Before
被该注释修饰的方法,在每个测试方法执行之前执行一次。该注释只能修饰public void 方法
@After
被该注释修饰的方法,在每个测试方法执行之后执行一次。该注释只能修饰public void 方法
@BeforeClass
被该注释修饰的方法,在所有测试方法执行之前执行一次。该注释只能修饰public static void 方法
@AfterClass
被该注释修饰的方法,在所有测试方法执行之后执行一次。该注释只能修饰public static void 方法
BeforeClass和AfterClass一般用于申请和释放比较费时的资源的情况下。
5、Junit最佳实践
不要用testcase的构造方法初始化Fixture,而用setup()和tearDown()方法
不要依赖或假定测试运行的顺序
避免编写有副作用的TestCase,例如数据提交
继承一个测试类时,记得调用父类的setup方法和tearDown方法
将测试代码和工作代码放在一起,同步编译和更新
测试类和测试方法应该有一致的命名方案
确保测试与时间无关,不要用过期的数据进行测试。
尽可能利用junit提供的fail和assert以及异常处理方法,使代码更加简洁。
不要硬性规定数据文件的路径
每次只测试一个对象
每个单元测试等同于一个@Test方法。(不要把多个测试塞进一个方法中)
在测试方法中一定要包含assert断言,除非在方法中抛出异常
测试任何可能失败的情况
6、Junit Test Runner
如果想指定Junit使用特定的test Runner,使用@RunWith注释进行指定。例子如下:
@RunWith(value=org.junit.internal.runners.JUnit38ClassRunner.class)
如果什么也没指定,则使用默认的Runner
7、Test Suit
可以组合多个test classes进一个suit,也可以组合多个test suits进一个suit
示例:
@RunWith(value=org.junit.runners.Suite.class)
@SuiteClasses(value={FolderConfigurationTest.class,
FileConfigurationTest.class})
public class FileSystemConfigurationTestSuite {
}
两个概念:测试对象和领域对象(Test Object 和 Domain Object)