JavaRush /Java Blog /Random-KO /커피 브레이크 #87. 개발자에게 단위 테스트가 중요한 이유는 무엇입니까? Java에서 배열을 복사하는...

커피 브레이크 #87. 개발자에게 단위 테스트가 중요한 이유는 무엇입니까? Java에서 배열을 복사하는 5가지 방법

Random-KO 그룹에 게시되었습니다

개발자에게 단위 테스트가 중요한 이유는 무엇입니까?

출처: SearchSoftwareQuality 단위 테스트가 왜 중요하고 가치 있는지, 그리고 이것이 디버깅을 더 쉽게 만드는 방법에 대해 논의해 보겠습니다. 단위 테스트는 소프트웨어 품질을 향상시키는 강력한 도구입니다. 단위 테스트는 애플리케이션이 소프트웨어 사양을 준수하고 의도한 대로 작동하는지에 대한 기본적인 검증을 제공합니다. 커피 브레이크 #87.  개발자에게 단위 테스트가 중요한 이유는 무엇입니까?  Java에서 배열을 복사하는 5가지 방법 - 1잘 완료되면 단위 테스트는 다음과 같습니다.
  • 결함 수를 줄이고 개발 수명주기의 초기 단계에서 이를 식별합니다.
  • 코드 가독성을 향상시킵니다.
  • 코드 재사용을 허용합니다.
  • 배포 속도를 높입니다.
단위 테스트가 왜 중요한지, 이러한 유형의 테스트가 어떻게 시작되었는지, 구현에 대한 장벽이 무엇인지 살펴보겠습니다.

단위 테스트의 역사

초기 단계에서 오류를 감지하면 시간과 노력이 절약됩니다. 컴퓨터 역사의 첫 50년 동안 단위 테스트와 디버깅은 본질적으로 동일했습니다. 그러나 1990년대에는 코드가 너무 복잡해져서 시스템을 작은 부분으로 분할하여 개별적으로 실행하는 것이 종종 불가능했습니다. 1997년에 Kent Beck이라는 프로그래머가 작은 코드 조각을 테스트하기 위한 개발 환경 플러그인인 JUnit을 만들었습니다. 소스 코드를 평가하는 테스트 코드를 단위 테스트라고 합니다. 이러한 유형의 단위 테스트는 수년 동안 필수 요소가 되었습니다. Beck이 JUnit을 만든 후 Martin Fowler는 Refactoring이라는 책을 썼습니다. 이 책에서 그는 코드를 보다 격리되고 테스트 가능하게 만들기 위해 변환하는 방법을 제안했습니다. 코드 리팩토링과 단위 테스트의 결합으로 인해 테스트 중심 개발이 이루어졌으며, 여기서 단위 테스트 생성은 프로그래밍 프로세스에 필수적입니다. 그 안에서 코드는 생성되기 전에도 테스트 가능해야 합니다. 따라서 프로그래밍 프로세스는 단위 테스트가 실행될 때까지 완료되지 않습니다. 그런 다음 프로젝트는 시스템 또는 인간 수준의 연구 단계로 이동할 수 있습니다.

단위 테스트 예

이 예는 단위 테스트의 중요성을 보여줍니다. 여기서 JUnit은 온도를 화씨에서 섭씨로 변환하는 간단한 함수를 평가합니다. 변환 공식: C = (F-32) * 5/9. 함수 서명과 중괄호를 포함한 몇 줄만 코드에서 라이브러리 함수로 구현할 수 있습니다. 그러나 이것이 기준인지는 함수에서 명확하지 않습니다. 이러한 옵션에는 반올림 또는 내림, 실수, 상한 및 하한이 포함될 수 있습니다. Test::More 모듈을 사용하여 Perl에서 이 온도 변환 함수에 대한 예제 단위 테스트를 만들어 보겠습니다. 첫 번째 줄은 프로그래머에게 나머지 코드에서 무엇을 기대할지 알려주는 주석입니다.
# is (input, expected result, comment)
is( FtoC(32),0,'Freezing point is F32, C 0');
is( FtoC(212),100,'Boiling point is F212, C 100');
is( FtoC(59038),32767, 'Upper limit of C is 32767');
is( FtoC(59039),undefined, 'One past upper limit is error');
JUnit 프레임워크는 객체 지향 시스템과 테스트 객체에 의존하지만 개념은 유사합니다.

격리된 단위 테스트

단위 테스트의 이점 중 하나는 함수, 클래스 또는 메서드를 격리하고 해당 코드 부분만 테스트한다는 것입니다. 더 나은 개별 구성 요소는 전반적인 시스템 복원력을 제공합니다. 이렇게 하면 신뢰할 수 있는 코드를 얻을 수 있습니다. 단위 테스트는 디버깅 프로세스의 성격도 변경합니다. 버그를 수정하기 위해 프로그래머는 단순히 실패한 테스트를 작성한 다음 이전 기대치를 위반하지 않고 통과하도록 반복합니다. 이 프로세스는 설정, 재생성, 일시 중지 및 테스트를 통한 기존 디버깅의 수동 주기를 제거합니다. 단위 테스트에 적합하도록 코드를 변경하려면 프로그래머는 작업 방식을 변경해야 합니다. 단위 테스트 없이 작성된 코드는 적어도 개별 모듈로서 테스트되지 않은 것으로 간주될 가능성이 높습니다.

