zoukankan      html  css  js  c++  java
  • 廖雪峰Java8JUnit单元测试-1JUnit简介-1JUnit测试

    测试驱动开发(Test Driver Development)

    1.使用main()方法测试的缺点:

    • 只能有1个main()方法,不能把测试代码分离
    • 没有打印出测试结果和期望结果,例如expected:3628800,but actual:362880
    • 因此,需要一种测试框架,帮助我们编写测试
    public class Fact {
        public static void main(String[] args) {
            if(fact(10)==3628800){
                System.out.println("pass");
            }else {
                System.out.println("fail");
            }
        }
        public static long fact(long n){
            long r = 1;
            for(long i=1;i<n;i++){
                r = r * i;
            }
            return r;
        }
    }
    

    2.单元测试概念:

    • 单元测试是针对最小的功能单元编写测试代码
    • Java程序最小的功能单元是方法
    • 单元测试就是针对单个Java方法的测试

    2.1单元测试的好处:

    • 确保单个方法运行正常
    • 如果修改了方法代码,只需确保其对应的单元测试通过
    • 测试代码本身就可以作为示例代码
    • 可以自动化运行所有测试并获得报告,报告包含成功和失败的用例,以及代码的覆盖率(一般要求70%以上)

    2.2JUnit是一个开源的Java语言的单元测试框架

    • 专门针对Java语言设计,使用最广泛
    • JUnit是事实上的标准单元测试框架

    JUnit特点:

    • 使用断言Assertion测试期望结果
    • 可以方便地组织和运行测试
    • 可以方便地查看测试结果
    • 常用IDE(例如Eclipse)都继承了JUnit
    • 可以方便的集成到Maven

    JUnit的设计:

    • TestCase:一个Testcase表示一个测试
    • TestSuite:一个TestSuite包含一组TestCase,表示一组测试
    • TestFixture:一个TestFixture表示一个测试环境
    • TestResult:用于收集测试结果
    • TestRunner:用于运行测试
    • TestListener:用于监听测试过程,收集测试数据
    • Assert:用于断言测试结果是否正确

    使用Assert断言:import static org.junit.Assert.*

    • 断言相等:assertEquals(100,x)
    • 断言数组相等:assertArrayEquals({1,2,3},x)
    • 断言浮点数相等:assertEquals(3.1415,x,0.0001) 最后为误差范围
    • 断言为null:assertNull(x)
    • 断言为true/false:assertTrue(x>0) assertFalse(x<0)
    • 其他:assertNotEquals/assertNotNull

    3.代码示例

    带测试方法类Main.java

    import java.util.Arrays;
    
    public class Main {
        public long fact(long n){
            long r = 1;
            for(long i=1;i<=n;i++){
                r = r * i;
            }
            return r;
        }
        public int calculate(String expression){
            String[] ss = expression.split("\+");
            System.out.println(expression+"=>"+ Arrays.toString(ss));
            int sum=0;
            for(String s:ss){
                sum = sum + Integer.parseInt(s);
            }
            return sum;
        }
    }
    

    3.1IDEA创建单元测试

    • 3.1.1根目录下新建test目录,右键->Mark Direcotory as -> Test Sources Root
    • 3.1.2打开待测试类Func.java,右键->Go to->Test->Create new Test,或者ctrl+shift+t
    • 3.1.3勾选测试的方法即可,生成类名默认加上Test的后缀

    3.2.Eclipse创建单元测试

    • 3.2.1根目录右键new->Source Folder,创建test目录,希望将所有的单元测试都放在test目录下
    • 3.2.2选择待测试类,new->Junit Test Case(如果没有,new-other-java-JUnit-Junit Test Case),选择New Junit4 test,Source Folder选择刚才创建的test目录->选择测试的方法->finsh,注意 Add Junit4 library to the build path,点击OK,创建完成
    //MainTest.java
    package com.testList;
    
    import static org.junit.Assert.*;
    import com.testList.Main;
    public class MainTest {
    
        @org.junit.Test
        public void fact() {
            assertEquals(6,new Main().fact(3));
            assertEquals(24,new Main().fact(4));
            assertEquals(720,new Main().fact(6));
        }
    
        @org.junit.Test
        public void calculate() {
            assertEquals(3,new Main().calculate("1+2"));
            assertEquals(6,new Main().calculate("1+2+3"));
            assertEquals(35,new Main().calculate("12+23"));
        }
    }
    
    测试中发现的问题:如果传入的表达式中包含空格,如" 1 + 2"会提示java.lang.NumberFormatException,直接打印字符,发现字符包含空格,因此在转换为int时报错。修改代码,使用trim去除首尾的空格 ```#java public void calculateWithSpace(){ String expre = " 1 + 2"; String[] ss = expre.split("\+"); // assertEquals(0,new Main().calculate(" 1 + 2")); for(String s:ss){ System.out.println('a'+s+'a');//结果图1 //System.out.println('a'+s.trim()+'a');//结果图2 } } ``` 修复之后,测试完成 ```#java //Main.java public int calculate(String expression){ String[] ss = expression.split("\+"); System.out.println(expression+"=>"+ Arrays.toString(ss)); int sum=0; for(String s:ss){ sum = sum + Integer.parseInt(s.trim()); } return sum; } //MainTest.java @Test public void calculateWithSpace(){ assertEquals(3,new Main().calculate(" 1 + 2")); } ```

    4.总结:

    • 一个TestCase包含一组相关的测试方法
    • 使用Assert断言测试结果(注意浮点数assertEquals要制定误差范围delta)
    • 每个测试方法必须完全独立
    • 测试代码必须非常简单
    • 不能为测试代码再编写测试
    • 测试需要覆盖各种输入条件,特别是边界条件
  • 相关阅读:
    BZOJ 3754 Tree之最小方差树
    【CSS】318- CSS实现宽高等比自适应容器
    【Vuejs】317- 提升90%加载速度——Vuecli下的首屏性能优化
    【H5】316- 移动端H5跳坑指南
    【每周小回顾】2- 一起回顾上周精彩内容
    【Webpack】315- 手把手教你搭建基于 webpack4 的 vue2 多页应用
    【Web技术】314- 前端组件设计原则
    【JS】313- 复习 回流和重绘
    【JS】312- 复习 JavaScript 严格模式(Strict Mode)
    【Canvas】311- 解决 canvas 在高清屏中绘制模糊的问题
  • 原文地址:https://www.cnblogs.com/csj2018/p/10714954.html
Copyright © 2011-2022 走看看