• 02.Hamcrest和TestSuite介绍


    1、首先第一步需要导入对应的jar包

    我们来看下面的一个例子

    OK,在前面的一系列博客里面,我整理过了Assert类下面常用的断言方法,比如assertEquals等等,但是org.junit.Assert类下还有一个方法也用来断言,而且更加强大。这就是我们这里要这里的:

    Assert的AssertThat()方法和Hamcrest匹配器

    1,断言抛出的异常

    明显的,有的时候我们想测试我们的代码在某种情况下抛出异常。比如说对于无效输入,我们希望代码抛出IllegalArgumentException。前面我也已经说过了,可以使用Test注解的一个expected属性来遇见我们抛出的异常。代码如下:

    package test.junit4test;

    import org.junit.Test;

    public class LinkinTest
    {

    @Test(expected=NullPointerException.class)
    public void test()
    {
    String str = null;
    System.out.println(str.toString());
    }
    }

    这是一种检查异常的简洁方式。但是有时候我们想更加具体的了解抛出的具体异常。考虑如下情景:现在我们除了想知道我们抛出的异常属于那种类型,我们还想检查抛出的异常中“message”中携带的信息。那么怎么办呢?
    那么没办法,让我们返回到古老的try和catch吧。然后在catch块中我们来使用Assert类的assertThat()方法和强大的Hamcrest匹配器来处理吧。代码如下:
    package test.junit4test;
    
    import org.hamcrest.Matchers;
    import org.junit.Assert;
    import org.junit.Test;
    
    public class LinkinTest
    {
    
        @Test
        public void test()
        {
            try
            {
                throw new Exception("吆西,这里应该抛出异常的呢。。。");
            }
            catch (Exception e)
            {
                Assert.assertThat(e.getMessage(), Matchers.containsString("吆西"));
            }
        }
    }
    代码写成下面的形式
    package com.weiyuan.test;
    
    import java.security.AlgorithmParameterGenerator;
    import java.security.AlgorithmParameters;
    
    import org.hamcrest.Matchers;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    
    import static org.junit.Assert.*;
    
    public class TestCalcuate {
        private Calcuate calcuate;
        
        /**
         * 
         * 执行任何测试方法之前都会调用该方法
         * */
        @Before
        public void setUp(){
            calcuate = new Calcuate();
        }
        
        /**
         * 为了兼容junit3
         * 按照testXX方法命名
         * public int (int a,int b){
         * */
        
        @Test
        public void testAdd(){
            int result = calcuate.add(12, 20);
            assertEquals("加法有问题", result, 32);
        }
    
    
        @Test(expected=ArithmeticException.class)
        public void testDivide(){
            int result = calcuate.divide(12, 0);
            assertEquals("触发有问题", result, 4);
        }
        
        /**
         * 如果测试方法执行超过200毫秒
         * 就会报错
         * */
        
        @Test(timeout=200)
        public void testTimeout(){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        @Test
        public void testException(){
            try
            {
                throw new Exception("吆西,这里应该抛出异常的呢。。。");
            }
            catch (Exception e)
            {
                Assert.assertThat(e.getMessage(), Matchers.containsString("555"));
            }
        }
    
    }

    因为上面抛出的异常的message不包含555字符串所以运行失败,我们可以通过hamcrest包提供的Matches来增加junit的测试功能

    需要注意点:hamcrest需要静态导入对应的包

    import static org.hamcrest.Matchers.*;

    案例2:使用hamcrest判断一个数的大小
    package com.weiyuan.test;
    
    import java.security.AlgorithmParameterGenerator;
    import java.security.AlgorithmParameters;
    
    import org.hamcrest.Matchers;
    import org.junit.Before;
    import org.junit.Test;
    
    import static org.junit.Assert.*;
    import static org.hamcrest.Matchers.*;
    public class TestCalcuate {
        private Calcuate calcuate;
        
        /**
         * 
         * 执行任何测试方法之前都会调用该方法
         * */
        @Before
        public void setUp(){
            calcuate = new Calcuate();
        }
        
        /**
         * 为了兼容junit3
         * 按照testXX方法命名
         * public int (int a,int b){
         * */
        
        @Test
        public void testAdd(){
            int result = calcuate.add(12, 20);
            assertEquals("加法有问题", result, 32);
        }
    
    
        @Test(expected=ArithmeticException.class)
        public void testDivide(){
            int result = calcuate.divide(12, 0);
            assertEquals("触发有问题", result, 4);
        }
        
        /**
         * 如果测试方法执行超过200毫秒
         * 就会报错
         * */
        
        @Test(timeout=200)
        public void testTimeout(){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
    
        
        @Test
        public void testHamcrest(){
            /*
             * 判断10是否大于20*/
            assertThat(10, greaterThan(20));
        }
    
    }

     使用了hamacet提供的greaterThan功能

    程序运行的结果如下
     
    hamcrest还定义了下面的很多规则

    我们判断10是否大于5,小于12

    @Test
        public void testHamcrest(){
    
            assertThat(10, allOf(greaterThan(5),lessThan(12)));
        }

     在运行的时候报错

    这是由于junit4的java包和hamcijava冲突引起的,如何解决了

     需要把ham的jar包移动到juint的上面

    我们在运行的时候,就不会报错了

     TestSuite:测试集合,即一组测试。一个test suite是把多个相关测试归入一组的快捷方式。如果自己没有定义,Junit会自动提供一个test suite ,包括TestCase中的所有测试。

    依赖性指的是每个测试方法都是独立的,执行测试方法2之前,才能执行测试方法3,测试的时候必须保证测试类的独立性

    我们以前执行每个测试类都是独立的,我们现在有很多测试类,我们能不能使用一个组件在管理执行测试类,当然可以

    package com.weiyuan.test;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    //说明这个测试类,是一个组件测试类,用来管理所有的测试类
    @RunWith(Suite.class)
    //指定管理那些测试类
    @SuiteClasses({TestA.class,TestB.class,TestCalcuate.class})
    public class TestSuite {
    
    }
    package com.weiyuan.test;
    
    import org.junit.Test;
    
    public class TestA {
    
        @Test
        public void testA(){
            System.out.println("testA is called");
        }
    }
    package com.weiyuan.test;
    
    import org.junit.Test;
    
    public class TestB {
    
        @Test
        public void testB(){
            System.out.println("testB is called");
        }
    }

    整个项目的工程代码如下所示

    我们在组件的java类上面运行测试

    我们可以看到控制台的打印

    先执行TestA中的所有方法,然后是TestB中的,然后是TestCalcuate的

    
    
  • 相关阅读:
    RAD Studio最终版合集
    cxGrid 锁定一行,让该行数据不能编辑
    跨平台打开一个URL的方法
    【转】DELPHI开始支持LINUX DOCKER
    HTTP请求的拦截
    SVG图像
    Kafka
    HBase分布式集群部署
    HBase
    Mapreduce提交YARN集群运行
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/8906095.html
Copyright © 2020-2023  润新知