단위 테스트 적용

레거시 소프트웨어는 오랫동안 실행되어 왔으며 단위 테스트 없이 작성된 소프트웨어입니다. 레거시 코드는 회사에 가치가 있습니다. 수년 동안 안정적으로 작동합니다. 단위 테스트 없이 구축된 일부 프로그램은 하루에 백만 달러 규모의 트랜잭션을 처리합니다. 그러나 단위 테스트가 없는 코드는 수년 동안 많은 코드 유지 관리 프로그래머가 다루었기 때문에 시간이 지남에 따라 큰 흙덩이로 변합니다. 리팩토링을 통해 프로그래머는 시스템을 점진적으로 변경하여 테스트 가능하게 만들 수 있습니다. 그러나 이러한 변경에는 시간이 걸립니다. 몇 년 전 저는 동료 Bob Reselman과 레거시 애플리케이션에 대한 단위 테스트 사용 문제에 대해 논의했습니다. Reselman은 단위 테스트 없이 구축된 애플리케이션에서 단위 테스트를 구현하는 것은 비용이 너무 많이 들고 어리석기까지 한다고 주장했습니다. 대신 그는 조직이 단위 테스트를 통해 새로운 개발을 시작하고 레거시 애플리케이션을 그대로 두도록 권장했습니다. 이는 COBOL, 보고서 생성기 및 기타 애플리케이션에 해당될 수 있지만 최신 언어(C++, C#, Java 및 Ruby)로 작성된 애플리케이션에서는 소급하여 단위 테스트를 추가하는 것이 매우 쉽다고 생각합니다. 전체 애플리케이션에 대해 작성하는 대신 현재 변경 사항에 단위 테스트를 추가하고 진행하면서 리팩터링하면 됩니다.

속도, 품질 및 테스트 가능성 향상

프로젝트 관리자는 계획에는 품질, 완료된 작업량, 자원 및 시간 간의 균형이 필요하다고 말합니다. 한 영역에 뭔가를 추가하려면 다른 영역에서 뭔가를 빼야 합니다. 효과적인 단위 테스트는 이 규칙을 어깁니다. 이것이 바로 단위 테스트가 조직에 중요하고 가치 있는 이유입니다. 좋은 단위 테스트는 품질을 향상시키는 테스트 가능한 코드를 생성합니다. 이 코드에는 결함이 적습니다. 즉, 프로젝트를 더 빨리 완료하기 위한 버그 수정 횟수가 적다는 의미입니다. 소프트웨어에 버그가 발생하면 단위 테스트를 통해 디버깅, 수정 및 코드 작성 속도가 빨라집니다. 이는 결함이 다시 발생할 가능성을 크게 줄이는 동시에 코드의 품질과 속도를 향상시키는 방식으로 발생합니다. 소프트웨어 개발에 마법의 총알은 없지만 효과적인 단위 테스트는 개발, 테스트 및 일부 기능 요구 사항 엔지니어링의 속도를 높일 수 있습니다.

Java에서 배열을 복사하는 5가지 방법

출처: Dev.to 따라서 두 개의 배열 A와 B가 있고 A에서 B로 요소를 복사해야 합니다. 음, Java에서 이를 수행하는 다양한 방법이 있으며 지금 그 방법을 보여 드리겠습니다.

방법 1: ForLoop

이것이 우리에게 도움이 되는 오래된 for 루프가 있는 곳입니다 :
int[] A = {1,2,4,4};
int[] B = new int[];

 for (int i = 0; i < A.length; i++){
      B[i] = A[i];
}

방법 2: .clone()

어레이 복제 방법도 원하는 결과를 얻는 데 도움이 될 수 있습니다.
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

방법 3: System.arraycopy()

다음 방법은 java.lang 패키지 에 있는 System.arraycopy() 메소드를 사용하는 것입니다 . 사용을 진행하기 전에 서명에 대해 논의해 보겠습니다.
public static void arraycopy(
    Object src, //:source array, in this case A
    int srcPos, //:the start index for copy, typically 0
    Object dest, //:destination object in this case B.
    int destPos, //:the index to place the copied elements
    int length //:the length of the contents to be copied
);
애플리케이션:
int[] A = {1,2,4,4};
int[] B = new int[];

System.arraycopy(A, 0, B, 0, A.length);

방법 4: Arrays.copyOf()

우리가 논의할 다음 복사 옵션은 java.utils 패키지 의 Arrays 클래스입니다 . 그의 서명에 주목하세요:
public static int[] copyOf(
    int[] original, // :source array in this case A
    int newLength // :the length of the contents to be copied
);
애플리케이션:
int[] A = {1,2,4,4};
int[] B = Arrays.copyOf(A, 3);

방법 5: Arrays.copyOfRange()

따라서 이것이 이번 포스팅에서 살펴볼 마지막 옵션이 될 것입니다. 이는 java.utils 패키지 에 있는 Arrays 클래스 에서도 가져온 것입니다 . 그의 서명을 다시 살펴보겠습니다.
public static int[] copyOfRange​(
    int[] original, // :source array in this case A
    int from,  //:the start index for copy, typically 0
    int to // the end index exclusive
);
애플리케이션:
int[] A = {1,2,3,4,5,6,7};
int[] B = Arrays.copyOfRange(A, 0, A.length);
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION