CodeGym /Java Course /모듈 3 /JUnit 주장

JUnit 주장

모듈 3
레벨 3 , 레슨 5
사용 가능

6.1 주장

어설션은 코드의 다른 위치에 삽입할 수 있는 특수 검사 입니다 . 그들의 임무는 무언가 잘못되었음을 확인하는 것입니다. 또는 오히려 모든 것이 제대로 진행되고 있는지 확인합니다. 이는 "필요에 따라" 제공되며 다양한 방식으로 설정할 수 있습니다.

위의 코드에서 이미 몇 가지 어설션을 접했습니다. 첫 번째는 개체가 같은지 확인하는 것입니다. 객체가 같지 않으면 예외가 발생하고 테스트가 실패합니다.

여기서 비교 순서가 중요합니다 . 최종 보고서의 JUnit은 "값 1이 수신되었지만 3이 예상됨"과 같은 내용을 작성하기 때문입니다. 이러한 검사의 일반적인 형식은 다음과 같습니다.

assertEquals(standard , meaning)

예:

@Test
public void whenAssertingEquality () {
    String expected = "3.1415";
    String actual = "3";

    assertEquals(expected, actual);
}

6.2 메소드 assertEquals, assertTrue, assertFalse

아래에는 가장 널리 사용되는 방법인 어설션이 나열되어 있습니다. 그들의 이름으로 그들이 어떻게 작동하는지 추측하는 것이 가능합니다. 그러나 어쨌든 간단한 설명을 작성하겠습니다.

assertEquals 두 개체가 같은지 확인
assertArrayEquals 두 배열에 동일한 값이 포함되어 있는지 확인합니다.
assertNotNull 인수가 null이 아닌지 확인
assertNull 인수가 null인지 확인
assertNotSame 두 인수가 동일한 객체가 아닌지 확인
어설션Same 두 인수가 동일한 객체인지 확인
어설트트루 인수가 참 인지 확인
주장거짓 인수가 거짓 인지 확인

이러한 방법 중 일부는 중복되는 것처럼 보입니다. assertTrue(a == b) 를 작성할 수 있는데 왜 assertSame(a, b) 를 사용합니까 ?

요점은 assert 가 매우 똑똑한 방법이라는 것입니다. 오류 정보를 로그에 기록하는 등 많은 유용한 작업을 수행합니다 . 첫 번째 경우에는 개체 A가 예상되었지만 개체 B가 수신되었다고 기록하고 두 번째 경우에는 단순히 true가 예상되었다고 기록합니다 .

수백 개의 테스트, 특히 전용 테스트 서버에서 실행되는 테스트가 있는 경우 자세한 로그가 있으면 큰 도움이 될 수 있습니다. 내 말을 이해한다고 생각합니다.

배열 비교 예:

@Test
public void whenAssertingArraysEquality() {
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();

    assertArrayEquals(expected, actual);
}

6.3 assertAll 메소드

위에서 언급했듯이 assert 메서드는 검사를 수행할 뿐만 아니라 비교 대상에 대한 많은 정보를 로그에 기록합니다.

비교해 보겠습니다.

Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());

그러나 매개변수 중 하나가 일치하지 않으면 나머지는 확인되지 않습니다. 그러나 나는 그것들이 계속 발생하고 그 결과가 로그에 기록되기를 바랍니다. 그러나 동시에 적어도 하나의 검사가 실패하면 테스트는 여전히 실패한 것입니다.

이를 위한 특별한 방법이 있습니다 - assertAll() . 첫 번째 인수로 로그에 기록할 주석과 여러 주장 함수를 사용합니다.

다음은 예제를 다시 작성하는 방법입니다.

Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
    () -> assertEquals("Washington", address.getCity()),
    () -> assertEquals("Oracle Parkway", address.getStreet()),
    () -> assertEquals("500", address.getNumber())
);

그런 다음 주소가 올바르지 않으면 다음과 같은 내용이 로그에 기록됩니다.

	Complex scenario comparison address (3 failures)
	expected: <Washington> but was: <Seattle>
    expected: <Oracle Parkway> but was: <Main Street>
    expected: <500> but was: <5772>

6.4 assertTimeout 방법

@Timeout 주석을 기억하십니까 ? 전체 메서드의 실행 시간을 제어할 수 있습니다. 그러나 때로는 메소드 내부의 코드 일부 실행에 대한 제한을 설정하는 것이 유용합니다. 이를 위해 assertTimeout()을 사용할 수 있습니다 .

첫 번째 파라미터로 시간이 전달되고 두 번째로 지정된 시간 내에 실행되어야 하는 코드(함수)가 전달됩니다. 예:

@Test
public void whenAssertingTimeout() {
    assertTimeout(
  	ofSeconds(2),
  	() -> {
    	// pause for one second
    	Thread.sleep(1000);
  	}
	);
}

Assert 클래스에는 assertTimeout() 메서드 의 12가지 변형이 있습니다 . 이에 대해 자세히 알아보려면 공식 문서를 참조하세요 .

6.5 assertThrows 메서드

특정 상황에서 코드가 올바른 예외를 throw하는지 확인해야 하는 상황이 매우 자주 있습니다. 즉, 오류를 감지하고 올바른 예외를 throw합니다. 이것은 매우 일반적인 상황입니다.

이 경우 또 다른 유용한 assert 메서드 가 있습니다 . 바로 assertThrows() 입니다 . 호출의 일반적인 형식은 다음과 같습니다.

assertThrows(exception , code)

기본적으로 assertTimeout() 메서드 와 매우 유사하며 지정된 코드가 올바른 예외를 throw하는지 확인합니다. 예:

@Test
void whenAssertingException() {
    Throwable exception = assertThrows(
  	IllegalArgumentException.class,
  	() -> {
      	throw new IllegalArgumentException("Exception message");
  	}
    );
    assertEquals("Exception message", exception.getMessage());
}
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION