• JUnit单元测试


    测试代码地址:https://github.com/zllwxq130/test/blob/master/junittest.java

    1.编写目标类源代码

    package com.mengdd.junit;

    public class Calculator

    {

           public int add(int a, int b)

     {

            return a + b;

        }

           public int subtract(int a, int b)

        {

            return a - b;

        }

        public int multiply(int a, int b)

        {

            return a * b;

        }

        public int divide(int a, int b)

        {

            return a / b;

        }

    }

    1. 添加JUnit库

    然后为了使用JUnit,需要加入库:

      右键选择项目Properties->左侧Java Build Path->标签Libraries->Add Library...

    弹出的对话框中选JUnit,然后Next,再选择JUnit 3或者JUnit 4.

    本文示例选择JUnit 3。

    1. 创建测试类

    这里需要注意以下几点:

      1.使用JUnit的最佳实践:源代码和测试代码需要分开。

      所以可以新建一个名叫test的source folder,用于存放测试类源代码。这样在发布程序的时候测试类的程序就可以丢掉了。

      但是这两个文件夹中的类编译出的class文件都会在同一个bin文件夹中。

      2.测试类和目标源代码的类应该位于同一个包下面,即它们的包名应该一样。  这样测试类中就不必导入源代码所在的包,因为它们位于同一个包下面。

      3.测试类的命名规则:

      在要测试的类名之前或之后加上Test。

    此步骤完成后项目目录如下:

    1. 测试类代码编写

    测试类必须继承于TestCase类。

    TestCase文档说明:

    public abstract class TestCase

     extends Assert

     implements Test

    A test case defines the fixture to run multiple tests.  To define a test case

    1) implement a subclass of TestCase

    2) define instance variables that store the state of the fixture

     3) initialize the fixture state by overriding setup

     4) clean-up after a test by overriding tearDown.

     Each test runs in its own fixture so there can be no side effects among test runs.

    对于测试类中方法的要求:

    在JUnit 3.8中,测试方法需要满足如下原则:

        1.public的。

        2.void的。 

       3.无方法参数。    

    4.方法名称必须以test开头。 (它通过反射找出所有方法,然后找出以test开头的方法)。

    Test Case之间一定要保持完全的独立性,不允许出现任何的依赖关系。

    删除一些方法后不会对其他的方法产生任何的影响。

    我们不能依赖于测试方法的执行顺序。

    综上,编写代码如下:

    package com.mengdd.junit;
     
    import junit.framework.Assert;
    import junit.framework.TestCase;
     
    public class CalculatorTest extends TestCase
    {
        public void testAdd()
        {
            Calculator calculator = new Calculator();
            int result = calculator.add(1, 2);
            // 判断方法的返回结果
            Assert.assertEquals(3, result);// 第一个参数是期望值,第二个参数是要验证的值
        }
     
        public void testSubtract()
        {
            Calculator calculator = new Calculator();
            int result = calculator.subtract(1, 2);
            // 判断方法的返回结果
            Assert.assertEquals(-1, result);// 第一个参数是期望值,第二个参数是要验证的值
     
        }
     
        public void testMultiply()
        {
            Calculator calculator = new Calculator();
            int result = calculator.multiply(2, 3);
            // 判断方法的返回结果
            Assert.assertEquals(6, result);// 第一个参数是期望值,第二个参数是要验证的值
     
        }
     
        public void testDivide()
        {
            Calculator calculator = new Calculator();
            int result = calculator.divide(12, 3);
            // 判断方法的返回结果
            Assert.assertEquals(4, result);// 第一个参数是期望值,第二个参数是要验证的值
     
        }
     
     
    }
    运行一下:右键选择该类,Run As->JUnit Test

    
    
     

    JUnit的口号:Keep the bar green to keep the code clean.

    1. 代码重构:setUp()方法的使用

    有一个原则:DRY(Don’t Repeat Yourself)

    所以对代码进行重构,将重复的生成对象的部分放在setUp()方法中。

    (重写的时候将protected变为public,继承的时候扩大访问范围是没有问题的。)    先进行一个方法的测试测试:    

    在CalculatorTest类中加入代码如下:

    @Override
        public void setUp() throws Exception
        {
            System.out.println("set up");
        }
        
        @Override
        public void tearDown() throws Exception
        {
            System.out.println("tear down");
        }

    再次运行后发现Console中输出如下:

    说明这两个方法执行了多次。

    在每个测试用例之前执行setUp(),每个测试用例执行之后,tearDown()会执行。

    即对于每个测试用例,执行顺序为:

    1.setUp()

    2.testXXX()

    3.tearDown()

    重构:使用成员变量生成对象(为了能在每个方法中都用到),将生成对象的语句放在setUp()中,注意这里为每一个测试用例都会生成新的对象。    

    重构后代码如下:

    package com.mengdd.junit;
     
    import junit.framework.Assert;
    import junit.framework.TestCase;
     
    public class CalculatorTest extends TestCase
    {
     
        private Calculator calculator = null;
     
        @Override
        public void setUp() throws Exception
        {
            System.out.println("set up");
            // 生成成员变量的实例
            calculator = new Calculator();
            System.out.println(calculator);
        }
     
        @Override
        public void tearDown() throws Exception
        {
            System.out.println("tear down");
        }
     
        public void testAdd()
        {
            int result = calculator.add(1, 2);
            // 判断方法的返回结果
            Assert.assertEquals(3, result);// 第一个参数是期望值,第二个参数是要验证的值
        }
     
        public void testSubtract()
        {
            int result = calculator.subtract(1, 2);
            // 判断方法的返回结果
            Assert.assertEquals(-1, result);// 第一个参数是期望值,第二个参数是要验证的值
     
        }
     
        public void testMultiply()
        {
            int result = calculator.multiply(2, 3);
            // 判断方法的返回结果
            Assert.assertEquals(6, result);// 第一个参数是期望值,第二个参数是要验证的值
     
        }
     
        public void testDivide()
        {
            int result = calculator.divide(12, 3);
            // 判断方法的返回结果
            Assert.assertEquals(4, result);// 第一个参数是期望值,第二个参数是要验证的值
     
        }
     
     
    }

    运行后控制台输出:

    说明每一个测试的方法前后都会有setUp()tearDown()方法的调用,所以每次生成的都是一个新的对象,各个方法之间没有干扰

  • 相关阅读:
    Linux命令备忘录
    Redis集群部署
    Java BIO、NIO、AIO 学习
    elasticsearch性能因素总结
    tomcat配置文件server.xml详解
    Tomcat性能优化及JVM内存工作原理
    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
    HttpClient使用学习
    Java的三种代理模式
    yzoi1109&&viojs1042最小步数的一点看法——回文数
  • 原文地址:https://www.cnblogs.com/zhaolinlin/p/4485969.html
Copyright © 2020-2023  润新知