• 【单元测试】Junit 4(二)--eclipse配置Junit+Junit基础注解


    1.0 前言

    ​ 前面我们介绍了白盒测试方法,后面我们来介绍一下Junit 4,使用的是eclipse(用IDEA的小伙伴可以撤了)

    1.1 配置Junit 4

    1.1.1 安装包

    我们需要三个jar包:

    • org.junit_4.13.2.v20211018-1956.jar
    • org.hamcrest.core_1.3.0.v20180420-1519.jar
    • org.hamcrest-library-1.3.jar

    org.junit_4.13.2.v20211018-1956.jar和org.hamcrest.core_1.3.0.v20180420-1519.jar这两个jar包是eclipse自带的

    然后我们需要下一个org.hamcrest-library-1.3.jar

    1.1.2 创建Junit项目

    点击 new >> New >> Project

    img

    选择Java Project 点击next

    img

    输入项目名,选择jre,点击next

    img

    选择 Libraries >> Classpath >> Add Extemal JARs

    img

    选择之前我们的三个jar包,一般放在eclipsed的plugins目录,org.hamcrest-library-1.3.jar则在自己下载的目录(可以把下载下来的jar包也丢这里),点击Finish

    img

    我们新建一个文件夹存放junit代码

    img

    新建一个项目

    img

    编写Demo.java代码:

    public class Demo {
    	public int add (int a, int b) {
    		return a + b;
    	}
    	public int div (int a, int b) {
    		return a / b;
    	}
    }
    
    

    右键项目,new一个,这里没有junit,我们去其他里面找

    img

    在java下的junit,选择Test Case,点击next

    img

    选择junit4,选择目录到我们刚刚建的junit文件夹,选择Finish

    img

    在DemoTest.java中输入代码:

    import static org.junit.Assert.*;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class DemoTest {
    	
    	Demo demo;
    	
    	@Before
    	public void setUp() throws Exception {
    		demo = new Demo();
    	}
    	
    	@After
    	public void tearDown() throws Exception {
    		demo = null;
    	}
    	
    	@Test
    	public void testAdd() {
    		// 实例化一个类
    		Demo demo = new Demo();
    		// 期望值
    		int expetected = 2;
    		// 真实值
    		int trueValue = demo.add(1, 1);
    		// 断言方法
    		assertEquals(expetected, trueValue);
    	}
    
    	@Test
    	public void testDiv() {
    		// 实例化一个类
    		Demo demo = new Demo();
    		// 期望值
    		int expetected = 2;
    		// 真实值
    		int trueValue = demo.div(2, 1);
    		// 断言方法
    		assertEquals(expetected, trueValue);
    	}
    
    }
    
    

    运行

    image-20221102211733409

    1.2 Junit 4 注解

    1.2.1 测试用例相关的注解

    1.2.1.1 @Before

    public void setUp() throws Exception {
        // 初始化所需的资源
    }
    

    在每个测试方法之前执行,用以初始化需要初始化的资源

    1.2.1.2 @After

    @After
    public void tearDown() throws Exception {
        // 关闭资源
    }
    

    在每个测试方法之后执行,用以关闭需要初始化的资源

    1.2.1.3 @BeforeClass

    @BeforeClass
    public static void setup()  throws Exception {
        // 初始化资源
    }
    

    在所有方法执行之前执行,一般被用作执行计算代价很大的任务,如打开数据库连接。被@BeforeClass 注解的方法应该是静态的(即 static类型的)。

    1.2.1.4 @AfterClass

    @AfterClass
    public static void tearDown()  throws Exception {
        // 关闭资源
    }
    

    在所有方法执行之后执行,一般被用作执行类似关闭数据库连接的任务。被@AfterClass 注解的方法应该是静态的(即 static类型的)。

    1.2.1.5 @Test

    @Test
    public void test01() {
    	// 测试,断言等
    }
    

    包含了真正的测试代码,并且会被Junit应用为要测试的方法。

    @Test注解有两个可选的参数:

    • expected表示此测试方法执行后应该抛出的异常,(值是异常名)
    • timeout检测测试方法的执行时间

    1.2.1.6 @Ignore

    注释掉一个测试方法或者一个类,被注释的方法或类,不会被执行。

    注意:JUnite4的执行顺序:@BeforeClass > @Before > @Test1 > @After > @Before > @Test2 > @After ...... > @AfterClass

    1.2.1.7 示例

    import static org.junit.Assert.*;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class DemoTest {
        
    	@BeforeClass
    	public static void setup()  throws Exception {
    		// 这里初始化资源(如连接数据库)
    	}
        
    	@AfterClass
    	public static void tearDown()  throws Exception {
    		// 关闭资源()
    	}
    	
    	@Before
    	public void setUp() throws Exception {
    		System.out.println("SetUp.....");
    		// 这里初始化我们所需要的资源
    	}
    	
    	@After
    	public void tearDown() throws Exception {
    		System.out.println("Gone.....");
    		// 这里关闭我们的资源
    	}
    	
    	@Test
    	public void test01() {
    		// 测试1
    	}
    
    	@Ignore
    	@Test
    	public void test02() {
    		// 测试2
    	}
    
    }
    
    

    1.2.2 打包测试Suite相关的注解

    1.2.2.1 @RunWith(Suite.class)

    需要一个特殊的Runner, 因此需要向@RunWith注解传递一个参数Suite.calss。

    1.2.2.2 @Suite.SuiteClasses(...{xx.class, xx.class, ...})

    用来表明这个类是一个打包测试类,把需要打包的类作为参数传递给该注解即可。

    1.2.2.3 示例

    有了这两个注解之后,就已经完整的表达了所有的含义,因此下面的类无关紧要,随便起个类名,内容为空

    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    public class DemoTest {
    
    	@RunWith(Suite.class)
    	@SuiteClasses({Demo01.class, Demo02.class, Demo03.class})
    	public class AllTests {
    		
    	}
    }
    
    

    1.2.3 参数化测试相关的注解

    1.2.3.1 @RunWith(Parameterized.class)

    首先要为这种测试专门生成一个新的类,而不能与其他测试共用同一个类。

    这里不使用默认的Runner了,使用带有参数化功能的Runner。

    @RunWith(Parameterized.class)这条语句就是为这个类指定了ParameterizedRunner。

    这个需要和我们后面的@Parameters组合使用

    1.2.3.2 @Parameters

    放在方法上。

    定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果。

    定义测试数据的结合,就是下方的prepareData()方法,该方法可以任意命名,但是必须使用@Parameters标注进行修饰。

    这里需要注意:其中的数据是一个二维数组,数据两两一组,每组中的这两个数据,一个是参数,一个是预期的结果。比如第一组{2,4}中:2是参数,4是预期结果。这两数据顺序无所谓。

    然后,是构造函数,其功能就是对先前定义的两个参数进行初始化。这里要注意参数的顺序,要和上面的数据集合的顺序保持一致。(比如都是先参数后结果)

    那么这里我们还是看下面的例子吧

    1.2.3.3 示例

    import static org.junit.Assert.assertEquals;
    
    import java.util.Arrays;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.junit.runners.Parameterized;
    import org.junit.runners.Parameterized.Parameters;
    
    @RunWith(Parameterized.class)
    public class FibonacciTest {
    
        @Parameters(name = "{index}: fib({0})={1}")
        public static Iterable data() {
            return Arrays.asList(new Object[][] { 
                     { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }
               });
        }
    
        private int input;
        private int expected;
    
        public FibonacciTest(int input, int expected) {
            this.input = input;
            this.expected = expected;
        }
    
        @Test
        public void test() {
            assertEquals(expected, Fibonacci.compute(input));
        }
    }
    

    1.2.4 控制用例执行顺序相关的注解

    1.2.4.1 @FixMethodOrder

    控制测试方法的执行顺序的。

    该注解的参数是org.junit.runners.MethodSorters对象。

    枚举类org.junit.runners.MethodSorters中定义三种顺序类型:

    MethodSorters.JVM:按照JVM得到的方法顺序,即代码中定义的方法顺序。

    MethodSorters.DEFAULT:默认的顺序,以确定但不可预期的顺序执行。

    MethodSorters.NAME_ASCENDING:按方法名字母顺序执行。

    1.2.5 自定义规则Rule相关的注解

    1.2.5.1 @Rule和@ClassRule

    1. 什么是Rule实现

      Rule是一组实现了TestRule接口的共享类,提供了验证,监视TestCase和外部资源管理等能力。

      即,提供了测试用例执行过程中一些通用功能的共享能力,使不必重复编写一些功能类似的代码。

    2. JUnit4中包含两个注解:@Rule和@ClassRule

      用于修饰Field或返回Rule的Method。

    两者作用域不同:

    • @Rule的作用域是测试方法。
    • @ClassRule则是测试Class。

    1.2.5.2 JUnit提供了以下几个Rule实现,必要时也可以自己实现Rule

    • Verifier:验证测试执行结果的正确性。

    • ErrorCollector:收集测试方法中出现的错误信息,测试不会中断,如果有错误发生,测试结束后会标记失败。

    • ExpectedException:提供灵活的异常验证功能。

    • Timeout:用于测试超时的Rule。

    • ExternalResource:外部资源管理。

    • TemporaryFolder:在JUnit的测试执行前后,创建和删除新的临时目录。

    • TestWatcher:监视测试方法生命周期的各个阶段。

    • TestName:在测试方法执行过程中提供获取测试名字的能力。

    以上就是这节的全部内容,如有错误,还请各位指正!


    __EOF__

  • 本文作者: 还梦呦
  • 本文链接: https://www.cnblogs.com/hmy71/p/junit_2.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    前端面试指南之React篇(二)
    如何创建一个React组件并渲染到DOM中?
    从零搭建开发脚手架 本地事务和远程调用等操作的剥离
    OpenDataV低代码平台新增组件流程
    .Net之接口小知识
    C++【继承】
    怎么使用Git远程删除某个历史提交记录
    SpringSecurity基础:自定义登录和登出
    C语言,洛谷题,赦免战俘
    从Google Play下载APK到电脑的三种办法测试
  • 原文地址:https://www.cnblogs.com/hmy71/p/junit_2.html