欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

开发人员必备的技能--Junit测试

程序员文章站 2022-03-19 14:59:46
...
对于程序员来说,仅仅让程序通过编译是不够的,还要做到基本的测试,保证写的代码的正确性。单元测试,集成测试,黑盒测试,白盒测试,对于学过软件工程的计算机专业的人来说这些都很熟悉,但是我相信很多人都并不会真的做测试,其中有各种各样的理由。但是单元测试是一个程序员必须掌握的技能。而且以后在重构,测试的时候你会发现Junit测试真的是一件非常必要非常便利的事情。而且很能提高自己的工作效率。
虽然说android中有很多优秀的测试框架,但是由于Junit的简单性,用来作为入门学习非常合适。
废话不多说,我们开始一起回顾一下怎么使用Junit测试。
###the first Junit
第一个测试基于Eclipse,我们先写一个用于完成加法操作的类,代码如下:
public interface Adder {
    int add(int a,int b);
}
public class AddImpl implements Adder{
    @Override
    public int add(int a, int b) {
        // TODO Auto-generated method stub
        return a+b;
    }

}

接下来生成用于单元测试的类,可以直接右键新建一个junit测试用例。见图1:
开发人员必备的技能--Junit测试
图1

开发人员必备的技能--Junit测试
图2
如图2,需要将Junit4的libray加载进来.编写的测试用例类是下面的:

public class AdderTestCase{
    AddImpl adder;

    @Test
    public void test() {
        adder = new AddImpl();
        assertEquals(1, adder.add(0, 1));
        assertEquals(1+Integer.MAX_VALUE, adder.add(Integer.MAX_VALUE, 1));
        assertEquals(Integer.MAX_VALUE-1, adder.add(Integer.MAX_VALUE, -1));
        assertEquals(10, adder.add(11, -1));
        assertEquals(10, adder.add(9, 1));
//      fail("Not yet implemented");
    }
}

junit4使用注解在注解方法里面可以写测试用例,junit4比junit3更简单,更方便,想要了解两者的不同可以看这里
Junit的断言和失败提示
assertEquals断言
这是应用非常广泛的一个断言,它的作用是比较实际的值和用户预期的值是否一样,assertEquals在JUnit中有很多不同的实现,以参数expected和actual都为Object类型的为例,assertEquals定义为:
static public void assertEquals(String message, Object expected, Object actual) {
if (expected== null&& actual == null)
return;
if (expected != null&& expected.equals(actual))
return;
failNotEquals(message, expected, actual);
}
其中,expected为用户期望某一时刻对象的值,actual为某一时刻对象实际的值。如果这两值相等的话(通过对象的equals方法比较),说明预期是正确的,也就是说,代码运行是正确的。assertEquals还提供了其它的一些实现,例如整数比较,浮点数的比较等等。

assertTrue与assertFalse断言
assertTrue与assertFalse可以判断某个条件是真还是假,如果和预期的值相同则测试成功,否则将失败,assertTrue的定义如下:
staticpublic void assertTrue(String message, boolean condition) {
if (!condition)
fail(message);
}
“condition”表示要测试的状态,如果“condition”的值为false,则测试将会失败。

assertNull与assertNotNull断言
assertNull与assertNotNull可以验证所测试的对象是否为空或不为空,如果和预期的相同则测试成功,否则测试失败,assertNull定义为:
staticpublic void assertNull(String message, Objectobject) {
assertTrue(message,object == null);
}
其中,object就是要测试的对对象,如果object为空,该测试成功,否则失败,是不是很简单。

assertSame与assertNotSame断言
assertSame和assertEquals不同,assertSame测试预期的值和实际的值是否为同一个参数(即判断是否为相同的引用)。assertNotSame则测试预期的值和实际的值是不为同一个参数。assertSame的定义为:
static publicvoid assertSame(String message, Object expected, Object actual) {
if (expected== actual)
return;
failNotSame(message, expected, actual);
}
而assertEquals则判断两个值是否相等,通过对象的equals方法比较,可以相同引用的对象,也可以不同。

fail断言
“fail”断言能使测试立即失败,这种断言通常用于标记某个不应该被到达的分支。例如assertTrue断言中,condition为false时就是正常情况下不应该出现的,所以测试将立即失败,fail的定义为:
staticpublic void fail(String message) {
throw new AssertionFailedError(message);
}
当一个失败或者错误出现的时候,当前测试方法的执行流程将会被中止,但是位于同一个测试类中的其他测试将会继续运行。

运行多个测试类–TestSuite

@RunWith(Suite.class)
@Suite.SuiteClasses({
    AdderTestCase.class,
    DividerTestCase.class
})
public class MathTestSuite {

}

其中AdderTestCase.class是上面的单元测试类,另一个是类似的用于测试除法的类。

需要测试哪些内容?
(1)边界条件
边界条件可以概括为一个词:Correct,分别如下:

  1. 一致性(Conformance):值是否和预期一致;如两个EdiText分别需要输入两个整型数据,但是用户输入的不是整型确实文字怎么处理;
  2. 有序性(Ordering):值是否像期望的那样是无序或者有序的;
  3. 区间性(Range):值是否位于合理的最小值和最大值之间。eg.圆的角度为1~360度,用户输入500的时候怎么处理
  4. 基数性(Cardinatity):是否恰好有足够的值。这里的基数指的是计数,测试方法是否可以正确计数,并检查最后的计数值;
  5. 存在性(Existence):值是否存在。测试方法是否可以处理值不存在的情况,eg。对象为null的情况下得到的结果是什么;
  6. 时间性(Time):所有事情的发生是否是有序的,是否在正确的时刻、是否恰好及时。与时间相关的问题有:相对时间(时间上的顺序)、绝对时间(消耗的时间和时钟上的时间)、并发问题。eg、方法调用的时间顺序、代码超时、不同的本地时间、多线程同步等

(2)覆盖执行路径重点内容