24.06.17 월 TIL(Today I Learned)

신민금·2024년 6월 17일
0
post-thumbnail

TIL(Today I Learned)

: 매일 저녁, 하루를 마무리하며 작성 !
: ⭕ 지식 위주, 학습한 것을 노트 정리한다고 생각하고 작성하면서 머리 속 흩어져있는 지식들을 정리 !


알고리즘 코드카타

  • 문제 설명
    수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
    1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
    2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
    3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
    1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
  • 제한사항
    시험은 최대 10,000 문제로 구성되어있습니다.
    문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
    가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        int[] first = {1,2,3,4,5}; 
        int[] second = {2,1,2,3,2,4,2,5}; 
        int[] third = {3,3,1,1,2,2,4,4,5,5}; 
        int[] score = {0,0,0}; 
        
        
        for(int i=0; i<answers.length; i++) {
            if(answers[i] == first[i%5]) score[0]++;
            if(answers[i] == second[i%8]) score[1]++;
            if(answers[i] == third[i%10]) score[2]++;
        }
        
        
        int max = Math.max(score[0], Math.max(score[1], score[2]));
        
        
        List<Integer> answ = new ArrayList<Integer>();
        for(int i=0; i<score.length; i++) if(max == score[i]) answ.add(i+1);
        
        int[] answer = new int[answ.size()];
        for(int i=0; i<answ.size(); i++){
            answer[i] = answ.get(i);
        }

        return answer;
    }
}

Why: 아래 질문을 고민해보고 답변을 함께 제출

1. 통합 테스트와 단위 테스트의 차이점에 대해서 설명해주세요.

  • 단위 테스트(Unit Test)와 통합 테스트(Integration Test)는 소프트웨어 테스트의 두 가지 주요 유형

  • 단위 테스트 (Unit Test) :
    정의 : 소프트웨어의 가장 작은 단위인 함수나 메서드를 개별적으로 테스트
    목적 : 각 단위가 독립적으로 올바르게 작동하는지 확인
    특징 : 독립적이고 격리된 환경에서 실행되며, Mock이나 Stub을 사용하여 외부 의존성을 대체

  • 통합 테스트 (Integration Test):
    정의 : 여러 소프트웨어 모듈이 결합되어 상호 작용하는 방식을 테스트
    목적 : 개별 단위가 통합될 때 발생할 수 있는 문제를 발견하고, 모듈 간의 상호 작용이 올바른지 확인
    특징 : 실제 환경과 유사한 설정에서 여러 모듈이 함께 동작하는 것을 확인

2. 통합 테스트과 단위 테스트의 장/단점에 대해서 설명해주세요.

  • 단위 테스트의 장점 :
    빠른 피드백 제공 : 빠르게 실행되어 개발자에게 즉각적인 피드백을 제공
    문제의 정확한 위치 파악 : 문제가 발생한 단위를 쉽게 파악할 수 있다.
    쉬운 유지보수 : 코드베이스가 변경될 때 영향을 쉽게 확인할 수 있다.

  • 단위 테스트의 단점 :
    외부 종속성 테스트의 어려움 : 외부 시스템이나 데이터베이스와의 상호 작용을 테스트하기 어렵다.
    제한된 범위 : 시스템 전체의 작동을 보장하지 않으며, 모듈 간의 상호 작용 문제를 발견하기 어렵다.

  • 통합 테스트의 장점 :
    모듈 간 상호 작용 확인 : 시스템의 여러 부분이 함께 작동하는 방식을 테스트할 수 있다.
    실제 환경 시뮬레이션 : 실제 사용 환경과 유사한 조건에서 테스트를 수행할 수 있다.

  • 통합 테스트의 단점:
    느린 실행 시간 : 많은 모듈을 포함하고 실제 환경과 유사하게 설정해야 하므로 실행 시간이 길어질 수 있다.
    디버깅의 어려움 : 문제가 발생했을 때 어느 모듈에서 문제가 발생했는지 파악하기 어려울 수 있다.

3. 레이어별로 나누어서 Slice Test 를 하는 이유에 대해서 설명해주세요.

  • 빠른 피드백 : 단일 레이어만 테스트하므로 테스트가 빠르게 실행

  • 문제의 정확한 위치 파악 : 특정 레이어에서 발생하는 문제를 쉽게 찾을 수 있다.

  • 효율적 리소스 사용 : 전체 애플리케이션을 로드하지 않고 필요한 부분만 테스트하여 리소스를 효율적으로 사용

  • 유지보수 용이성 : 코드 변경 시 영향을 받는 특정 레이어만 테스트하여 변경의 영향을 신속히 확인할 수 있다.

4. 테스트 코드를 직접 짜보고 나서 느낀 테스트 필요성을 적어주세요.

  • 신뢰성 확보 : 코드 변경이나 기능 추가 시 기존 기능이 올바르게 작동하는지 확인할 수 있어 코드에 대한 신뢰성이 높아졌다.

  • 버그 사전 발견 : 개발 초기 단계에서 버그를 발견하고 수정할 수 있어 나중에 발생할 수 있는 문제를 미리 방지

  • 리팩토링 지원 : 코드를 리팩토링할 때 기존 기능이 깨지지 않도록 보장해주어 마음 놓고 리팩토링할 수 있다.

  • 문서화 역할 : 테스트 코드가 일종의 문서 역할을 하여 코드의 동작 방식과 의도를 이해하는 데 도움

5. 테스트 코드를 짜면서 어려웠던 점을 적어주세요.

  • Mocking의 복잡성

  • 테스트 커버리지 확보

  • 의존성 관리

  • 실제 환경과의 차이

profile
야옹

0개의 댓글