〇、JUnit的作用
(1) 用于证明某段代码的行为确实和开发者所期望的一致;
(2) 为了让代码更加完美;
一、基本使用
(1)导入Junit的jar包(Eclipse已经集成了);
(2)新建一个类,该来要继承TestCase类;
(3)编写一个方法,方法名随意,而后在方法内创建需要的对象或者变量赋值之类的;
(4)使用断言,例如:assertEquals(“不相等”,9,8+1);该句意思为8+1是否等于9,若不等于则输出提示”不相等”,若相等则无输出,其中消息是可选的,可以不写;
(5)直接运行该类,类里的所有方法会自动执行;
二、断言分类举例
1.assertTrue/False([String message,]boolean condition);
判断一个条件是true还是false。感觉这个最好用了,不用记下来那么多的方法名。
2.fail([String message,]);
直接失败,可以有消息,也可以没有消息。
3.assertEquals([String message,]Object expected,Object actual);
判断是否相等,可以指定输出错误信息。
第一个参数是期望值,第二个参数是实际的值。
这个方法对各个变量有多种实现。在JDK1.5中基本一样。
但是需要主意的是float和double最后面多一个delta的值。
4.assertNotNull/Null([String message,]Object obj);
判读一个对象是否非空(非空)。
5.assertSame/NotSame([String message,]Object expected,Object actual);
判断两个对象是否指向同一个对象。看内存地址。
7.failNotSame/failNotEquals(String message, Object expected, Object actual)
当不指向同一个内存地址或者不相等的时候,输出错误信息。
注意信息是必须的,而且这个输出是格式化过的。
//更多断言更详细用法请找Junit API;
三、hamcrest断言
(1)Hamcrest比起JUnit的assert系列方法来,有更好的可读性,它按照参数从左到右的符合自然的顺序来展;
(2)举例:
assertThat(true,is(true)); //判断条件真假
assertThat("2",is(equalTo("2"))); //判断相等
assertThat("aBcD",is(equalToIgnoringCase("abcd"))); //不区分大小写判断
assertThat("",isEmptyOrNullString()); //是否为null或者空字符串
assertThat(null,is(nullValue())); //是否为null值
assertThat(2,is(notNullValue())); //是否不为null值
assertThat(2,greaterThan(1)); //是否大于2
assertThat(2,lessThan(1)); //是否小于1
assertThat(2.01,closeTo(2,0.01)); //是否在2+-0.01的区间内
assertThat("xyz",is(anything())); //不管为任何值都会通过
/////////////
assertThat("result", both(containsString("r")).and(containsString("u")));
//是否包含‘r’和‘u’
assertThat("result",either(startsWith("x")).or(containsString("r")));
//是否以x开头或者包含r
assertThat("result",allOf(notNullValue(),containsString("s"))); //满足里面全部条件
assertThat("result",anyOf(notNullValue(),isEmptyString())); //满足里面的任意条件
/////////////
assertThat(map,hasEntry(“key1”,”value1”)) //Map里是否有为key1-value1的键值对
assertThat(map,hasKey(“key1”)) //Map里是否有为key1的键
assertThat(map,hasValue(”value1”)) //Map里是否有为value1的值
assertThat(iterable,hasItem(“item1”)) //集合里是否包含item1
/////////////
Person my=new Person("341024","ZhangKe",32);
assertThat(my,instanceOf(Person.class)); //判断类型
assertThat(my,not(sameInstance(new Person("341024")))); //判断对象实例不相等
assertThat(my,hasToString(equalTo("341024"))); //判断toString之后的值
assertThat(my,hasProperty("name")); //判断属性名
//更多用法请查Hamcrest API
http://junit.sourceforge.net/javadoc/index.html?org/hamcrest/core/package-summary.html
四、测试套件
(1)作用:将部分的测试方法封装到一起,然后由另一个测试类来调用;
(2)使用
1.在新建的一个测试类中,添加public static Test suite()方法(该方法返回一个测试套件);
2.方法内new一个TestSuite对象实例,使用该实例的方法.addTestSuite(测试类名.class);这样就可以把指定测试类里的所有测试方法包含进来;
3.也可以使用.addTest(测试类名.suite());包含其他测试类所建立的测试套件;
4.同时使用.addTest(new 测试类名(“测试方法”));可以包含指定测试类的测试方法,用此方法之前得有一个带参构造器;这样就可以测试指定的测试方法,并且可以传递给其它测试类调用测试;
5.return TestSuite对象实例;
6.运行当前类;
五、测试的初始化方法和结束方法
(1)初始化:覆盖父类TestCase类的SetUp()方法,在每个测试方法运行之前都会运行该初始化方法;
结束方法:覆盖父类TestCase的tearDown()方法,在每个测试方法运行完毕之后都会执行该结束方法;
(3) 也可以在suite方法内new一个继承了TestSetUp类的对象,并将suite对象传入TestSetUp;而继承TestSetUp类的子类,需要在类里写SetUp()、tearDown()方法;
六、注解
(1)@Test:用在方法上面,表示这个方法是测试方法;(可加参数timeout,表示在规定的时间内得运行完,单位为毫秒;可加参数expected,值为异常.class)
(2)@Ignore:忽视此测试方法;
(3)@Before:用在方法上,执行当前类每个测试方法前,执行该方法,@After则相反;
(4)@BeforeClass:用在方法上,在执行当前类的所有测试方法前,执行当前方法,@AfterClass则相反;
(5)@SuiteClasses({测试类1.class,测试类2.class…..}):用在类上面,将多个测试类打包在一起,也可以指定suite;当使用@SuiteClasses时,得在前面加上@RunWith(Suite.class)表示使用suite运行器;
七、测试哪些内容
Right-BICEP
(1) right:结果是否正确;
(2) B:边界值(CORRECT);
C:一致性(值是否符合预期的格式)
O:有序性(一组的值是否有序或者无序)
R:区间性(值是否在一个合理的区间)
R:引用、耦合性(代码是否引用了一些不受代码本身直接控制的因素)
E:存在性(值是否存在)
C:基数性(输入输出的值是否与预期的数量相符)
T:时间性(事情是否按顺序发生?是否在正确的时间?是否及时?)
(3) I:反向测试(比如1+1=2,反向2-1=1);
(4) C:交叉检查(多种不同的方法去测试是否得到一样的结果);
(5) E:强制产生错误;
(6) P:性能
八、Mock对象
当要创建真实的对象有困难时,编写Mock对象去替代、去模拟;