zoukankan      html  css  js  c++  java
  • Juniti学习总结

    JUnit简介

          JUnit是由 Erich GammaKent Beck编写的一个回归测试框架(regression testing framework)JUnit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。

    2.核心—断言

    断言是编写测试用例的核心实现方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过。 

    1. 断言核心方法 

    assertArrayEquals(expecteds, actuals) 查看两个数组是否相等。
    assertEquals(expected, actual) 查看两个对象是否相等。类似于字符串比较使用的equals()方法
    assertNotEquals(first, second) 查看两个对象是否不相等。
    assertNull(object) 查看对象是否为空。
    assertNotNull(object) 查看对象是否不为空。
    assertSame(expected, actual) 查看两个对象的引用是否相等。类似于使用“==”比较两个对象
    assertNotSame(unexpected, actual) 查看两个对象的引用是否不相等。类似于使用“!=”比较两个对象
    assertTrue(condition) 查看运行结果是否为true。
    assertFalse(condition) 查看运行结果是否为false。
    assertThat(actual, matcher) 查看实际值是否满足指定的条件
    fail() 让测试失败

    3.核心—注解

    1. 说明

    @Before 初始化方法
    @After 释放资源
    @Test 测试方法,在这里可以测试期望异常和超时时间
    @Ignore 忽略的测试方法
    @BeforeClass 针对所有测试,只执行一次,且必须为static void
    @AfterClass 针对所有测试,只执行一次,且必须为static void
    @RunWith 指定测试类使用某个运行器
    @Parameters 指定测试类的测试数据集合
    @Rule 允许灵活添加或重新定义测试类中的每个测试方法的行为
    @FixMethodOrder 指定测试方法的执行顺序

    2. 执行顺序

    一个测试类单元测试的执行顺序为:

    @BeforeClass –> @Before –> @Test –> @After –> @AfterClass

    每一个测试方法的调用顺序为:

    @Before –> @Test –> @After

    JUnit常用注解介绍

          @TestJUnit 3.x是通过对测试方法的命名(test+方法名)来确定是否是测试,且所有的测试类必须继承TestCaseJUnit 4.x只需要在方法前加上@Test 就可以定义一个测试方法。

          注意:测试方法必须是public void,即公共、无返回值的;可以抛出异常

          @Ignore :该注解标记的测试方法在测试中会被忽略当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库连接,而在本地测试的时候,数据库并没有连接),那么使用该注解来标记这个方法。同时可以为该注解传递一个String的参数,表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。

          @BeforeClass:当我们运行几个有关联的用例时,可能会在数据准备或其它前期准备中执行一些相同的命令,这个时候为了让代码更清晰,更少冗余,可以将公用的部分提取出来, 放在一个方法里,并为这个方法注解@BeforeClass。意思是在测试类里所有用例运行之前,运行一次这个方法。例如创建数据库连接、读取文件等。

          注意:方法名可以任意,但必须是public static void,即公开的、静态的、无返回值的。这个方法只会运行一次。

          @AfterClass:跟@BeforeClass对应,在测试类里所有用例运行之后,运行一次。用于处理一些测试后续工作,例如清理数据,恢复现场。

          注意:同样必须是public static void,即公开的、静态的、无返回值的。这个方法只会运行一次。

          @Before:使用了该注解的方法在每个测试方法执行之前都要执行一次。主要用于一些独立于用例之间的准备工作。比如两个用例都需要读取数据库里的用户A信息,但第一个用例会删除这个用户A,而第二个用例需要修改用户A。那么可以用@BeforeClass创建数据库连接。用@Before来插入一条用户A信息。

          注意:必须是public void,不能为static

         @After :使用了该注解的方法在每个测试方法执行之后要执行一次。

          @Runwith:即测试运行器,放在测试类名之前,用来确定测试类怎么运行的,当不指定这个注解时,使用默认Runner来运行测试代码,@RunWith(JUnit4.class)

          常见的运行器有:

          (1)@RunWith(Parameterized.class):参数化运行器,配合@Parameters使用JUnit的参数化功能。

          (2)@RunWith(Suite.class)

             @SuiteClasses({ATest.class,BTest.class,CTest.class})

              测试集运行器配合使用测试集功能。    

          (3)@RunWith(JUnit4.class)JUnit 4的默认运行器

          (4)@RunWith(JUnit38ClassRunner.class):用于兼容junit3.8的运行器

          (5)一些其它运行器具备更多功能。例如@RunWith(SpringJUnit4ClassRunner.class)集成了Spring的一些功能。

          @Parameters:用于JUnit的参数化功能,用来标记准备数据的方法。

           注意:该方法需要满足一定的要求:

                  (1)该方法必须为public static

                  (2)该方法返回值必须为java.util.Collection类型

                  (3)该方法的名字不做要求

                  (4)该方法没有参数

    参数化测试

         为了保证单元测试的严谨性,我们模拟了不同的测试数据来测试方法的处理能力,为此我们编写了大量的单元测试方法。而这些测试方法大同小异:代码结构都是相同的,不同的仅仅是测试数据和期望值。为了降低代码的冗余,JUnit 4提供了参数化测试,即只写一个测试方法,把这若干种情况作为参数传递进去,一次性的完成测试。

        JUnit 4参数化测试的五个步骤:

         (1)为准备使用参数化测试的测试类指定特殊的运行器org.junit.runners.Parameterized。

         (2)为测试类声明几个变量,分别用于存放期望值和测试所用数据。

         (3)为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。

         (4)为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters饰的,返回值为java.util.Collection的公共静态方法,并在此方法中初始化所有需要测试的参数对。

        (5)编写测试方法,使用定义的变量作为参数进行测试。

        Demo如下:

    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
    @RunWith(Parameterized.class)
    public class SquareTest {
     
        private static Calculator calculator = new Calculator();
     
        private int param;//参数
     
        private int result;//期望值
     
        // 准备数据 
        @Parameters 
        public static Collection data() {
            return Arrays.asList(new Object[][]{{2, 4},{0, 0},{-3, 9}});
        }
     
        //构造函数,对变量进行初始化
        public SquareTest(int param, int result) {
            this.param = param;
            this.result = result;
        }
     
        @Test 
        public void square() {
            calculator.square(param);
            assertEquals(result, calculator.getResult());
        }
    }

    打包测试

           在一个项目中,只写一个测试类是不可能的,我们会写出很多很多个测试类。可是这些测试类必须一个一个的执行,也是比较麻烦的事情。鉴于此,JUnit为我们提供了打包测试的功能,将所有需要运行的测试类集中起来,一次性的运行完毕,大大的方便了我们的测试工作。具体代码如下:

    1
    2
    3
    4
    @RunWith(Suite.class)
    @Suite.SuiteClasses({ CalculatorTest.class,SquareTest.class})
    public class AllCalculatorTests{
    }

          大家可以看到,这个功能也需要使用一个特殊的Runner,因此我们需要向@RunWith注解传递一个参数Suite.class。同时,我们还需要另外一个注解@Suite.SuiteClasses,来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该注解就可以了。有了这两个注解之后,就已经完整的表达了所有的含义,因此下面的类已经无关紧要,随便起一个类名,内容全部为空既可。

    异常测试

           JUnit 4之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,可以通过@Test 注解中的expected属性来测试异常。expected属性的值是一个异常的类型。

           Demo如下:

    1
    2
    3
    4
    @Test(expected=ArithmeticException.class)
    public void testDivide() {
        new Calculator().divide(6, 0);
    }

    限时测试

          对于那些逻辑很复杂,循环嵌套比较深的程序,很有可能出现死循环,因此一定要采取一些预防措施。限时测试是一个很好的解决方案。我们给这些测试方法设定一个执行时间,超过了这个时间,他们就会被系统强行终止,并且系统还会向你汇报该方法结束的原因是因为超时,这样你就可以发现这些Bug了。要实现这一功能,只需要给@Test 注解加一个timeout属性,该注解传入了一个时间(毫秒)给测试方法,如果测试方法在指定的时间之内没有运行完,则测试失败。

          Demo如下:  

    1
    2
    3
    4
    @Test(timeout=1000)
    public void testDeathLoop() {
        new Calculator().deathLoop();
    }

             单元测试运行结果:java.lang.Exception: test timed out after 1000 milliseconds

             at test.Calculator.deathLoop(Calculator.java:25)

             at test.CaculatorTest.testDeathLoop(CaculatorTest.java:26)

             at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

             at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

     

  • 相关阅读:
    Asp.net 动态添加Meta标签
    【转】在SharePoint Server 2010中更改“我的网站”
    SPQuery DateTime 类型查询
    Asp.net Web Application 打开 SharePoint 2010 Site 错误 The Web application at could not be found
    How To Create SharePoint 2010 Site Collection In Its Own DB
    C# 文件打印
    面试题 java集合
    《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
    《深入理解Java虚拟机》(五)JVM调优
    《深入理解Java虚拟机》(四)虚拟机性能监控与故障处理工具
  • 原文地址:https://www.cnblogs.com/pdca/p/4464771.html
Copyright © 2011-2022 走看看