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());
}
GO TO FULL VERSION