Java的Junit与debug模式入门

Posted 白日梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的Junit与debug模式入门相关的知识,希望对你有一定的参考价值。

1.Junit的使用入门

导入eclipse内置的junit—junit—junit相应的版本,方式1如下:

 

方式二使用maven加载如下(见后续maven):

 <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

倘若需要找依赖请到官网上查找,例如如下

https://junit.org/junit5/docs/current/user-guide/ 

 

2.Junit4的常用的方法

@Test  测试方法

@Ignorde  忽略的测试方法

@Before 在每一个方法测试之前运行

@After 在每一个方法之后运行

@BeforeClass 在所有测试方法之前运行,需要的静态的表达方式

@AfterClass  在所有测试方法之后运行,需要是静态的表达方式

public class JUnitTest {

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

        @Before   
        public void destroy() {
                 System.out.println("after");
        }


        @Test
        public  void test() {
                 System.out.println("test");
        }      

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

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

}//beforeClass   before   test   after   afterClass

所以顺序是beforeClass   before   test   after   afterClass

对于junit5的常用方法(较junit4表达略有不同)

@BeforeAll  只执行一次,在所有的测试方法之前运行(类似于 BeforeClass),需要是静态的方法。

@BeforeAll   只执行一次,在所有的测试方法之前运行(类似于 AfterClass),需要的静态的方法

@BeforeEach 在每个测试方法之前运行,类似于(@Before)

@AfterEach  在每个测试方法之后运行,类似于(@After)

@Test

@DisplayName 更改在测试界面显示的名称。

@Disabled  忽略(类似于@Ignore)

public class JUnitTest {

    @BeforeAll
        public static  void  initBefore() {
                 System.out.println("beforeall");
        }
   

    @AfterAll
    public static void  destroyAfter() {
            System.out.println("destroyAfter");
    }   

    @Test
    @DisplayName("testHello")
    public void test(){
            System.out.println("test");
    }

    @BeforeEach
    public void  testBeforeEach() {
            System.out.println("beforeEach");
    }   

    @AfterEach
    public void  testAfterEach() {
            System.out.println("afterEach");
    } 

    @Test
    @Disabled
    @DisplayName("testHello")
    public void test1(){
            System.out.println("test");
    }  
}

输出结果依次为

Beforeall   beforeEach   test   afterEach    destroyAfter

 

Failures test运行错误

Errors 程序自身的runtime错误

 

3.Junit的断言

public class JUnitAssert {

         @Test
           public   void standardAssertions() {
                assertEquals(2, 2);
                assertEquals(4, 4, "The optional assertion message is now the last parameter.");           assertTrue(\'a\' < \'b\', () -> "Assertion messages can be lazily evaluated -- "
                       + "to avoid constructing complex messages unnecessarily.");
                    }         

         @Test
          public  void groupedAssertions() {
                assertAll("person",
                    () -> assertEquals("John", "John"),
                    () -> assertEquals("Doe", "Doe")
                );
           }

        @SuppressWarnings("static-access")
        @Test
          public   void timeoutNotExceeded() throws InterruptedException {
             assertTimeout(Duration.ofSeconds(2), ()->{ new Thread().sleep(1000);});
            }       

        @Test
        public  void assertWithHamcrestMatcher() {
        assertThat(2 + 1, is(equalTo(3)));
        assertThat(2 + 1, not(3));
        /*相应还有containsString endsWith startWith equlTo equalToIgnoringCase  allOf(比某大且比某小)
         anyOf(满足一个条件即可)  greatThan(大于) lessThan(小于)closeTO  正负  hasKey(map集合) hasValue(map集合)等 
     这些方法导包有些麻烦,需要复制import static org.hamcrest.CoreMatchers.not后将not更改为相应的方法  */
    }
}

 

还有很多其他的方法 ,可以相应的去https://junit.org/junit5/docs/current/user-guide/查看

4.Debug模式

断点 debug测试相关按钮,或者鼠标右键debug as  表示运行到了这一步是方法进入方法里面,指向下一行 是方法不进入方法里边,指向下一行,运行到下一个断点从方法里面跳出来的下一行 不运行方法里边的后续代码行,返回到当前方法行的起始位置。

运行相关的变量参数表

运行相关的信息

 

5.unit4的问题点

public class TestUnitQuestion {
	private int i = 10;
	//没有输出,也不会报错
	@Test
	public  void test() {
		TestUnitQuestion volatileTest = new TestUnitQuestion();
		VolatileTestD volatileTestD1 = volatileTest.new VolatileTestD();
		VolatileTestD volatileTestD2 = volatileTest.new VolatileTestD();
		ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);
		newFixedThreadPool.submit(volatileTestD1);
		newFixedThreadPool.submit(volatileTestD2);
		newFixedThreadPool.shutdown();
	}

	// 每个线程自己有自己的内存,--验证共享内存机制
	class VolatileTestC implements Runnable {
		private boolean flag2 = true;

		@Override
		public void run() {
			flag2 = false;
		}
	}

	class VolatileTestD implements Runnable {
		@Override
		public void run() {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			while (i-- >0) {
				System.out.println(Thread.currentThread().getName() + ":" + i);
			}
		}
	}
}

 备注:Junit测试类线程执行睡眠sleep()后次线程后面的程序不能进行;因为junit执行的程序必须是激活状态的。而sleep是睡眠状态,一旦执行就会自动退出程序。

以上是关于Java的Junit与debug模式入门的主要内容,如果未能解决你的问题,请参考以下文章

Java基础| Debug模式及基础练习

一键自动生成 java junit 测试代码神器 gen-test-plugin 入门介绍

Junit 入门使用教程

java设计模式精讲 Debug 方式+内存分析

Java高级技术 单元测试(JUnit4)

Spring+JUnit4单元测试入门