单元测试工具(连载3)

简介: 单元测试工具(连载3)

1.4  对JUnit 4的高级操作


1@BeforeClass @AfterClass

有一个类是负责对大文件(超过500MB)进行读写,它的每一个方法都是对文件进行操作。换句话说,调用每个方法前,都要打开一个大文件,并读入文件内容,这绝对是一个非常耗时的操作。如果使用@Before@After,那么每次测试都要读取一次文件,效率极其低下。


@BeforeClass@AfterClass两个标识来帮助实现这个功能。从名字上就可以看出,用这两个Fixture标注的函数,只在测试用例初始化时执行 @BeforeClass方法,当所有测试执行完毕后,执行@AfterClass方法进行收尾工作。这里要注意,每个测试类只能有一个方法被标注为@BeforeClass@AfterClass,并且该方法必须是publicstatic


2.防止超时

比如,程序里存在死循环,如何处理?如在“简单计算器”产品代码中,有语句:


publicvoid squareRoot(int n)  {
   for(; ;) ;                  // Bug : 死循环
}


要实现这一功能,给@Test标注加一个参数即可:


@Test(timeout=1000)//1000ms
publicvoid testSquareRoot()  {
    calculator.squareRoot(4);
    assertEquals(2,calculator.getResult());
}


也就是说,测试用例等待时间1000ms(即1s),如果1s内没有反应,就认为测试失败。


3Runner(运行器)

当测试代码提交给JUnit 4框架后,JUnit 4框架通过Runner如何来运行测试代码。如果不设置,就认为是默认的,但是也可以设置:


import  org.junit.internal.runners.TestClassRunner;
import  org.junit.runner.RunWith;
// 使用了系统默认的TestClassRunner,与下面代码完全一样
public classCalculatorTest  {
  ...
  }
@RunWith(BlockJUnit4ClassRunner.class)
 public class CalculatorTest  {
 ...
}


JUnit 4Runner主要有BlockJUnit4ClassRunnerParentRunnerStatementTestRuleDescriptionRunNotifierEnclosedInvokeMethod。其中BlockJUnit4ClassRunner.class是默认的Runner


lEnclosed:是实现内部类中测试类的运行器。


lParentRunner:是JUnit 4测试执行器的基类,它提供了一个测试器所需要的大部分功能。继承它的类需要实现:


protectedabstract List<T> getChildren();
protectedabstract Description describeChild(T child);
protectedabstract void runChild(T child,RunNotifier notifier);


lParameterized:则可以设置参数化测试用例。

lJUnit38ClassRunner:是为了向后兼容JUnit 3而定义的运行器。

lStatement:在运行时,执行test case前可以插入一些用户动作,它就是描述这些动作的一个类。继承这个类要实现:


/**
        *Run the action,throwing a {@code Throwable} ifanything goes wrong.
        */
    publicabstract void evaluate() throws Throwable;


这个方法会先后在ParentRunner.run()ParentRunner.runLeaf()这两个方法里面调用。另外,我们可以自定义一个Statement,并且实现evaluate()方法。


lTestRuleTestRule可以描述一个或多个测试方法如何运行和报告信息的接口。在TestRule中可以额外加入一些check,我们可以让一个test case失败/成功,也可以加入一些setupcleanup要做的事,也可以加入一些log之类的报告信息。总之,跑test case之前的任何事,都可以在里面做。需要实现apply()方法。

 

/**
    * Modifies the method-running{@link Statement} to implement this
    * test-running rule.
    * @param base The {@linkStatement} to be modified
    * @param description A {@linkDescription} of the test implemented in {@code base}
    * @return a new statement,which may be the same as {@codebase},
    * a wrapper around {@code base},or a completely new Statement.
    */
    Statement apply(Statementbase,Description description);


lDescription:存储着当前单个或多个test case的描述信息。这些信息跟逻辑无关,比如原数据信息等。实例化DescriptionDescription.createTestDescription()方法。


lRunNotifier:运行时通知器。执行Runner.run(RunNotifierrunNotifier)方法时,需要传一个RunNotifier进去,这个RunNotifier是事件的管理器,它能帮助我们监控测试执行的情况。


lInvokeMethod:最终执行test case里面的测试方法通过这个类来做,这个类会间接调用Method.invoke()方法通知编译器执行@test方法。

l……


4.参数化测试

案例2:计算一个数的平方。

测试“计算一个数的平方”这个函数,暂且分3类:正数、0、负数。测试代码如下:

import  org.junit.AfterClass;
import  org.junit.Before;
import  org.junit.BeforeClass;
import  org.junit.Test;
import  static org.junit.Assert. * ;
publicclass AdvancedTest  {
privatestatic Calculator calculator=newCalculator();
@Before
publicvoid clearCalculator()  {
    calculator.clear();     
}
@Test
       public void square1()  {
          calculator.square(2);
          assertEquals(4,calculator.getResult());
      }
     @Test
       Public void square2()  {
          calculator.square(0);
          assertEquals(0,calculator.getResult());
      }
    @Test
       Public void square3()  {
          calculator.square(-3);
          assertEquals(9,calculator.getResult());
      }
  }
