1.RTL(React Test Library)는 virtual DOM을 제공하지만
Jest는 Test runner를 사용하기 때문에
테스트를 찾거나 실행하거나 통과 여부를 결정하는 등의 작업이 가능하다.

테스트를 할 경우 Jest 외에도 Mocha 또는 Jasmine이 존재하지만
CRA에도 기본제공될 정도로 jest는 권장되며 효율적이고 사용이 간단하다.


2.CRA로 생성할 경우 기본적으로 npm test를 통해 1개의 테스트 통과를 볼 수 있는데
이것은 learn react라는 글자가 포함되어있는지를 묻는 테스트와
기본적으로 적혀있는 learn react라는 app.js에 의해서 나타나는 결과로
테스트 파일 내부를 수정하거나 app.js글자를 변경할 경우 fale이 뜨게 된다.

 
3.jest에는 Assertions(단언)라는 테스트 기능이 있는데
일반적으로 아래와 같은 형태를 가지고 있다.
expect(expect argument).matcher(matcher argument | nothing) 
expect argument에는 비교하고 싶은 대상을 넣고 matcher는 특정 기능을 확인하거나
matcher에 argument를 넣어 그 값 등과 비교하는 방식이다.


4.일반적인 Jest는 npm test를 통해 실행할 수 있으며
watch mode에서는 현재 커밋과 달라진 점을 비교해 달라진 부분에 대해서만 test를 시행한다.

또한 저장 등을 통해 내용이 변경될 경우 watch mode에서는 즉각적으로 다시 테스트를 실행하며
커밋 후 변경사항이 없거나 이전 변경사항들이 궁금할 경우에는
a(all)를 통해 모든 테스트를 확인할 수 있다.


5.jest에서 테스트를 진행하는 방식은 test 함수 내부에 
Assertions을 사용해 테스트하고 싶은 내용을 체크하고 
원하는 결과가 아닐 경우 Error를 발생하는 방식이다.

그렇기 때문에 빈 테스트 또는 맞는 테스트들의 경우에는 pass처리가 되고
맞는 테스트라도 throw new Error()를 할 경우 에러가 발생해 failed가 뜨는 것을 볼 수 있다.
결국 Assertions을 통해 문제가 발생하면 Error를 던지는 것이고
test는 Error여부를 감지하는 것이라고 요약할 수 있다.


6.test에는 아래와 같은 유형의 테스트가 있다. 

Unit test - 하나의 고립된 유닛을 테스트
Integration test - 여러 유닛들이 어떻게 같이 작동하는지 테스트
Functional Test - unit과 비슷하지만 코드가 아닌 기능을 중점으로 테스트
Acceptance test(End to End/E2E) - 실제 브라우저와 서버를 통해 테스트
                                  (Cypress, Selenium 등을 사용)

Unit test와 Function test의 중요한 차이점이라고 한다면

unit test는 외부와 단절시킨 환경이고 심지어 로컬 환경에서도 동작할 수 있지만

Functional test는 기능 확인을 위한 것이기 때문에 테스트 통과 여부와 기능 여부가 다를 수 있다는 점을 주의해야 한다.

 

실제 사용을 테스트하기 위해서는 Functional이 더 중요하지만 문제가 생길 경우 원인을 찾기 힘들고

Unit test는 실제 작동에 즉각적인 도움이 되지는 않지만 각 부분별 문제 책임을 쉽게 찾을 수 있다는 장점이 있다.





(1).백준 1012번 유기농 배추는 그래프 탐색의 대표적인 문제 중 하나였다.
밭을 표시하는 행렬에서 지렁이는 인접 배추를 돌아다니며 커버할 수 있다고 할 때
랜덤으로 배치된 배추밭에 지렁이가 몇마리가 필요한지를 구해야 했다.

하지만 문제는 단순히 그것만 있는 것이 아니고
그 문제가 하나의 테스트케이스로 여러개의 테스트케이스가 올 수 있음을 암시했기 때문에
밖에서 for문으로 한번 감싸서 해당 테스트케이스를 분리해줬고
matrix라는 배열을 선언한 다음 필드를 생성하고
지정된 배추들의 위치에 1을 표기해 배추가 있다는 것을 알렸다.

다시 내부 이중for문을 통해 전체 배열을 순회하며 
만약 해당 위치에 배추가 존재할 경우 earthwormChecker라는 함수를 통해
해당 위치에 인접한 모든 배추들을 추적하며 0으로 변경한 다음
지렁이 하나를 놓았다는 의미로 count에 1을 추가했다.

단순히 탐색이면 빠르게 해결할 수 있었을 것 같은데
생각할 부분이 늘어나서 matrix의 위치 등 이런저런 것을 고민하다가
시간이 예상보다는 많이 걸려버렸다.

const input = `2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5`.split('\n')

const result = []

const earthwormChecker = (x, y, matrix) => {
    stack = [[x, y]]
    while (stack.length) {
        const [x,y] = stack.pop()
        matrix[x][y] = 0
        if(matrix[x][y-1]){
            matrix[x][y-1] = 0
            stack.push([x,y-1])
        }
        if(matrix[x][y+1]){
            matrix[x][y+1] = 0
            stack.push([x,y+1])
        }
        if(matrix[x-1] && matrix[x-1][y]){
            matrix[x-1][y] = 0
            stack.push([x-1,y])
        }
        if(matrix[x+1] && matrix[x+1][y]){
            matrix[x+1][y] = 0
            stack.push([x+1,y])
        }
    }
}

for(let i = 1 ; i < input.length ; i++){
    const [xLength, yLength, iAdded] = input[i].split(' ').map(Number)
    const matrix = []
    let count = 0
    
    for(let j = 0 ; j < xLength ; j++){
        matrix.push(new Array(yLength).fill(0))
    }
    for(let j = i+1 ; j <= i+iAdded ; j++){
        const [x, y] = input[j].split(' ').map(Number)
        matrix[x][y] = 1
    }
    i+=iAdded
    for(let j = 0 ; j < xLength ; j++){
        for(let k = 0 ; k < yLength ; k++){
            if(matrix[j][k]){
                count++
                earthwormChecker(j,k,matrix)
            }
        }
    }
    result.push(count)
}

console.log(result.join('\n'))

'회고' 카테고리의 다른 글

[취업준비일지] - 122  (0) 2023.02.19
[취업준비일지] - 121  (0) 2023.02.18
[취업준비일지] - 119  (0) 2023.02.16
[취업준비일지] - 118  (0) 2023.02.15
[취업준비일지] - 117  (0) 2023.02.14

+ Recent posts