Junit 测试基础
/**
* 1、测试函数以 @Test 注解, 函数名可以根据测试内容自定义但返回值必须是void,不能有参数
* 2、assertEquals(arg0,arg1); 用来判断期待值是否和实际结果相等, 第一个参数 写期待结果,第二个参数写实际结果。juni会自动对比返回测试结果
* 3、@Ignore 表示忽略此函数 一般在写程序之前我们应该做好规划,即哪个程序是干什莫的,如果测试时 程序还没写好 可以先用个@Ignore注解,测试时结果会提示你有几个测试被忽略,在程序写好后只需把注解去掉,进行测试便可以
* 4、 fixture(固定代码段)就是在某些阶段必然被调用的代码 可以做一些初始化工作 或者选择 将 测试类 进行初始化 来防止 测试之间的相互影响 如果在计算器中有静态变量 res我们就可以通过 @before或@after 把res清零
* 5、@BeforeClass 和 @AfterClass 如果在测试一个类对较大的文件进行操作,测试每个方法都对文件进行读取,将会耗费大量时间,显然不切实际。这时我们希望在所有测试之前读一次文件,在所有测试结束后是放文件,这时便可以使用@BeforeClass和 @AfterClass 每个测试类只能有一个方法被标注为@BeforeClass 或 @AfterClass,并且该方法必须是Public和Static的。
* 6、@Test(timeout=1000)限时测试 在函数中我们会用到循环,但是如果失误出现死循环 那这个测试会花费大量时间而得不到结果, 为了避免这种情况 我们可以对函数测试进行限时,超时后强行中止次方法的测试
* 7、@Test(expected = ArithmeticException.class)测试异常,java中常会编写函数有异常抛出,如果你觉得一个函数应该抛出异常,但是没有抛出,显然需要被检测到。我们需要使用@Test的excepted属性,将我们要检验的异常值传递给她,这样junit就能自动帮我们检测是否抛出异常
* 8、@RunWith(TestClassRunner.class)(运行器用来修饰类而不是函数) 当我们将代码交给Junit之后框架如何来运行你的代码————通过Runner 在Junit中有许多Runner 负责调用你的测试代码, Junit 中有默认的Runner 在特殊情况下我们需要调用 特定的Runner
* 9、 @RunWith(Parameterized.class) 指定此运行器可以进行参数化测试 对于每个方法的测试我们通常会使用多组数据来测试, 这时我们不需要测试一组修改一下代码 ,也不需要创建多个测试类 只需要改变 Runner
* 10、@RunWith(Suite.class) 打包测试 在一个项目中只写一个测试类是不可能的,我们会写很多的测试类,可这些测试类必须一个一个的执行,也是比较麻烦的事。鉴于此,junit为我们提供了打包测试的功能,将所有需要运行的测试类集中起来,一次性的运行完毕,大大方便了我们的测试工作。
*/
编写calculator1
public class Calculator1 {
public int add(int n1,int n2){
return n1+n2;
}
public int minus(int n1 ,int n2) {
return n1-n2;
}
}
编写calculator1的测试类
package junittest;
/**
* import static org.junit.Assert.*;
* 采用静态导入
* 检测结果用的assertEquals(4,res);函数是来自于类Assert的静态方法
* 使用静态导入之后在调用时就不必使用Assert.assertEquals(4,res);
*/
import static org.junit.Assert.*; import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class Calculator1Test {
public Calculator1 calculator = new Calculator1();
/**
* 在测试方法之前执行
* @throws Exception
*/
@Before
public void setUp() throws Exception {
System.out.println("Calculator1 方法测试开始");
}
/**
* 在测试方法之后执行
* @throws Exception
*/
@After
public void tearDown() throws Exception {
System.out.println("Calculator1 方法测试结束");
}
/**
* 测试Add 函数名可以自定义但返回值必须是void,不能有参数 (junit4 新加入)
*/
@Test
public void Add() {
int res = calculator.add(2, 3);
assertEquals(4,res);
}
/**
* 此方法尚未写好 标记@Ignore
*/
@Test
@Ignore
public void Minus() { } }
编写calculator2
import org.junit.Test; public class Calculator2 {
@Test(timeout = 1000)
public void mult(int n1, int n2){
for(;;);
}
public int divi(int n1, int n2){
return n1/n2;
}
}
编写calculator2测试类
package junittest; import static org.junit.Assert.*; import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test; public class Calculator2Test {
public Calculator2 calculator2 = new Calculator2();
/**
* 标记在整个测试类前执行
* @throws Exception
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("Calculator2测试开始");
}
/**
* 标记在整个测试类后执行
* @throws Exception
*/
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("Calculator2测试结束");
}
/**
* 内置死循环 会超时 超时测试会失败
*/
@Test(timeout = 1000)
public void testMult() {
calculator2.mult(1, 2);
}
/**
* 除数不能为0 预期抛出错误 如果不抛出错误 测试失败
*/
@Test(expected = ArithmeticException.class)
public void testDivi() {
calculator2.divi(5, 0);
}
}
编写打包测试类
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class)
@Suite.SuiteClasses({Calculator1Test.class,Calculator2Test.class})
public class AllTest { }
编写参数化测试用例:
import static org.junit.Assert.*; import java.util.Arrays;
import java.util.Collection; import junittest.Calculator1; import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* 参数化测试
* @author Administrator
*
*/
@RunWith(Parameterized.class)
public class Parametrictest {
public Parametrictest(int n1, int n2, int result) {
super();
this.n1 = n1;
this.n2 = n2;
this.result = result;
}
private static Calculator1 calculator1 = new Calculator1();
private int n1;
private int n2;
private int result;
@Parameters
public static Collection data(){
return Arrays.asList( new Object[][]{
{2,4,6},
{0,0,0},
{-3,9,6}
});
}
/**
* 以add为例进行测试
*/
@Test
public void add(){
int res = calculator1.add(n1, n2);
assertEquals(result,res);
}
}
Junit 测试基础的更多相关文章
- 【Android Api 翻译1】Android Texting(2)Testing Fundamentals 测试基础篇
Testing Fundamentals The Android testing framework, an integral part of the development environment, ...
- Android Texting(2)Testing Fundamentals 测试基础篇
Testing Fundamentals The Android testing framework, an integral part of the development environment, ...
- Java Junit测试框架
Java Junit测试框架 1.相关概念 Ø JUnit:是一个开发源代码的Java测试框架,用于编写和运行可重复的测试.它是用于单元测试框架体系xUnit的一个实例(用于java语言).主要 ...
- JUnit单元测试基础要点
JUnit单元测试基础要点 1.JUnit是一种测试代码的框架,测试的目的是:保证代码没错,而不是保证代码正确. 2.测试类一般不要和目标类放在一起,但编译成的class文件是放在一起的. 3.单元测 ...
- 002杰信-陌生的maven-web项目整改成我们熟悉的Web架构;classpath的含义;ssm框架的整合;junit测试
这篇博客的资源来源于创智播客,先在此申明.这篇博客的出发点是jk项目,传智的做法是Maven的web模板生成的,但是这样子的结构目录与我们熟知的Web项目的结构目录相差很大,所以要按照我们熟知的项目结 ...
- Maven运行JUnit测试(http://www.360doc.com/content/13/0927/15/7304817_317455642.shtml)
Maven单元测试 分类: maven 2012-05-09 15:17 1986人阅读 评论(1) 收藏 举报 maven测试junit单元测试javarandom 目录(?)[-] maven ...
- 一键自动生成 java junit 测试代码神器 gen-test-plugin 入门介绍
gen-test-plugin 我们日常编写代码的过程中,经常需要为代码编写测试案例. 随着对代码质量的要求越来越高,很多公司开始通过代码的测试覆盖率作为 QA 的一个评定指标. 本框架可以一键生成所 ...
- Android测试基础题(三)
今天接着给大家带来的是Android测试基础题(三). 需求:定义一个排序的方法,根据用户传入的double类型数组进行排序,并返回排序后的数组 俗话说的好:温故而知新,可以为师矣 packag ...
- 复利计算器(软件工程)及Junit测试———郭志豪
计算:1.本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30 客户提出: 2.如果按照单利计算 ...
随机推荐
- Java中Arrays作用
Arrays类是提供对数组进行排序.查询和修改等操作方法的工具类.(Arrays:尽可进行数组升序排序) 格式:Arrays.sort(数组名); Package Java; import java. ...
- HTML5地理定位-Geolocation API
HTML5提供了一组Geolocation API,来自navigator定位对象的子对象,获取用户的地理位置信息Geolocation API使用方法:1.判断是否支持 navigator.geol ...
- day21 04 三级菜单
day21 04 三级菜单 1.使用递归调用的方法 整体代码类型比较简单如下: menu={'北京':{'海淀':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑': ...
- Jbox 弹出窗口 子页面操作完成后关闭 父页面刷新
父页面js //父页面js <script> var isFreshFlag = '1'; //添加会议活动 function addMeetingAct(){ var attendVip ...
- Django——配置服务器上线
使用UWSGI和NGINX配置项目上线 首先你得有一个拿得出手的项目 其次,购买了域名,也备案成功了 将settings.py中的DEBUG设置为False 配置Uwsgi 在项目(哪里都可以)中创建 ...
- webdriver学习笔记(一):webdrive脚本打开firefox浏览器,报“AttributeError: module 'selenium.webdriver' has no attribu
按照网上提供的方法: 下载geckodriver之后解压缩到 Firefox安装目录 下 添加 Firefox安装目录 到 系统变量Path 重启pycharm 照此步骤执行后,仍然报同样的错.折腾了 ...
- Leetcode 211.添加与搜索单词
添加与搜索单词 设计一个支持以下两种操作的数据结构: void addWord(word) bool search(word) search(word) 可以搜索文字或正则表达式字符串,字符串只包含字 ...
- HDU 1564 找规律博弈
题目大意是: 从n*n的方格角落的一个起点出发,每次移到上下左右一个未曾到达过的位置,谁不能走了谁就输了 想了好久都想不出,看了大神的题解 Orz了 果然博弈不是脑残的游戏啊... 这里从起点出发,将 ...
- Python模块:time、datetime、random、os、sys、optparse
time模块的方法: 时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. struct_time时间元组,共有九个元素组.如下图: time.localtime([secs]): ...
- 【ZJOI2017 Round1练习】D8T3 stone(Nim游戏)
题意: 思路:与其类似的题是HDU5996 HDU5996为判定性问题,稍加改动就可以用来统计方案数 ..]of longint; v,cas,i,j,ans,tmp,n,s,k:longint; b ...