0
点赞
收藏
分享

微信扫一扫

单元测试(二)JUnit


目录

​​一.什么是junit​​

​​二.引入maven环境​​

​​三.Assert 类​​

​​1.assertArrayEquals​​

​​2.assertEquals​​

​​3.assertNotNull​​

​​4.assertSame​​

​​5.assertTrue​​

​​6.assertFalse​​

​​7.assertNull​​

​​8. fail​​

​​四.执行过程-注解的使用​​

​​1.  ​​​​注解​​

​​2.忽略​​

​​3.时间测试​​

​​4.异常测试​​

5​​.参数化测试​​

​​五. assertThat--- Hamcrest ​​

 

一.什么是junit

     

     JUnit 是一个 Java 编程语言单元测试框架JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。

     JUnit 促进了“先测试后编码”的理念,强调建立测试数据的一段代码,可以先测试,然后再应用。这个方法就好比“测试一点,编码一点,测试一点,编码一点……”,增加了程序员的产量和程序的稳定性。

二.引入maven环境

           

<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>

三.Assert 类

 

序号

方法和描述

void assertEquals(boolean expected, boolean actual)

检查两个变量或者等式是否平衡

void assertFalse(boolean condition)

检查条件是假的

void assertNotNull(Object object)

检查对象不是空的

void assertNull(Object object)

检查对象是空的

void assertTrue(boolean condition)

检查条件为真

void fail()

在没有报告的情况下使测试不通过

 

  1.assertArrayEquals

JUnit为所有原始类型和对象以及(原始或对象的)数组提供了重载的断言方法。参数顺序是期望值,然后是实际值。

@Test
public void testAssertArrayEquals() {

byte[] expected = "trial".getBytes();

byte[] actual = "trial".getBytes();
//比较两个 数组是否相等 期望值和实际值
assertArrayEquals(" 期望值和实际值不一样", expected, actual);

//不一致的时候会报出来

// array lengths differed, expected.length=5 actual.length=6; arrays first differed at element [5];
// Expected :end of array
// Actual :49

}

运行结果

         

单元测试(二)JUnit_单元测试

2.assertEquals

检查两个变量或者等式是否平衡

 @Test
public void testAssertEquals() {


//如果期望值和实际值相等则通过测试
//如果期望值和实际值不相等则无法通过测试同时打印message数值
assertEquals("failure - String are not equa;", "test", "test");


}

运行结果

   

单元测试(二)JUnit_测试用例_02

 

3.assertNotNull

              检查对象不是空的


@Test
public void testAssertNotNull() {


// 断言某个值 不为空
//
// 如果为空就抛出异常
assertNotNull("should not be null", new Object());

assertNotNull("should not be null", null);
}

 

运行结果:

单元测试(二)JUnit_测试用例_03

 

4.assertSame

检查两个相关对象是否指向同一个对象

 @Test
public void testAssertSame() {


Integer aNumber = Integer.valueOf(111111);
//assertSame() 方法检查两个相关对象是否指向同一个对象
assertSame("should be same", aNumber, aNumber);

}

运行结果

 

单元测试(二)JUnit_单元测试_04

 

5.assertTrue

检查条件为真

@Test
public void testAssertTrue() {


assertTrue("failure -should be true", true);

}

   运行结果    

单元测试(二)JUnit_测试数据_05

6.assertFalse

则如果条件是false则通过测试,如果条件是true则为错误

 

 @Test
public void testAssertFalse() {


//assertFalse 则如果条件是false则通过测试,如果条件是true则为为错误
assertFalse("failure -should be false", true);

assertFalse("failure -should be false", false);


}

运行结果如下:

 

单元测试(二)JUnit_测试数据_06

7.assertNull

@Test
public void testAssertNull() {
//检查对象为空
assertNull("should be null", null);


}

运行结果如下:

单元测试(二)JUnit_测试用例_07

 

8. fail

在没有报告的情况下使测试不通过

单元测试(二)JUnit_数组_08

运行结果:

单元测试(二)JUnit_数组_09

四.执行过程-注解的使用

1.

注解

相关注释

@beforeClass

