junit浅学笔记
JUnit是一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。
虽然大多情况下他是程序员的活,但作为测试人员还是有必要了解一下,毕竟也是测试工作,提高自己人技术,扩展思想是主要,边学边做笔记,这样学过的东西才不会忘记,嘻嘻~!
========学习环境=================
java编辑器: Eclipse SDK 3.5.6
junit测试包:Eclipse中自带了junit 4 测试包
=================================
1.我们打开eclipse 创建一个工程名字为:Junit4,
创建一个包,命名为:com.junit4.cc ,
包下面创建一个类 T
代码如下:
package com.junit4.cc;
publicclass T {
publicint add(int x ,int y){
return x+y;
} }
我们如何来做测试,当然了,上面的代码一眼就可以看出结果,需要测试么,我们这里只是想说明问题,如果我们不用测试框架,我们会用写一个main方法对上面的代码进行验证。全部代码如下。
package com.junit4.cc;
publicclass T {
publicint add(int x ,int y){
return x+y;
}
publicstaticvoid main(String args[]){
int z=new T().add(3,5); //向T类传递两个参数3和5
System.out.println(z); //打印z进行查看3和5是否做了加法运算
}
}
云行上面的代码,通过查看结果来判断add方法是否正确。
---------------------------------------------------------------------------
上面的单元测试有很多弊端:
@ 需要花费很多的时间来写测试代码
@ 测试代码不可重用,一段测试代码对应一段被测代码。被测代码变,测试代码就没用了
@ 无法同时运行多个测试代码。假如有一百个被测试代码,要一个一个的运行测试代码,用肉眼观察结果,效率低还容易出错。
这是我简单总结的几个缺点。
---------------------------------------------------------------------------
2. 那么我们就要使用单元测试框架来提交效率。
下面我们就使用eclipse来创建一个测试。还是测试上面的代码为例子。
为了查看更加清晰,我们一般将测试代码与被测试的代码放在不同的包下面。
我们在Junit工程下面重新创建一个包,命名为:com.junit4.cc.test
----------------------------
创建一个测试类:TTest
注意:这里要创建的是一个测试类:在com.junit4.cc.test包上面右键点击-->new-->Junit test Case
点击“Next”会让你选择要测试的方法,选择后点击“Finish”则完成创建。
创建完成如下图:
TTest.java代码如下:
package com.junit4.cc.test; importstatic org.junit.Assert.*; import org.junit.Test;
import com.junit4.cc.*; publicclass TTest { @Test
publicvoid testAdd() {
int z=new T().add(5,3);
assertEquals(8,z);
} }
3. 如果我们想要真正运行TTest.java这个测试类,还要对这个工程引入junit测试包。
右键点击工程(junit4)--->Properties
点击“next ” 按钮,celipse提供junit3和junit4两个测试包,我们选择junit4 点击“finish”就将测试包引入。
4. 下面来运行我们TTest.java测试代码。
看到我们左侧的绿色滚动条,说明我们的被代码是没有问题。
你可以试着修改下面代码的参数:
int z=new T().add(5,3);
assertEquals(8,z); //将5、3、8等数字任意修改,查看绿色滚动条的颜色,给出的提示是什么?
上一节初步介绍了什么是单元测试,为什么要做单元测试,以及junit4的初步使用,这里我们接着说一下junit4中的注解。
=============本节知识点============================
* Error和Failures
* Junit4 Annotation
==================================================================
1. 在讲注解之前,先来认识 Error和Failures这两种错误有什么不同。
Errors:表示程序本身错误
@Test
publicvoid testAdd() {
int z=new T().add(5,3);
assertEquals(8,z);
int a=8/0; //这一句是有错误的
}
运行方法,会有一下错误提示:
Failures: 是指测试失败。
@Test
publicvoid testAdd() {
int z=new T().add(5,4); //这里修改了数值,把4该为3就正确了
assertEquals(8,z);
}
在来运行这个方法,看一下错误提示:
所以,我们在写测试程序的时候,要先保证Errors是没有错误的,再来看Failures有没有错误。
2. 下面介绍junit4 的常用注解
-----------------------------------------------------------------------------------------------
* @ Test:测试方法
A) (expected=XXEception.class)
B) (timeout=xxx)
*. @ Ignore: 被忽略的测试方法
*. @Before: 每一个测试方法之前云行。
*. @After : 每一个测试方法之后运行。
*. @BefreClass 所有测试开始之前运行。
*. @AfterClass 所有测试结果之后运行。
------------------------------------------------------------------------------------------------
下面通过一个测试程序来解释这些注解含义
package com.junit4.cc.test; importstatic org.junit.Assert.*;
importstatic org.hamcrest.Matcher.*; import org.junit.Test;
import com.junit4.cc.*; import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.AfterClass;
import org.junit.After;
import org.junit.Ignore; publicclass TTest { @BeforeClass //的所有方法运行之前运行。
publicstaticvoid beforeClass(){
System.out.println("------------beforeClass");
} @AfterClass //在所有方法运行之后运行
publicstaticvoid afterClass(){
System.out.println("-------------afterClass");
} @Before //每个测试方法运行之前运行
publicvoid before(){
System.out.println("=======before");
} @After //每个测试方法运行之后运行
publicvoid after(){
System.out.println("=======after");
} @Test
publicvoid testAdd() {
int z=new T().add(5,3);
assertEquals(8,z);
System.out.println("test Run through");
} @Test ()
publicvoid testdivision(){
System.out.println("in Test Division"); } @Ignore //表示这个方法是不被运行的
@Test
(expected=java.lang.ArithmeticException.class,timeout=100) //timeout表示要求方法在100毫秒内运行完成,否则报错
publicvoid testDivide(){
int z =new T().divide(8,2);
} }
运行结果如下:
标记红星(*)方法在每个方法开始和结尾都运行一次。
标记绿星(*)的方法只在所有方法的开始和结尾运行一次。
junit有多种注解,我们常用的也就上面几种。
这一节我们将学习进行批量处理,假如我们有多的测试,怎样进行批量处理,请跟着我做。
---------------------------------------------
假如我们写了两个被测程序。如下:
T.java
package com.junit4.cc; publicclass T {
publicint add(int x ,int y){
return x+y;
}
publicstaticvoid main(String args[]){
int z=new T().add(3,5);
System.out.println(z);
}
}
User.java
package com.junit4.cc; publicclass User {
public String geName(){
return"刘若英"; //PS:她是我的偶像嘻嘻:)
}
}
------------------------------------测试类-------------------------
下面要对上面的两个类写测试类。(关于测试类的创建的方法,不懂的可以看我的第一篇《junit浅学笔记一》)
TTest.java 对应的是T.java的测试类。
package com.junit4.cc.test; importstatic org.junit.Assert.*; import org.junit.Test;
import com.junit4.cc.*; publicclass TTest {
@Test
publicvoid testAdd() {
int z=new T().add(5,3);
assertEquals(8,z);
}
}
UserTest.java 对应的是User.java
package com.junit4.cc.test; importstatic org.junit.Assert.*; import org.junit.Test;
import com.junit4.cc.User; publicclass UserTest { @Test
publicvoid testGeName() {
assertEquals(new User().geName(),("刘若英"));
}
}
完成之后的列表如下:
要批量运行上面两个测试类,有两个方法。
方法一
右键点击测试包“com.junit4.cc.test”--->Run As--->Run Configurations.
这种方式设置简单,但灵活度不高,假如有100个测试类。我只想运行其中的某几个测试类。下面看第二中方式。
方法二
方法引入一种“测试套件”的概念,JUnit提供了一种批量运行测试类的方法,叫测试套件。
测试套件的写法需要遵循以下原则:
1. 创建一个空类作为测试套件的入口;
2. 使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuitClasses 修饰这个空类
3. 将org.junit.runners.Suite作为参数传入给注解RunWith,以提示Junit为此类测试使用套件运行器执行。
4. 将需要放入此测试套件的测试类组成数组作为注解SuiteClasses的参数
5. 保证这个空类使用public修饰,而且存在公开的不带任何参数的构造函数
下面在测试包(com.junit4.cc.test)下面创建一个测试类,内容如下:
AllTest.java
package com.junit4.cc.test; import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({
TTest.class,
UserTest.class //这里自由加入需要运行的测试类
})
publicclass AllTest { }
创建之后的列表:
运行AllTest.java的结果(这里,两个方法的运行结果是一样的):
ps:关于两种方式的比较,第一种方法简单,只用选择测试包,就可以批量运行里面的所有测试程序。第二种方式还有重新创建一个测试类,但它非常灵活,只用在这个类中加入需要运行的类就可以灵活的运行需要测试的类。
junit浅学笔记的更多相关文章
- 沈逸老师ubuntu速学笔记(2)-- ubuntu16.04下 apache2.4和php7结合编译安装,并安裝PDOmysql扩展
1.编译安装apache2.4.20 第一步: ./configure --prefix=/usr/local/httpd --enable-so 第二步: make 第三步: sudo make i ...
- 沈逸老师ubuntu速学笔记(1)--安装flashplayer,配置中文输入法以及常用命令
开篇首先感谢程序员在囧途(www.jtthink.com)以及沈逸老师,此主题笔记主要来源于沈老师课程.同时也感谢少年郎,秦少.花旦等同学分享大家的学习笔记. 1.安装flash player ctr ...
- 浅学JavaScript
JavaScript是互联网上最流行的脚本语言,可广泛用于服务器.PC.笔记本电脑智能手机等设备: 对事件的反应: <!DOCTYPE html> <html> <hea ...
- 随学笔记 partAdded
随学笔记: RectangularDropShadow为矩形对象添加阴影,DropShadowFilter可以为任意形状对象添加阴影. BorderContainer和Panel等容器使用的就是Rec ...
- 【机器学*】k-*邻算法(kNN) 学*笔记
[机器学*]k-*邻算法(kNN) 学*笔记 标签(空格分隔): 机器学* kNN简介 kNN算法是做分类问题的.思想如下: KNN算法的思想总结一下:就是在训练集中数据和标签已知的情况下,输入测试数 ...
- Ruby 趣学笔记(二)
Ruby 趣学笔记(二) 本文写于 2020 年 5 月 7 日 类的继承 之前忘记写了,Ruby 的继承写法是: class IPhone < Phone def initialize(id, ...
- Ruby 趣学笔记(一)
Ruby 趣学笔记(一) 本文写于 2020 年 5 月 6 日 Ruby 趣学笔记(一) 变量 变量声明 变量类型 常量 输出 字符串 字符串操作 Array 数组的遍历 数组的连接 怎么判断该变量 ...
- 浅学CLR via C#笔记之类型转换
我们都知道CLR最重要的一个特性就是类型安全,它在运行时就知道对象类型. 但我们会经常用到将一种类型转换成另一种类型,CLR也允许将对象转成他的实际类型,或者是它的基类型. 在C#中,支持隐士转换成它 ...
- opengl 入门浅学(一)
因为要做图形学的实验,又是要以OPENGL为基础,所以就稍微在网上查了一些资料. 我是带着目的去学习的,所以就没有打基础之类的学很深,浅尝. 今天试着搭简单框架,画出一个图形.大神请出门左转. #in ...
随机推荐
- 从零开始学ios开发(七):Delegate,Action Sheet, Alert
Action Sheet和Alert是2种特殊的控件(暂且称之为控件吧,其实不是控件真正的控件,而是ios中的2个类,这2个类定义了2种不同类型的用于和用户交互的弹出框),Action Sheet是从 ...
- Entity Framework4.0 (六) EF4的 增加、删除、更改
前面介绍了EF4的查询功能,主要是借助于LINQ的强大的查询功能和它简单的语法.让我们可以完全面向对象集体去进行查询,而不必去劳心处理那些关系型数据库表的操作.这样我们更容易把主要精力集中在业务逻辑上 ...
- C#中使用SelectionStart属性指定输入框光标位置
今天工作中遇到一个小BUG需要修改,需求为在文本框输入的过程中,如果数字是以0开头则自动消除0 如输入012,则显示12 很容易想到在textbox的text changed事件中判断,如果text是 ...
- SQL获取数据库名,表名,列名,说明等信息
由于最近工作涉及SQL语句较多,对一些不常见的SQL函数.及存储过程下面进行整理和描述,供大家分享: /************************************************ ...
- DatagramChannel
DatagramChannel 最后一个socket通道是DatagramChannel.正如SocketChannel对应Socket,ServerSocketChannel对应ServerSock ...
- php中的性能挖掘
搞php以后,感觉总是很别扭,因为我觉得php会很慢,因为array普遍,在Key的循环查找不是很浪费性能么!因为我以前搞.net和java,他们是用的大多是寻址和索引方式,而php中太多是使用Key ...
- 【POJ】【2987】Firing
网络流/最大权闭合子图 胡伯涛论文里有讲…… sigh……细节处理太伤心了,先是count和ans输出弄反了,改过来顺序时又忘了必须先算出来ans!要是不执行一下Dinic的话count就无意义了…… ...
- contentType,pageEncoding,charset,setCharacterEncoding
contentType,pageEncoding,charset,setCharacterEncoding HTML中的meta标签,以及HTTP Header. -------------字符集.字 ...
- XEE介绍
摘要: XMl Entity Expansion(攻击)某种程度上类似于 XML Entity Expansion,但是它主要试图通过消耗目标程序的服务器环境来进行DOS攻击的.这种攻击基于XML E ...
- 【C++基础】指针好难啊,一点点啃——基本概念
指针保存的是另一个对象的地址(概念真的很重要!!) ; int *ptr = &a;//*定义一个指向int类型的指针ptr, &a取变量a的地址 引用是对象的别名,多用于函数形参,引 ...