zoukankan      html  css  js  c++  java
  • JUnit----单元测试

    为什么进行单元测试?

    1. 重用测试, 应付将来实现的变化. 

    2. 明确指定我的东西是没问题的.

    Failure, error的区别?

    Failure只测试失败, Error指程序本身出错

    1. new ->java project: JUnit4

    2. src右键->new->class T, package: com.bjsxt.junit4

    package com.bjsxt.junit4;
    
    public class T {
    	public int add(int x, int y){
    		return x+y;
    	}
    
    	public int divide(int x, int y){
    		return x/y;
    	}
    }
    

    3. 包com.bjsxt.junit4 右键-> new->package-> com.bjsxt.junit4.test ->右键-> new->JUnit test case(New JUnit 4 test, name: TTest, class under test:T)->next -> 选择要测试的T方法->finish->选择默认的myeclipse 的jar 包, 

    4. build path->remove ... 删除原生jar, 添加自己下载的jar, build-> add external archieves.

    5. 打开TTest.java,编写测试代码:

    package com.bjsxt.unit4.test;
    
    import static org.junit.Assert.assertThat;
    import static org.hamcrest.Matchers.*;
    
    import org.junit.Test;
    
    import com.bjsxt.u2.T;
    
    public class TTest {
    
    	@Test
    	public void testAdd() {
    		int z = new T().add(5,3);
    		assertThat(z,is(8));
              assertThat(z, allOf(greaterThan(1), lessThan(10))); } }

    keep bar green to keep bugs clean.  

    如果不先删除包, 会出现如下错误:

    1. 使用上述is方法时提示错误, 需要引入hamcrest jar包(core和license包): 右键工程-> build path ,引入两个包

    然后发现出现: java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package

    因为hamcrest的包和junit4里的hamcrest包的classloader用的不是同一个.解决方法:

    把myeclipse自带的包都去掉, 引入自己的包junit即可.

    如果测试divide时出现异常怎么办?

    在annotation里加入expected的异常类型即可. 后面timeout是时间的判断

    	@Test(expected=java.lang.ArithmeticException.class, timeout=100)
    	public void testDivide() {
    		int z=new T().divide(5,0);
    	}
    

      

    Annotation:

    1. @Test : 测试方法 

    2. @Ignore: 被忽略的测试方法

    3. @Before: 每个测试方法之前运行  用法: 执行方法前打开某个文件

    4. @After: 每个测试方法之后运行    用法: 执行方法后关闭某个文件

    5. @BeforeClass: 所有测试方法之前运行  用法: 配置工作, 建立数据库连接等费时工作

    6. @AfterClass: 所有测试方法之后运行    用法: 比如关闭数据库

    例子:

    package com.bjsxt.junit4.test;
    
    import static org.hamcrest.Matchers.is;
    import static org.junit.Assert.*;
    
    import org.junit.After;
    import org.junit.AfterClass;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    import com.bjsxt.junit4.T;
    
    public class TTest {
    
    	@BeforeClass  //提前配置工作, 比如数据库连接等耗费时间的资源, 搭载复杂环境时
    	public static void beforeClass(){
    		System.out.println("BeforeClass");
    	}
    	
    	
    	@AfterClass   //关闭数据库连接
    	public static void afterClass(){
    		System.out.println("AfterClass");
    	}
    	
    	
    	@Before   //打开文件使用
    	public void before(){
    		System.out.println("before");
    		
    	}
    	@Test
    	public void testAdd() {
    		int z=new T().add(5,3);		
    		assertThat(z,is(8));		
    		//assertTrue("z is not bigger than 3",z>3);	
    	}	
    		
    	
    	//@Ignore
    	@Test(expected=java.lang.ArithmeticException.class, timeout=100)
    	public void testDivide() {
    		int z=new T().divide(5,0);
    	}
    	
    	@After   //关闭文件使用
    	public void after(){
    		System.out.println("after");
    		
    	}
    }
    

    结果:

    BeforeClass
    before
    after
    before
    after
    AfterClass
    

     还可以新建另一个类, User:

    package com.bjsxt.junit4;
    
    public class User {
    	public String getName(){
    		return "songhuiqiao";
    	}
    
    }
    

    在test包右键, 新建unit test, UserTest

    package com.bjsxt.junit4.test;
    
    import static org.junit.Assert.assertThat;
    import static org.hamcrest.Matchers.is;
    
    import org.junit.Test;
    
    import com.bjsxt.junit4.User;
    
    public class UserTest {
    
    	@Test
    	public void testGetName() {		
    		assertThat(new User().getName(),is("songhuiqiao"));
    	}
    
    }
    

      

    如果两个类同时运行的话, 在test包右键, run->configuration->run all:

  • 相关阅读:
    线上答题竞赛小程序
    成语答题小程序源码
    lua --- 局部变量
    lua --- 逻辑运算符小结
    Lua --- 输入一个数字,输出阶乘
    lua闭包实现迭代器遍历数组
    lua中的闭包概念的学习笔记
    Unity --- 纹理为什么要设置为2的N次方
    Unity --- 如何降低UI的填充率
    RPG游戏中如何判断敌人是否在玩家的攻击范围之内
  • 原文地址:https://www.cnblogs.com/wujixing/p/5403399.html
Copyright © 2011-2022 走看看