JUnit断言
-
JUnit提供了一些辅助函数,用来帮助我们确定被测试的方法是否按照预期正常运行,这些辅助函数我们称之为断言。
-
JUnit4所有的断言都在org.junit.Assert类中,Assert类包含一组静态的测试方法,用于验证期望值excepted与实际值actual之间的逻辑关系是否正确,用于验证测试是否通过。
-
使用是通常在Java代码加入如下import static org.junit.Assert.*
-
assertEquals([message],excepted,actual)
验证期望值与实际值是否相等,不相等则表示测试未通过,并抛出异常AssertError,message表示自定义错误信息,为可选参数;相等则表示测试通过。示例代码片段: String s1="test"; String s2="test"; assertEquals(s1,s2);
-
assertNotEquals([message],unexcepted,actual)
验证测试结果值不会是某个值(unexcepted) -
assertArrayEquals([message],excepteds,actual)
验证两个数组是否相同 -
assertSame([message],excepted,actual)
验证期望对象引用与实际对象引用是否指向同一个对象int s1="test"; int s2="test"; assertSame(s1,s2);//结果pass int[] array1={1,2,3}; int[] array2={1,2,3}; assertSame(array1,array2)//结果fail
-
assertNotSame([message],excepted,actual)
验证期望对象引用与实际对象引用是否指向不同对象 -
assertNull([message],object)
断言某个对象为null -
assertNotNull([message],object)
断言某个对象不为null -
asssertTrue([message],condition)
验证条件为真 -
assertFalse([message],condition)
验证条件为假
更为灵活的断言
Hamcrest类库
-
Hamcrest类库中的核心方法assertThat
- JUnit结合Hamcrest提供了一个全新的断言语法:assertThat,结合Hamcrest提供的匹配符,可以表达全部的测试思想
- 使用gradle引入JUnit4.12时已经包含了hamcrest-core.jar、hamcrest-library.jar、hamcrest-integration这三个包,所以我们无需额外再单独导入hamcrest相关类库。
- 需要加入对hamcrest包的依赖,在app目录下的build.gradle的dependencies下添加如下内容:
testImplementation 'org.hamcrest:hamcrest-library:1.3'
- 字符串相关匹配符:
- startsWith
- endsWith
- containsString
- equalToIgnoringCase
- equalToIgnoringWhiteSpace
- 数值相关匹配符
- closeTo
- greaterThan
- lessThan
- lessThanOrEqualTo
- greaterThanOrEqualTo
- 集合相关匹配符
- hasEntry
- hasKey
- hasValue
- hasItem
- hasItems
- hasItemInArray
- 对象相关匹配符
- notNullValue
- nullValue
- sameInstance
- instanceOf
- hasProperty
- 组合等逻辑匹配符
- allOf
- anyOf
- both
- either
- is
- isA
- not
- any
- anything
//示例: package com.example.myapplication; import org.junit.Test; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.Matchers.equalToIgnoringWhiteSpace; import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; public class TestJUnitLifeCycle { @Test public void test3(){ assertThat("android studio", startsWith("and")); assertThat("android studio", endsWith("dio")); assertThat("android studio", containsString("android")); assertThat("android studio", equalToIgnoringCase("ANDROID studio")); assertThat("android studio", equalToIgnoringWhiteSpace(" android studio ")); } }
JUnit设定方法执行顺序
- 当我们运行一个测试类里所有测试方法时,测试方法的执行顺序并不固定
- JUnit4提供@FixMethodOrder注解来配置执行顺序,其可选值有:
- MethodSorters.NAME_ASCENDING
- MethodSorters.DEFAULT
- MethodSorters.JVM
package com.example.myapplication;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestExecOrder {
@Test
public void testD(){
System.out.println("DDDDD");
}
@Test
public void testA(){
System.out.println("AAAAA");
}
@Test
public void testB(){
System.out.println("BBBBB");
}
@Test
public void testC(){
System.out.println("CCCCC");
}
}
TestRunners
- @RunWith
- 通过@RunWith注解,可以为我们的测试用例选定一个特定的Runner来执行
- 默认的test runner是BlockJUnit4ClassRunner
Suite测试套件
- 如果有三个测试类,使用Suite编写一个TestSuite类,我们可以将3个测试类组合起来一起执行
//测试套件示例
@RunWith(Suite.class)
@Suite.SuiteClasses({
TestLogin.class,
TestLogout.class,
TestUpdate.class
})
public class TestSuite{
//不需要有任何实现方法
}
- 测试套件还可以嵌套
@RunWith(Suite.class)
@Suite.SuiteClasses(TestSuite.class)
public class TestSuite2{
}