方法首先执行,并且只执行一次。

@afterClass

方法最后执行,并且只执行一次。

@before

方法针对每一个测试用例执行,但是是在执行测试用例之前。

@after

方法针对每一个测试用例执行,但是是在执行测试用例之后。

 

 

 

                                                                                                             在 before() 方法和 after() 方法之间,执行每一个测试用例。

 

package TestJunit4Demo;

import org.junit.*;

public class ExecutionProcedureJunit {


// beforeClass() 方法首先执行,并且只执行一次。
// afterClass() 方法最后执行,并且只执行一次。
// before() 方法针对每一个测试用例执行,但是是在执行测试用例之前。
// after() 方法针对每一个测试用例执行,但是是在执行测试用例之后。
// 在 before() 方法和 after() 方法之间,执行每一个测试用例。






@BeforeClass
public static void beforeClass() {
System.out.println("in before class");
}


@AfterClass
public static void afterClass() {
System.out.println("in after class");
}


@Before
public void before() {
System.out.println("in before");
}


@After
public void after() {
System.out.println("in after");
}

//test case 1
@Ignore
//如果该测试没有准备好,将不准备走这个测试用例
@Test(timeout = 100)
//timeout 参数和 @Test 注释一起使用。 @test(timeout)。
public void testCase1() throws InterruptedException {
System.out.println("in test case 1");
Thread.sleep(1000);
}

//test case 2

@Test(expected =Exception.class)
public void testCase2() throws Exception {
throw new Exception();
}




}

运行结果如下:

单元测试(二)JUnit_单元测试_10

 

 

2.忽略

有时可能会发生我们的代码还没有准备好的情况,这时测试用例去测试这个方法或代码的时候会造成失败。@Ignore 注释会在这种情况时帮助我们。

  • 一个含有 @Ignore 注释的测试方法将不会被执行。
  • 如果一个测试类有 @Ignore 注释,则它的测试方法将不会执行。

 

  //test case 1
@Ignore
//如果该测试没有准备好,将不准备走这个测试用例
@Test(timeout = 100)
//timeout 参数和 @Test 注释一起使用。 @test(timeout)。
public void testCase1() throws InterruptedException {
System.out.println("in test case 1");
Thread.sleep(1000);
}

运行结果:

单元测试(二)JUnit_junit_11

3.时间测试

        Junit 提供了一个暂停的方便选项。如果一个测试用例比起指定的毫秒数花费了更多的时间,那么 Junit 将自动将它标记为失败。timeout 参数和 @Test 注释一起使用。

 

@Test(timeout = 100)
//timeout 参数和 @Test 注释一起使用。 @test(timeout)。
public void testCase1() throws InterruptedException {
System.out.println("in test case 1");
Thread.sleep(1000);
}

运行结果:

单元测试(二)JUnit_junit_12

4.异常测试

抛出了想要得到的异常。expected 参数和@Test 注释一起使用

 @Test(expected =Exception.class)
public void testCase2() throws Exception {
throw new Exception();
}

运行结果:

单元测试(二)JUnit_单元测试_13

 

6.参数化测试

           允许开发人员使用不同的值反复运行同一个测试

 

@RunWith(Parameterized.class) 来注释 test 类。
               2.创建一个由 @Parameters 注释的公共的静态方法,它返回一个对象的集合(数组)来作为测试数据集合。
               3.创建一个公共的构造函数,它接受和一行测试数据相等同的东西。
               4.为每一列测试数据创建一个实例变量。
               用实例变量作为测试数据的来源来创建你的测试用例。

代码示例:

package TestJunit5Demo;


import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

import static org.junit.Assert.assertEquals;

