美文网首页
单元测试1—JUnit

单元测试1—JUnit

作者: 我想成为创业者 | 来源:发表于2018-11-06 17:29 被阅读0次

1. 为什么使用单元测试

主要是为了方便。试想一下,如果你写了一个工具类,要查看是否符合要求,你需要运行到手机才能反馈给你结果,如果用单元测试就能大大的缩短你自我验证的时间。

2. JUnit介绍

JUnit是Java最基础测试框架,单元测试代码是放在src/test/java下面

dependencies {
    testCompile 'junit:junit:4.12'
}

Assert类中主要方法如下:

方法名 方法描述
assertEquals 断言传入的预期值与实际值是相等的
assertNotEquals 断言传入的预期值与实际值是不相等的
assertArrayEquals 断言传入的预期数组与实际数组是相等的
assertNull 断言传入的对象是为空
assertNotNull 断言传入的对象是不为空
assertTrue 断言条件为真
assertFalse 断言条件为假
assertSame 断言两个对象引用同一个对象,相当于“==”
assertNotSame 断言两个对象引用不同的对象,相当于“!=”
assertThat 断言实际值是否满足指定的条件

注意:上面的每一个方法,都有对应的重载方法,可以在前面加一个String类型的参数,表示如果断言失败时的提示。

JUnit 中的常用注解:

注解名 含义
@Test 表示此方法为测试方法
@Before 在每个测试方法前执行,可做初始化操作
@After 在每个测试方法后执行,可做释放资源操作
@Ignore 忽略的测试方法
@BeforeClass 在类中所有方法前运行。此注解修饰的方法必须是static void
@AfterClass 在类中最后运行。此注解修饰的方法必须是static void
@RunWith 指定该测试类使用某个运行器
@Parameters 指定测试类的测试数据集合
@Rule 重新制定测试类中方法的行为
@FixMethodOrder 指定测试类中方法的执行顺序

执行顺序:@BeforeClass –> @Before –> @Test –> @After –> @AfterClass

3. JUnit用法

eg: 测试时间转换工具类。

public class DateUtils {
    /**
     * 格式:2018-11-06 15:27:21
     */
    public static String getYMDHMSTime(long date) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.format(date);
    }
    public static long dateToStamp(String time) throws ParseException {
        SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
        Date date = sdr.parse(time);
        return date.getTime();
    }
}
  1. 使用JUnit测试getYMDHMSTime基础用法
public class DateUtilsTest {
    private Date mDate;
    private String mTime = "2018-11-06 15:01:21";
    private long timeStamp=1508054402000L;
    @Before
    public void setUp() throws Exception {
        System.out.println("测试开始");
        mDate = new Date();
        mDate.setTime(timeStamp);
    }
    @After
    public void tearDown() throws Exception {
        System.out.println("测试结束");
    }
    @Test
    public void getYMDHMSTime() throws Exception {
        assertEquals("测试时间",mTime,DateUtils.getYMDHMSTime(timeStamp));
    }
}

运行结果如下图所示


image.png
  1. 参数化测试
    每次测试一个方法都要去设置对应的值,不能连续用不同的值去测试一个方法。这样是不是很麻烦,这时就用到了@RunWith@Parameters
    首先在测试类上添加注解@RunWith(Parameterized.class),再创建一个由@Parameters 注解的public static方法,让返回一个对应的测试数据集合。最后创建构造方法,方法的参数顺序和类型与测试数据集合一一对应。
@RunWith(Parameterized.class)
public class DateUtilsTest1 {
    private String mTime;

    public DateUtilsTest1(String mTime) {
        this.mTime = mTime;
    }

    @Parameterized.Parameters
    public static Collection printNumbers() {
        return Arrays.asList(new String[]{
                "2018-11-06",
                "2018-11-06 15:01:21",
                "2018年11月06日 15时01分21秒"
        });
    }
    @Test
    public void getYMDHMSTime() throws Exception {
        DateUtils.dateToStamp(mTime);
    }
}

上图可以看到连续执行了三次测试,其中第二次测试没有抛出异常,测试失败!

  1. assertThat用法
    常用的匹配器整理
