• JUnit3 一次运行多个测试类和进行多次重复测试:使用测试套件和RepeatedTest


    测试套件

      如果测试类写到很多,每次要进行测试,难道要重新点击每一个测试类来运行?如果有200个测试类要测试呢?

      为了解决这个问题,引入了测试套件(TestSuite)

      通过将多个测试放入套件中,一并执行多个测试。

    实例:一次运行多个测试类

      比如,有两个测试类,叫CalculatorTest和CalculatorTest2。

      在测试类所在的包中新建一个类,叫做TestAll,如下:

    package com.mengdd.junit;
    
    import junit.framework.Test;
    import junit.framework.TestCase;
    import junit.framework.TestSuite;
    
    public class TestAll extends TestCase
    {
    
        public static Test suite()
        {
            // 创建一个测试套件
            TestSuite suite = new TestSuite();
    
            // 增加测试类的class对象
            suite.addTestSuite(CalculatorTest.class);
            suite.addTestSuite(CalculatorTest2.class);
    
            return suite;
    
        }
    }

      运行时,右键这个类,Run As ->JUnit Test:

     

      就相当于运行了CalculatorTest和CalculatorTest2。

    实例:进行方法的重复测试

      如果要对某个方法进行多次测试,可以使用RepeatedTest

      使用时注意,测试类需要一个带参数(String)的构造函数,将String参数传给基类TestCase,调用基类的带参数的构造函数。

      于是修改之前的代码如下:

    被测试类不变:

    Calculator
    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) throws Exception
        {
            if(0 == b)
            {
                throw new Exception("除数不能为0");            
            }
            return a / b;
        }
    }

    测试类:

    CalculatorTest
    package com.mengdd.junit;
    
    import junit.framework.Assert;
    import junit.framework.TestCase;
    
    public class CalculatorTest extends TestCase
    {
    
        private Calculator calculator = null;
        
        
        
        public CalculatorTest()
        {
            super();
        }
        public CalculatorTest(String name)
        {
            super(name);
        }
    
    
    
        @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 = 0;
            try
            {
                result = calculator.divide(12, 3);
            }
            catch (Exception e)
            {
                e.printStackTrace();
    
                // 如果抛出异常,证明测试失败,没有通过,没通过的测试计数在Failures中
                Assert.fail();
                // 如果不加这一行,如果程序进入到catch,无法判断其失败
            }
            // 判断方法的返回结果
            Assert.assertEquals(4, result);// 第一个参数是期望值,第二个参数是要验证的值
    
        }
    
        public void testDivideByZero()
        {
            Throwable tx = null;
    
            int result = 0;
            try
            {
                result = calculator.divide(12, 0);
    
                Assert.fail("没有抛出异常,测试失败");// 如果执行到这行代码,则证明没有抛出异常,说明我们的验证失败
            }
            catch (Exception e)
            {
                e.printStackTrace();
                tx = e;
    
            }
    
            Assert.assertEquals(Exception.class, tx.getClass());// 抛出的异常类型是否和期望一致
            Assert.assertEquals("除数不能为0", tx.getMessage());// 抛出的异常信息是否和期望一致
            
            //如果上面两个都通过,则测试通过
    
        }
    
    }

    测试套件类:

    package com.mengdd.junit;
    
    import junit.extensions.RepeatedTest;
    import junit.framework.Test;
    import junit.framework.TestCase;
    import junit.framework.TestSuite;
    
    public class TestAll extends TestCase
    {
    
        public static Test suite()
        {
            // 创建一个测试套件
            TestSuite suite = new TestSuite();
    
            // 增加测试类的class对象
            suite.addTestSuite(CalculatorTest.class);
            suite.addTestSuite(CalculatorTest2.class);
    
            // 测试某个方法多次,注意测试类需要提供带参数的构造方法
            suite.addTest(new RepeatedTest(new CalculatorTest("testSubtract"), 20));
    
            return suite;
    
        }
    }

    运行结果:

     

    参考资料

      圣思园张龙老师视频教程

  • 相关阅读:
    避免多次提交
    Django 10
    Django 08
    Django 07
    Django 06
    Django 05
    Django 04
    Django 03
    Django 02
    Django 01
  • 原文地址:https://www.cnblogs.com/mengdd/p/3006265.html
Copyright © 2020-2023  润新知