프로그래밍 언어/Java

[JUnit5] test code에서 Array 비교(assertarrayEquals vs assertEquals vs assertTrue)

hanrabong 2023. 1. 4. 14:53

 

 JUnit을 이용하여 test code를 짤 때 assertTrue와 assertEquals를 이용해서 원하는 값이 나오는지 테스트를 하곤 합니다. Array를 비교할 때는 어떤 method를 쓰는 것이 좋은지에 대해 비교해보려고 합니다. 

 

 assertTrue, assertArrayEquals, assertEquals 3개를 비교하려고 합니다. 저의 주관적인 생각이 들어가기에 원하는 상황에 원하는 method를 알아서 사용하면 됩니다.

 

 

코드는 다음과 같습니다.

public class ArrayTest {

    @Test
    public void compareArrayTest() {
        List<String> list1 = Arrays.asList("a", "b", "c", "d", "e", "f");
        List<String> list2 = Arrays.asList("a", "b", "e", "d", "e", "h");

        Assertions.assertAll(
                () -> { Assertions.assertArrayEquals(list1.toArray(), list2.toArray());},
                () -> { Assertions.assertTrue(Arrays.equals(list1.toArray(), list2.toArray()));},
                () -> { Assertions.assertEquals(list1, list2);});
    }
}

Assertions.assertAll() 을 사용한 이유는 중간에 테스트가 실패해도 모든 테스트를 다 돌리기 위하여 사용하였습니다. (한 줄씩 주석처리하고 하나씩 돌리면서 error를 찾는 건 너무 귀찮기 때문에...)

 

 

위의 코드가 발생시키는 error를 살펴보겠습니다.

 

 

assertTrue


org.opentest4j.AssertionFailedError: expected: <true> but was: <false>

 위의 에러는 assertTrue가 발생시키는 error 입니다. 해당 error를 보면 true로 예상했는데 false가 나왔다라는 정보를 알 수 있습니다. 이 외의 정보는 알 수가 없습니다.

 

 

assertArrayEquals


org.opentest4j.AssertionFailedError: array contents differ at index [2], expected: <c> but was: <e>

 위의 에러는 assertArrayEquals가 발생시키는 error 입니다. 해당 error를 보면 2번째 index에서 "c"를 예상했지만, "e"가 실제로 나왔다는 정보를 알 수 있습니다. 해당 정보를 통해서 2번째 index 값이 달라서 에러가 발생했음을 알 수 있습니다. 그러나 2번째 index 뒤로는 값이 같은지를 보장할 수는 없습니다.

 

 

assertEquals


org.opentest4j.AssertionFailedError: expected: <[a, b, c, d, e, f]> but was: <[a, b, e, d, e, h]>

 위의 에러는 assertEquals가 발생시키는 error 입니다. 해당 error를 보면 전반적인 array 값들을 볼 수 있고, 몇 번째 index 값들이 다른지 한 눈에 확인할 수 있습니다. array의 길이가 엄청 길면 직접 비교를 해줘야 하고, 최악의 경우에 길이가 10만이고 마지막 하나만 다를 경우 앞에서부터 비교를 해줘야 합니다.

 

 

 

요약


  에러 코드 장점 단점
assertTrue true or false   알 수 있는 정보가 너무 적다.
assertArrayEquals 몇 번 index 값이 다른지 보여준다.  몇 번째 index가 다른지 알기에 해당 index와 관련된 logic에만 집중하면 된다.

 method이름만으로도 array를 비교하는구나하고 유추 가능하다.
error가 난 index이후의 값들이 같은지 보장하지 않기에, 계속 error나면 매번 수정해줘야 한다.
assertEquals 전반적인 array 값을 다 보여준다.  몇 번 index의 값이 다른지 다 알기에 해당 index들의 logic에 집중하면 된다. array의 길이가 길면 직접 하나씩 비교하는데 비용이 든다.

 

3개의 method를 요약하자면 다음과 같습니다.

 

 

 저는 개인적으로 array를 비교할 때, assertArrayEquals를 사용할 것 같습니다. method 이름으로도 직관적으로 array를 비교하는구나 알 수 있고, 몇 번 index가 다른지 알려주기에 어떤 부분이 error를 발생시키는지 빠르게 확인할 수 있습니다. 

 

 

 

 

※ 궁금한 사항이나 잘못된 점 댓글 부탁드립니다.

'프로그래밍 언어 > Java' 카테고리의 다른 글

[Java] modifier(제어자)란?  (0) 2022.05.15
[JAVA] Java란? (JVM 아키텍처 (2))  (0) 2022.05.12
[JAVA] Java란? (JVM 아키텍처 (1))  (0) 2022.05.11