匹配器 说明 例子
is 断言参数等于后面给出的匹配表达式 assertThat(5, is (5));
not 断言参数不等于后面给出的匹配表达式 assertThat(5, not(6));
equalTo 断言参数相等 assertThat(30, equalTo(30));
equalToIgnoringCase 断言字符串相等忽略大小写 assertThat(“Ab”, equalToIgnoringCase(“ab”));
containsString 断言字符串包含某字符串 assertThat(“abc”, containsString(“bc”));
startsWith 断言字符串以某字符串开始 assertThat(“abc”, startsWith(“a”));
endsWith 断言字符串以某字符串结束 assertThat(“abc”, endsWith(“c”));
nullValue 断言参数的值为null assertThat(null, nullValue());
notNullValue 断言参数的值不为null assertThat(“abc”, notNullValue());
greaterThan 断言参数大于 assertThat(4, greaterThan(3));
lessThan 断言参数小于 assertThat(4, lessThan(6));
greaterThanOrEqualTo 断言参数大于等于 assertThat(4, greaterThanOrEqualTo(3));
lessThanOrEqualTo 断言参数小于等于 assertThat(4, lessThanOrEqualTo(6));
closeTo 断言浮点型数在某一范围内 assertThat(4.0, closeTo(2.6, 4.3));
allOf 断言符合所有条件,相当于&& assertThat(4,allOf(greaterThan(3), lessThan(6)));
anyOf 断言符合某一条件,相当于或 assertThat(4,anyOf(greaterThan(9), lessThan(6)));
hasKey 断言Map集合含有此键 assertThat(map, hasKey(“key”));
hasValue 断言Map集合含有此值 assertThat(map, hasValue(value));
hasItem 断言迭代对象含有此元素 assertThat(list, hasItem(element));
  1. @Rule用法
    还记得最上面我们在@Before@After注解方法中加入”测试开始”和“测试结束”的提示信息吗?假如一直需要这样的提示,需要每次在测试类中去实现它。这样比较麻烦。这时你就可以使用@Rule来解决这个问题。

自定义@Rule很简单,就是实现TestRule接口,实现apply方法:

public class MyRule implements TestRule {
    @Override
    public Statement apply(final Statement base, final Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                // evaluate前执行方法相当于@Before
                String className = description.getClassName();
                String methodName = description.getMethodName();
                System.out.println(methodName + "测试开始!");
                // 运行的测试方法
                base.evaluate();
                //evaluate后执行方法相当于@After
                System.out.println(methodName + "测试结束!");
                System.out.println("Class name: "+className +", method name: "+methodName);
            }
        };
    }
}

public class RuleTest {
    @Rule
    public MyRule ruleTest=new MyRule ();
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

使用自定义的MyRule效果如下图:


image.png

相关文章

  • Instrumentation

    1、Instrumentation单元测试框架,基于Junit;Junit是java单元测试根本 2、想要进行自动...

  • ①TestNG 与 JUnit 测试框架

    一、TestNG与JUnit的不同点: JUnit 1、JUnit只能进行单元测试2、JUnit只能使用IDE运行...

  • Junit测试

    今日内容 Junit单元测试 反射 注解 Junit单元测试: 测试分类:1. 黑盒测试:不需要写代码,给输入值,...

  • 3/26day19_JUnit单元测试_NIO

    day19_JUnit单元测试_NIO 复习 今日内容 Junit单元测试[重点] 单元测试概念 什么叫单元测试单...

  • JUnit单元测试打进jar包(eclipse)

    一、编写JUnit单元测试类 在src/main/test目录下编写Junit单元测试类。 二、编写运行JUnit...

  • Java测试工具和框架(一)

    JUnit单元测试框架(白盒测试) 1、下载 JUnit的jar包 jar包地址(junit4.10) 2、Bui...

  • Junit

    Junit 1.简介 Junit是java程序的单元测试框架,包含于xunit系列框架 2.Junit使用 2.1...

  • JUnit4.12入门实践

    内容概要: 为什么要做单元测试 JUnit简介 单元测试规范 JUnit4常用注解 JUnit4异常和超时测试 J...

  • junit4使用小技巧

    1.junit4是什么? junit4是单元测试插件. 2.使用 Junit 主要目的 可以不用编写 main 方...

  • 单元测试框架:Robolectric

    前言 前面我们介绍了单元测试框架 JUnit 和 Mockito 的使用(详情查看:单元测试框架:JUnit,单元...

网友评论

      本文标题:单元测试1—JUnit

      本文链接:https://www.haomeiwen.com/subject/qdkuxqtx.html