首先来复习一下几个重要知识点,然后接着进行一些介绍。在上一篇文章中,我曾经贴过下面这张图片:

在Which method stubs would you like to create?这里,现在结合4个标注的含义来说明一下:

@BeforeClass  标注的方法会在类加载的时候执行一次,且仅此一次,该方法必须是public和static的

@AfterClass   标注的方法会在类销毁的时候执行一次,且仅此一次,该方法必须是public和static的

@Before  标注的方法会在每个测试方法执行前先执行一次

@After 标注的方法会在每个测试方法执行结束后执行一次

以上四个标注,对应了那个勾选列表中的四个方法,可以在创建测试类时根据具体情况进行勾选。

在测试过程中,可能需要针对一个方法的不同临界值进行多组数据的测试。下面给出这种情况下的测试方法:

在上一遍文章中的例子 中,Calculator类的square方法需要针对正数、负数、零3种情况进行测试。所以我们如下进行,首先在Calculator类上右键new一 个JUint Test Case,起名为CalculatorSquareTest,然后该类的代码修改如下:

 1 package org.logback.test;
2
3 import static org.junit.Assert.*;
4
5 import java.util.Arrays;
6 import java.util.Collection;
7
8 import org.junit.Before;
9 import org.junit.Test;
10 import org.junit.runner.RunWith;
11 import org.junit.runners.Parameterized;
12 import org.junit.runners.Parameterized.Parameters;
13
14 @RunWith(Parameterized. class )
15 public class CalculatorSquareTest {
16
17 private static Calculator example = new Calculator();
18
19 private int param;
20
21 private int result;
22
23 @Parameters//定义测试数据集合,前者param后者result
24 public static Collection data(){
25 return Arrays.asList(new Object[][]{
26 {2,4},
27 {0,0},
28 {-3,9},
29 });
30 }
31
32 @Before
33 public void setUp() throws Exception {
34 example.clear();
35 }
36
37 @Test
38 public void testSquare() {
39 example.square(param);
40 assertEquals(result, example.getResult());
41 }
42
43 //构造函数,对变量进行初始化,注意参数顺序应与定义的测试集合的参数顺序一致
44 public CalculatorSquareTest(int param,int result){
45 this.param = param;
46 this.result = result;
47 }
48
49 }

14行设置了本测试类的运行器为Parameterized.class,因为此类需要多组数据,所以不能采用默认的运行器。

23-30行是定义测试数据集合,此处的2元组数据的顺序要统一,并且与构造函数的参数顺序要一致。

44-47行是构造函数,通过定义的数据集合和构造函数,将要测试的情况传递给测试类,然后进行测试。

也就是说,执行了3次该测试类,依次采用了数据集合中的数据。此例中数据集合的顺序顺序为{处理值,预期处理结果}。

结果如下:

可以看到runs那里是3/3。

OK,此时我们的测试类数量就已经上升为2个了,如果分别运行2个测试类再观察结果可能比较麻烦。或者有人觉得这还不算什么,那要是有10个测试类呢?所以就引出了打包测试的概念,我们可以通过JUnit提供的机制,一次性把之前的2个测试类都执行了。

在Calculator类上右键new一个JUnit Test Case,方法处什么都不勾选,然后点击Finish。将代码改为如下:

 1 package org.logback.test;
2
3 import static org.junit.Assert.*;
4
5 import org.junit.Test;
6 import org.junit.runner.RunWith;
7 import org.junit.runners.Suite;
8
9 @RunWith(Suite.class)
10 @Suite.SuiteClasses({
11 CalculatorSquareTest.class,
12 CalculatorTest.class
13 })
14 public class CalculatorAllTest {
15 }

9行指定了此测试类的运行器

10-13行指定了要同时运行哪些测试类

该测试类并无实际实现

下面只要将此类run as JUnit Test即可,得到结果如图所示:

可以发现,我们上一遍文章的测试类,和这篇文章的测试类都同时执行了,并且列出了详细结果。
以上就是我对于JUnit的研究结果,我感觉一般的工作这些技巧就可以应付了,当然如果哪位Geek有更高级方便的用法也欢迎分享。

PS:

我存在过,我遇见过,我失败过。 有些路,明明有坑却从没人放警示牌。有些事,明明是错的却没人去管。有些话,明明应该告诉后来人却没人去说。
既然没人做,那就我来吧。希望我曾经历过的挫折不再重现于后来人。希望传承能够不是只挂在嘴边。希望人模人样的“人”能够真正做人。