如果用参数化实现代码,就简化成如下形式:
import  static org.junit.Assert.assertEquals;
import  org.junit.Test;
import  org.junit.runner.RunWith;
import  org.junit.runners.Parameterized;
import  org.junit.runners.Parameterized.Parameters;
import  java.util.Arrays;
import  java.util.Collection;
@RunWith(Parameterized.class )
public  class SquareTest{
private  static Calculator calculator = new Calculator();
private  int param;
private  int result;
@Parameters
       public static Collection<Object[]>data {
           return  Arrays.asList( new  Object[][] {
                   {2,4},
                   {0,0},
                   {-3,9},
          } );
      }
// 构造函数,对变量进行初始化
       public void SquareTest(int param,int result) {
           this .param=param;
           this .result =result;
      }
      @Test
Public  void square(){
          calculator.square(param);
          assertEquals(resul,calculator.getResult());
      }
     } 

 

5.批量测试

对于批量测试,就是把所有的测试类打成一个包一起运行,其代码如下:


import  org.junit.runner.RunWith;
import  org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
         CalculatorTest.class,
         SquareTest.class
         } )
public  class AllCalculatorTests{
}

 

星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net


顾翔凡言:    

   分子作布朗运动的原因是由于原子、基本粒子也在作布朗运动,所以根本就无法测准粒子的动量与位置。根据狭议相对论E=MC^2,质量与能量是物质的两个属性,基本粒子有质量,与作布朗运动产生能量是一致的。(大物体也在作布朗运动,比如弹球,但由于质量太大,运动范围太小,我们用肉眼看不到)

目录
相关文章
|
21天前
|
测试技术 C语言
网站压力测试工具Siege图文详解
网站压力测试工具Siege图文详解
27 0
|
2月前
|
JavaScript jenkins 测试技术
这10款性能测试工具,收藏起来,测试人的工具箱!
这10款性能测试工具,收藏起来,测试人的工具箱!
|
2月前
|
人工智能 监控 测试技术
利用AI辅助工具提升软件测试效率
【2月更文挑战第17天】 随着科技的不断发展,人工智能(AI)在各个领域的应用越来越广泛。在软件测试领域,AI技术也发挥着重要作用。本文将探讨如何利用AI辅助工具提升软件测试效率,包括自动化测试、智能缺陷识别和预测等方面。通过引入AI技术,软件测试过程将变得更加高效、准确和可靠。
202 1
|
2月前
|
测试技术
现代软件测试中的自动化工具与挑战
传统软件测试面临着越来越复杂的系统架构和不断增长的测试需求,自动化测试工具应运而生。本文将探讨现代软件测试中自动化工具的应用和挑战,深入分析其优势与局限性,为软件测试领域的发展提供思路和启示。
|
2月前
|
测试技术 持续交付
现代软件测试中的自动化工具应用与挑战
随着信息技术的快速发展,软件行业对于质量和效率的要求日益提高,自动化测试工具在软件开发过程中扮演着至关重要的角色。本文将探讨现代软件测试中自动化工具的应用现状以及所面临的挑战,旨在帮助开发人员更好地理解并充分利用这一技术手段。
|
3天前
|
机器学习/深度学习 数据采集 人工智能
【专栏】利用AI辅助工具提高软件测试效率与准确性
【4月更文挑战第27天】本文探讨了AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计。AI辅助工具利用机器学习、自然语言处理和图像识别提高效率,但面临数据质量、模型解释性、维护更新及安全性挑战。未来,AI将更注重用户体验,提升透明度,并在保护隐私的同时,通过联邦学习等技术共享知识。AI在软件测试领域的前景广阔,但需解决现有挑战。
|
2月前
|
jenkins 测试技术 持续交付
现代软件测试中的自动化工具与挑战
随着软件开发领域的不断发展,自动化测试工具在测试过程中扮演着越来越重要的角色。本文将探讨现代软件测试中自动化工具的应用及面临的挑战,旨在帮助开发人员和测试人员更好地理解和应对自动化测试中的问题。
|
1天前
|
IDE 测试技术 持续交付
探索自动化测试工具Selenium的高效应用
【4月更文挑战第29天】 在快速迭代的软件开发过程中,高效的测试策略是确保产品质量的关键。本文将深入探讨如何利用自动化测试工具Selenium来提高软件测试的效率和准确性。通过介绍Selenium的核心功能、脚本编写技巧以及与持续集成环境的集成方法,我们旨在为读者提供一个全面的Selenium应用指南。此外,我们还将讨论常见的问题解决策略,并通过案例分析展示如何有效地运用Selenium进行复杂的Web应用测试。
|
2天前
|
Java 测试技术 数据库连接
软件测试中的自动化工具及其应用
传统的软件测试方法已经不能满足日益增长的软件开发需求,因此自动化测试工具应运而生。本文介绍了几种常用的自动化测试工具,并探讨了它们在软件测试中的应用及优势。
7 0
|
9天前
|
敏捷开发 Java 测试技术
探索自动化测试工具Selenium Grid的高效应用
【4月更文挑战第21天】 随着敏捷开发和持续集成的理念深入人心,自动化测试已成为软件开发过程中不可或缺的一环。本文将深入探讨如何利用Selenium Grid进行高效的自动化测试。通过分析其工作原理,搭建过程,以及在实际项目中的应用案例,揭示Selenium Grid在处理大规模并发测试中的潜力和优势。文章不仅提供了具体的操作步骤,还讨论了优化策略,帮助读者构建更加稳定和高效的自动化测试环境。