@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {

//
// 用 @RunWith(Parameterized.class) 来注释 test 类。
// 创建一个由 @Parameters 注释的公共的静态方法,它返回一个对象的集合(数组)来作为测试数据集合。
// 创建一个公共的构造函数,它接受和一行测试数据相等同的东西。
// 为每一列测试数据创建一个实例变量。
// 用实例变量作为测试数据的来源来创建你的测试用例。


private Integer inputNumber;
private Boolean expectedResult;
private PrimeNumberChecker primeNumberChecker;

@Before
public void initialize() {
primeNumberChecker = new PrimeNumberChecker();
}

// Each parameter should be placed as an argument here
// Every time runner triggers, it will pass the arguments
// from parameters we defined in primeNumbers() method
public PrimeNumberCheckerTest(Integer inputNumber,
Boolean expectedResult) {
this.inputNumber = inputNumber;
this.expectedResult = expectedResult;
}

@Parameterized.Parameters
public static Collection primeNumbers() {
return Arrays.asList(new Object[][] {
{ 2, true },
{ 6, false },
{ 19, true },
{ 22, false },
{ 23, true }
});
}

// This test will run 4 times since we have 5 parameters defined
@Test
public void testPrimeNumberChecker() {
System.out.println("Parameterized Number is : " + inputNumber);
assertEquals(expectedResult,
primeNumberChecker.validate(inputNumber));
}






}

 

package TestJunit5Demo;

public class PrimeNumberChecker {


public Boolean validate(final Integer primeNumber) {
for (int i = 2; i < (primeNumber / 2); i++) {
if (primeNumber % i == 0) {
return false;
}
}
return true;
}




}

运行结果如下:

单元测试(二)JUnit_数组_14

 

五. assertThat--- Hamcrest 

Hamcrest 是一款用于校验的 Java 的单元测试框架,可以组合创建灵活的表达匹配器进行断言

提醒:

/** @Deprecated
// 因为在一个项目中,工程比较大,代码比较多,而在后续开发过程中,
// 可能之前的某个方法实现的并不是很合理,这个时候就要新加一个方法,
// 而之前的方法又不能随便删除,因为可能在别的地方有调用它,
// 所以加上这个注解,就方便以后开发人员的方法调用了。*/

单元测试(二)JUnit_测试数据_15

 

1.startsWith:匹配字符串以 XX 开头

 @Test
public void testHamcrest(){
//startsWith:匹配字符串以 XX 开头
assertThat("myStringOfNote", startsWith("my"));
}

 

2.containsString:匹配是否包含指定字符串

assertThat("myStringOfNote", containsString("ring"));

3.equalTo:基于传入对象的 equals 方法匹配方式,如果是数组比较每个元素是否相等。

        assertThat("foo", equalTo("foo"));
assertThat(new String[] {"foo", "bar"}, equalTo(new String[] {"foo", "bar"}));

4.allOf:匹配所有指定的匹配项,可指定多个匹配条件

assertThat("myValue", allOf(startsWith("my"), containsString("Val")));

5.anyOf:匹配其中任意一个匹配项,可指定多个匹配条件

assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))

6.both:两个选项都匹配

assertThat("fab", both(containsString("a")).and(containsString("b")))

7.either:匹配其中任意一个匹配项

assertThat("fan", either(containsString("a")).or(containsString("b")))

8.describedAs:自定义描述匹配

// describedAs( // 参数1:自定义描述,可以使用占位符%0,%1,%2... // 参数2:匹配器 // 参数3:自定义描述中需要替换的变量按先后顺序匹配);

assertThat(120,describedAs("自定义期望值:%0", equalTo(110), 120));

单元测试(二)JUnit_测试用例_16

9.everyItem:匹配现实 Iterable 接口类中的每个元素是否符合要求

 

assertThat(Arrays.asList("bar", "baz"), everyItem(startsWith("ba")))

10.instanceOf:匹配对象是属于哪个类

assertThat(new Canoe(), instanceOf(Canoe.class));

 

六.TestSuite

如果有多个测试类, 可以合并成一个测试套件进行测试, 运行一个 Test Suite, 那么就会运行在这个 Test Suite 中的所用的测试.
例如:

import org.junit.runner.RunWith;  
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith( Suite.class )
@SuiteClasses( { JUnitTest1.class, JUnitTest2.class } )
public class AllTests {

}

七.idea快捷方式的分享

在 CalculatorTest类名上按下 alt + enter 后, 就可以自动生成测试类了:

单元测试(二)JUnit_测试数据_17

 

 

 

 

举报

相关推荐

0 条评论