JUnit最佳实践



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class CardServiceTest {
    /**
     * 最佳实践:
     * 1. 测试方法上必须使用@Test进行修饰
     * 2. 测试方法必须使用public void 进行修改,不能带任何的参数
     * 3. 新建一个源代码目录存放我们的测试代码,测试类的包和被测试的一致
     * 4. 测试单元中每个方法必须独立测试,不能有任何依赖
     * 5. 测试类使用Test作为后缀,测试方法使用Test作为后缀(看个人喜好) 
     */
     
    @Test
    public void addTest(){
        // 使用断言
        assertEquals(6new CardService().add(3,3));
    }
     
}
如下目录结构
        

运行结果说明


        
        1. Failure 一般由于单元测试使用的断言方法判断失败所引起的,就是说程序输出的结果和我们预期的不一样。
        2. Errors 是由代码异常引起的,可能是测试代码本身错误或是被测试代码中的bug。
        3. 一切都成功进度条显示绿色

JUnit常用注解说明

1. @BeforeClass修饰的方法会在所有方法被调用前执行,该方法是静态的,测试类被加载就会运行它,而且内存中只有一个实例存在,它比较适合加载配置文件等。
2. @AfterClass所修饰的方法通常用来对资源的清理,如管理数据库的连接等
3. @Before和@After会在每个测试方法的前后各执行一次。
4. @Test 将一个普通的方法修饰成一个测试方法
    @Test(expected=XX.class) -预测的异常
    @Test(timeout=2000) - 超时,单位毫秒
5. @Ignore 会被测试运行器忽略
6. @RunWith 可以更改测试运行器 org.junit.runner.Runner
7. @FixMethodOrder(MethodSorters.NAME_ASCENDING) // 类注解,设置运行类时方法的执行顺序规则,具体参数说明查看MethodSorters源码

JUnit4中的测试套件



1
2
3
4
5
6
7
8
9
10
@RunWith(Suite.class)
@Suite.SuiteClasses({ EquipmentServiceTest.class, UserServiceTest.class })
public class CardServiceTest {
    /**
     * 测试套件就是组织测试类一起运行
     * 1. 写一个作为测试套件的入口类,这个类里不包含其他方法
     * 2. 更改测试类的运行器Suite.class
     * 3. 将要测试的类作为数组传入到Suite.SuiteClass({})
     */
}   

JUnit4的参数化设置


        Junit 4 引入了一个新的功能参数化测试。参数化测试允许开发人员使用不同的值反复运行同一个测试。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@RunWith(Parameterized.class)
public class CardServiceTest {
    /**
     * 1. 更改默认的测试运行器为@RunWith(Parameterized.class)
     * 2. 为每一列测试数据创建一个实例变量。
     * 3. 声明一个返回值为Collection的公共静态方法,并使用@Parameters进行修饰,它返回一个对象的集合(数组)来作为测试数据集合。
     * 4. 为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
     */
    int expected = 0;
    int input1 = 0;
    int input2 = 0;
 
    @Parameters
    public static Collection<Object[]> t() {
        return Arrays.asList(new Object[][] { { 312 }, { 422 } });
    }
 
    public CardServiceTest(int expected, int input1, int input2) {
        this.expected = expected;
        this.input1 = input1;
        this.input2 = input2;
    }
 
    @Test
    public void addTest() {
        // 会运行两次,以下的变量分别对应的是上面@Parameters声明的数值{ 3, 1, 2 }和 { 4, 2, 2 },所以输出两次true
        assertEquals(expected, new CardService().add(input1, input2));
    }
}


参考:慕课网    
6. @RunWith 可以更改测试运行器 org.junit.runner.Runner
7. @FixMethodOrder(MethodSorters.NAME_ASCENDING) // 类注解,设置运行类时方法的执行顺序规则,具体参数说明查看MethodSorters源码

Java 单元测试 JUnit4 快速入门的更多相关文章

  1. Java程序员快速入门Go语言

    这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...

  2. 原!!关于java 单元测试Junit4和Mock的一些总结

    最近项目有在写java代码的单元测试,然后在思考一个问题,为什么要写单元测试??单元测试写了有什么用??百度了一圈,如下: 软件质量最简单.最有效的保证: 是目标代码最清晰.最有效的文档: 可以优化目 ...

  3. 【Java】Spring快速入门(一)

    Spring介绍 Spring可以轻松创建Java企业应用程序.它提供了在企业环境中使用Java语言所需的一切,支持Groovy和Kotlin作为JVM上的替代语言,并可根据应用程序的需要灵活地创建多 ...

  4. Java 高级 --- 多线程快速入门

    这世上有三样东西是别人抢不走的:一是吃进胃里的食物,二是藏在心中的梦想,三是读进大脑的书 多线程快速入门 1.线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组 ...

  5. 从net到java:MyBatis快速入门

    第一:这不是net与java的对比,只是我学习java相关知识梳理的笔记. 第二:这也没有否认net,只是现在的工作需要自己会java. 第三:这不深入.只是我看了些官网和网上的视频,算是入门的总结. ...

  6. JUnit4快速入门

    JUnit最佳实践 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class CardServiceTest {     /**      * 最佳 ...

  7. Java基础组件快速入门

    最近需要上线很多新的JAVA项目,然而很多JAVA的相关库都不太熟悉,项目实现起来遇到了不小阻力,熬了好几天夜.现在手头的工作基本完成了,因此打算好好来归纳下java的相关工具库,将来需要借助你们,好 ...

  8. Java核心编程快速入门

    Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示. 反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的 ...

  9. 【Java】Junit快速入门

    Junit介绍 JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个. JUnit ...

随机推荐

  1. [COGS 2258][HZOI 2015]复仇的序幕曲

    Description 你还梦不梦痛不痛,回忆这么重你怎么背得动 ----序言 当年的战火硝烟已经渐渐远去,可仇恨却在阿凯蒂王子的心中越来越深 他的叔父三年前谋权篡位,逼宫杀死了他的父王,用铁血手腕平 ...

  2. [USACO 03FEB]Farm Tour

    Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...

  3. [BeiJing2011]元素

    Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔 法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力 ...

  4. ●POJ 2079 Triangle

    题链: http://poj.org/problem?id=2079 题解: 计算几何,凸包,旋转卡壳 复杂度O(N^2),(O(N)什么的就不说了,我觉得我看过的O(N)方法正确性都有问题,虽然有些 ...

  5. POJ 3415 不小于k的公共子串的个数

    Common Substrings Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9248   Accepted: 3071 ...

  6. Visual Studio 2015 无法命中断点

    新安装操作系统后发现,vs2015无法命中断点. 在项目中设置生成调试信息:FULL   即可.

  7. of_alias_get_id 函数与设备树中aliases节点的关系【转】

    转自:https://blog.csdn.net/qq_30145093/article/details/78053823?locationNum=10&fps=1 转自http://www. ...

  8. 使用webgl(three.js)搭建一个3D建筑,3D消防模拟——第三课

    项目背景 消防安全一直是各大都市关注的重要课题,在消防体系中,特别是高楼消防体系中,消防系统整体布控与监控,火情有效准确定位,防火器材定位,人员逃生路径规划,火情预警,消防演习都是特别重要的环节.所以 ...

  9. 对I/O设备分配的一般策略是什么?

    策略是:独享分配.共享分配.虚拟分配 补充:I/O设备的分配算法 1.  先请求先服务 2.  优先级最高者优先

  10. Python类的定义

    Python笔记--类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...