2019独角兽企业重金招聘Python工程师标准>>>

JUnit简介

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

简单编写单元测试实例

public class JunitAnnotation {// execute before class@BeforeClasspublic static void beforeClass() {System.out.println("in before class");}// execute after class@AfterClasspublic static void afterClass() {System.out.println("in after class");}// execute before test@Beforepublic void before() {System.out.println("in before");}// execute after test@Afterpublic void after() {System.out.println("in after");}// test case@Testpublic void test() {System.out.println("in test");}// test case ignore and will not execute@Ignore(“unimplemented”)public void ignoreTest() {System.out.println("in ignore test");}
}

JUnit常用注解介绍

@Test:JUnit 3.x是通过对测试方法的命名(test+方法名)来确定是否是测试,且所有的测试类必须继承TestCase。JUnit 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如下:

@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为我们提供了打包测试的功能,将所有需要运行的测试类集中起来,一次性的运行完毕,大大的方便了我们的测试工作。具体代码如下:

@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如下:

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

限时测试

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

Demo如下:

@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)

…………………………

转载于:https://my.oschina.net/jackieyeah/blog/183277

JUnit简单使用教程相关推荐

  1. Mockito简单实用教程 - 第一部分mock

    Mockito简单实用教程 - 第一部分mock 环境介绍 依赖 内容 1. 检验方法是否有被调用 2. 指定mock方法的返回值 3. 验证指定次数 4. 验证异常 5. 校验执行顺序 6. 校验形 ...

  2. vim简单使用教程【转】

    vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...

  3. java map set_java中Map、Set、List的简单使用教程(快速入门)

    Map.Set.List List的常用方法 1.创建 List list = new ArrayList<>(); List list = new LinkedList<>( ...

  4. 【转】正则表达式简介及在C++11中的简单使用教程

    [转]正则表达式简介及在C++11中的简单使用教程 正则表达式Regex(regular expression)是一种强大的描述字符序列的工具.在许多语言中都存在着正则表达式,C++11中也将正则表达 ...

  5. PHP在WPS中的应用,PHP+Laravel的简单应用教程【ajax的使用】,wps的使用教程

    PHP+Laravel的简单应用教程[ajax的使用]PHP·拉弗尔的简单应用教程[阿贾克斯的使用],下面由Laravel框架教程栏目给大家介绍PHP Laravel的简单应用教程[阿贾克斯的使用], ...

  6. 史上最简单MySQL教程详解(进阶篇)之存储过程(一)

    史上最简单MySQL教程详解(进阶篇)之存储过程(一) 史上最简单MySQL教程详解(进阶篇)之存储过程(一) 什么是存储过程 存储过程的作用 如何使用存储过程 创建存储过程 DELIMITER改变分 ...

  7. 史上最简单MySQL教程详解(进阶篇)之存储引擎介绍及默认引擎设置

    什么是存储引擎? MySQL存储引擎种类 MyISAM 引擎 InnoDB引擎 存储引擎操作 查看存储引擎 存储引擎的变更 修改默认引擎 什么是存储引擎? 与其他数据库例如Oracle 和SQL Se ...

  8. IDEA简单配置教程

    IDEA简单配置教程 --做好前期配置工作,后期少走弯路. 创建模块(Module) 设置(Settings) 设置主题 窗体及菜单字体及大小 设置编辑区主题 通过插件(plugins)更换主题 设置 ...

  9. kindle的xray怎么用_Xray简单使用教程

    Xray简单使用教程 0X00下载 xray 为单文件二进制文件,无依赖,也无需安装,下载后直接使用. 下载地址为: 注意: 不要直接 clone 仓库,xray 并不开源,仓库内不含源代码,直接下载 ...

最新文章

  1. insertAfter
  2. Wonder 1.0 正式版发布,WebGL 3D引擎和编辑器
  3. ZeroMQ接口函数之 :zmq_pgm – ØMQ 使用PGM 进行可靠的多路传输
  4. C++基本序列式容器效率比较
  5. Asp.Net Core 发布到IIS
  6. Java 10新特性
  7. 从零开始构建自己的爬虫代理IP数据库并定期检验IP有效性...
  8. RHEL 8 - 用OpenSCAP工具对容器镜像进行漏洞安全合规扫描,并修复
  9. RMAN冷备份异机还原
  10. import关键字的使用
  11. eclipse javaWeb项目如何引入jar包
  12. Matlab实现Compow协议,optisystem和matlab协同仿真
  13. nsis升级包_NSIS制作软件升级安装包 - 卡饭网
  14. 拜耳新一代犬体内驱虫药拜宠清登陆中国市场
  15. 〖Python APP 自动化测试实战篇⑤〗- appium Capability详解
  16. 笔记本电脑需要计算机管理员提供的,笔记本电脑设置了管理员权限钉钉软件安装不了咋办呢...
  17. 外挂开发中的封包技术
  18. 【JokerのZYNQ7020】INTERRUPT(PL产生,PS处理)。
  19. sys.path.append方法
  20. python3判断字典中的key是否存在_python3判断key存在字典中的方法是什么

热门文章

  1. Javascript 浏览器探测
  2. windows sharepoint service 3.0 wss3 URL 映射问题,差点把网站废掉
  3. c#中udp客户端连接遇到的问题 “远程主机强制关闭了一个现有的连接”
  4. C#实现缩放和剪裁图片的方法示例
  5. 变量声明和函数声明的意义详解
  6. SwiftUI3.0用户登录输入非空校验经典案例
  7. rabbitmq如何保证消息不丢失_RabbitMQ的去重与防止消息的丢失
  8. SOL注入——HTTP头部注入(六)
  9. p4: php5ts.dll p5: 5.6.14.0,服务器httpd.exe 应用程序错误
  10. win10下安装SQLServer2000