java知识积累——单元测试和JUnit(二)的更多相关文章

  1. Java知识积累——单元测试和JUnit(一)

    说起单元测试,刚毕业或者没毕业的人可能大多停留在课本讲述的定义阶段,至于具体是怎么定义的,估计也不会有太多人记得.我们的教育总是这样让人“欣 慰”.那么什么是单元测试呢?具体科学的定义咱就不去关心了, ...

  2. 打造一款 刷Java 知识的小程序(二)

    学习Java的神器已上线,面向广大Java爱好者! 之前写的一篇:打造一款 刷Java 知识的小程序(一) 一.第二版做了什么? 第一版小程序只具有初级展示功能,知识点都是hardcode在代码里面的 ...

  3. 项目积累——JAVA知识积累

    调用天气: <iframe src="http://www.thinkpage.cn/weather/weather.aspx?uid=&c=CHXX0008&l=zh ...

  4. JAVA知识积累 给HttpClient添加Socks代理

    本文描述http client使用socks代理过程中需要注意的几个方面:1,socks5支持用户密码授权:2,支持https:3,支持让代理服务器解析DNS: 使用代理创建Socket 从原理上来看 ...

  5. Java知识积累3-XML的DOM解析修改和删除方法

    import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;import jav ...

  6. Java知识积累-XML的DOM解析修改和删除方法

    import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;import jav ...

  7. Java知识积累2-StringReverse实现文字(单词)倒叙输出

    package String; import java.util.Stack;import java.util.StringTokenizer; public class StringReverse ...

  8. Java知识积累1-StringAlign实现文字居中左右对齐

    import java.text.*;public class StringAlign extends Format{ public static final int JUST_LEFT='l'; / ...

  9. JAVA知识积累 JSP第一篇【JSP介绍、工作原理、生命周期、语法、指令、行为】

    什么是JSP JSP全名为Java Server Pages,java服务器页面.JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在! 为什么需要JSP JSP是为了简化Servle ...

随机推荐

  1. Memcache+Tomcat9集群实现session共享(非jar式配置, 手动编写Memcache客户端)

    Windows上两个tomcat, 虚拟机中ip为192.168.0.30的centos上一个(测试用三台就够了, 为了测试看见端口所以没有使用nginx转发请求) 开始 1.windows上开启两个 ...

  2. 高效开发Android App的10个建议(转)

    假如要Google Play上做一个最失败的案例,那最好的秘诀就是界面奇慢无比.耗电.耗内存.接下来就会得到用户的消极评论,最后名声也就臭了.即使你的应用设计精良.创意无限也没用. 耗 电或者内存占用 ...

  3. Week2 Team Homework: 必应输入法的软件分析和用户需求调查

    一.选题和目标人群的确定 4月8日,微软宣布推出首款整合搜索的中文云输入法“必应Bing输入法”,其前身是“英库拼音输入法”.微软宣称,该输入法界面干净,无广告.无插件,即使是在性能相对不高的电脑上, ...

  4. iOS - 指定视图的圆角个数-b

    平常设置视图的圆角最普遍的就是设置四个角的,方法也就是一句代码解决: view.layer.cornerRadius = 10; 四个圆角 但有时需求会是指定某个,或者特定哪几个角设置圆角,所以我们需 ...

  5. android开发之socket快传文件以及消息返回

    应用场景: 两台android机器:一台自建wifi热点,另一台搜索到,连接该wifi热点.之后再通过socket传递消息,文件等,当服务器端接收到消息之后会返回对应的应答消息: 注意点:接收到消息之 ...

  6. sublime package

    Sublime text 2/3 中 Package Control 的安装与使用方法 2014/05/23前端工具, 工具, 教程, 软件4条评论 Package Control 插件是一个方便 S ...

  7. c++ linux 下的调试工具及用法

    1当程序出现core的时候: gdb out[your program] core.out.45726.1431954543 可以看到程序崩溃时候的堆栈信息. valgrind ./out 由于val ...

  8. dll 入口函数

    http://support.microsoft.com/kb/815065/zh-cn // SampleDLL.cpp // #include "stdafx.h" #defi ...

  9. PE文件结构详解(二)可执行文件头

    在PE文件结构详解(一)基本概念里,解释了一些PE文件的一些基本概念,从这篇开始,将详细讲解PE文件中的重要结构. 了解一个文件的格式,最应该首先了解的就是这个文件的文件头的含义,因为几乎所有的文件格 ...

  10. uLua 学习笔记 之一 lua脚本 打包与读取

    最近要学习热更新,搜了下,选择了ulua这个插件,本人也是新人.对这个插件也是一知半解,不过幸好加了专门讨论这一块的群,这个群的技术氛围还是很浓重的,特别是已经形成了一套自己的lua学习框架.最近周末 ...