JavaRush /Java Blog /Random-KO /JavaRush용 JUnit 또는 집에서 테스트하는 방법에 대해 설명합니다.
Sdu
레벨 17

JavaRush용 JUnit 또는 집에서 테스트하는 방법에 대해 설명합니다.

Random-KO 그룹에 게시되었습니다
작업을 확인하기 위해 콘솔에 테스트 데이터를 수십 번 입력하는 데 지치셨나요? 고양이에 오신 것을 환영합니다. 고양이로 무엇을 할 수 있는지 알려드리겠습니다. 이 자료의 궁극적인 목표는 소스 코드를 변경하지 않고도 다양한 매개변수를 사용하여 해결되는 작업의 시작을 자동화하고 결과를 확인하는 것입니다. 제목에서 이미 이해하셨겠지만, 이 간단한 문제에 대한 주요 보조자는 JUnit 입니다 . 단위 테스트단위 테스트 에 대해 아직 들어보지 못했다면 잠시 휴식을 취하고 이러한 개념에 익숙해지는 것이 좋습니다. 다행스럽게도 인터넷에는 충분한 정보가 있습니다. 아니, 그러고 싶지 않아? 글쎄요, 무슨 일이 일어나고 있는지 이해하는 데 큰 문제가되지 않을 것이라고 생각합니다. 결국 테스트와 일반적인 테스트가 무엇인지 아십니까? 작업을 시작할 때마다 이 작업을 수행하고 초기 데이터를 입력하고 결과 결과를 예상했던 결과와 비교합니다.
안녕하세요, 월드 JUnit입니다!
JUnit이란 무엇입니까? 프로젝트 공식 웹사이트 에서 다음 설명을 읽을 수 있습니다.
JUnit은 반복 가능한 테스트를 작성하기 위한 간단한 프레임워크입니다. 단위 테스트 프레임워크를 위한 xUnit 아키텍처의 인스턴스입니다.
우리에게 이것은 우리 프로그램과 상호 작용하는 메소드가 있는 특별히 설계된 클래스를 작성하고 결과 결과를 참조 결과와 비교하고 일치하지 않으면 알려주는 기능을 의미합니다. 원리를 이해하려면 간단한 예를 생각해 보십시오. 보조 클래스가 있다고 가정해 보겠습니다. 그 중 하나의 메서드는 int 유형의 두 변수를 가져와 그 합계를 반환합니다. JavaRush용 JUnit 또는 집에서 테스트하는 방법에 대해 설명합니다.  - 1 이것이 우리가 테스트하려고 하는 기능입니다. 다행스럽게도 우리가 가장 선호하는 IDEA에는 신속하게 테스트를 생성하는 데 필요한 모든 것이 이미 포함되어 있습니다. 클래스 선언 줄에 커서를 놓고 "Alt + Enter"를 누르고 컨텍스트 메뉴에서 "테스트 생성"을 선택하기만 하면 됩니다 JavaRush용 JUnit 또는 집에서 테스트하는 방법에 대해 설명합니다.  - 2 . 테스트를 생성해야 하며 IDEA에서는 테스트 라이브러리(이 자료에서는 JUnit4를 사용합니다. 라이브러리 클래스를 프로젝트에 연결하려면 "수정" 버튼을 클릭해야 함), 테스트할 메서드 및 추가 항목을 선택할 것을 제안합니다. 옵션. JavaRush용 JUnit 또는 집에서 테스트하는 방법에 대해 설명합니다.  - 삼 IDE는 테스트 클래스 템플릿을 생성합니다. ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JavaRush용 JUnit 또는 집에서 테스트하는 방법에 대해 설명합니다.  - 4 메서드 본문만 채우면 됩니다. JUnit에서 제공하는 소위 "어설션(Assertions)" 메소드가 이를 수행하는 데 도움이 될 것입니다 . 단순화된 방식으로 이들의 작업은 다음과 같습니다: 예상 결과와 테스트 중인 메소드 호출 결과가 .assert* 메소드에 전달됩니다. 편의를 위해 설명 메시지를 첫 번째 매개변수로 추가할 수 있습니다. 테스트 중에 매개변수가 일치하지 않으면 이에 대한 알림을 받게 됩니다. 일반 클래스처럼 실행을 위해 테스트 클래스를 시작할 수 있습니다. 저는 Ctrl+Shift+F10 키 조합을 사용하는 것을 선호합니다 JavaRush용 JUnit 또는 집에서 테스트하는 방법에 대해 설명합니다.  - 5
작업을 지정하자
이론적으로는 모든 것이 간단하고 아름답지만 제안된 예의 맥락에서는 꼭 필요한 것은 아니며 컴퓨터가 두 개의 숫자를 추가한다고 믿을 수 있습니다. 우리는 JavaRush 학생들이 해결한 실제 문제가 어떻게 진행되는지에 더 관심이 있습니다. 예를 들어, 저는 사랑받는 level05.lesson12.bonus03을 수강하는 것을 제안합니다.
/* 알고리즘 문제 다음과 같은 프로그램을 작성하세요: 1. 콘솔에서 숫자 N > 0을 입력합니다. 2. 그런 다음 콘솔에서 N 숫자를 입력합니다. 3. 입력된 N 숫자의 최대값을 표시합니다. */
양수, 음수 및 혼합 집합에 대한 세 가지 테스트를 작성해야 합니다.
숲속으로 들어갈수록..
여기서 몇 가지 놀라움이 우리를 기다리고 있습니다. public class UtilApp { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); //напишите здесь ваш code int n; int maximum; /* Конечно же я не буду размещать решение задачи ;) Код приведенный тут переработан для наглядности, и не в коем случае не означает что он должен присутствовать в "правильном решении" */ System.out.println(maximum); } }
  • 프로그램 로직은 main() 메소드에 위치합니다.
  • 소스 데이터는 메소드에 전달되지 않고 키보드에서 입력됩니다.
  • main() 메서드는 결과를 반환하지 않고 콘솔에 출력합니다.
첫 번째 요점이 특별히 문제가 되지 않는다면(평소처럼 main() 메서드를 호출할 수 있음), 다음 두 가지 요점은 주제에 대해 더 깊이 파고들어 두뇌를 긴장하게 만듭니다. 문제에 대한 몇 가지 해결책을 찾았습니다.
  1. 최대값을 찾는 논리를 별도의 메서드로 이동합니다.
    • 장점: 리팩토링 측면에서 올바른 접근 방식
    • 단점: 프로그램은 코드, 불필요한 구조, 최소한 배열 또는 ArrayList가 추가됩니다(취향과 색상에 따라 다름...). 최대값을 찾는 메커니즘만 테스트되며 데이터 입력 및 출력은 확인되지 않습니다.
  2. System.in/System.out용 래퍼 작성.
    • 장점: 우리는 타사 라이브러리를 사용하지 않습니다.
    • 단점: 초보자를 위한 경로가 아닙니다. 테스트 구현의 상대적 복잡성, 테스트의 코드 양은 테스트 중인 작업의 코드 양보다 클 수 있습니다.
  3. 테스트를 위해 추가 라이브러리를 사용합니다.
    • 장점: 테스트의 코드가 깨끗하고 테스트 작성이 상대적으로 쉽습니다. 테스트 중인 클래스의 소스 코드는 변경되지 않습니다.
    • 단점: 프로젝트에 타사 라이브러리를 연결해야 합니다.
솔직히 저는 세 번째 옵션이 가장 마음에 들었기 때문에 한번 구현해 보도록 하겠습니다.
시스템 규칙
짧은 검색을 통해 http://stefanbirkner.github.io/system-rules/ 페이지로 이동했고 , 이것이 나에게 필요한 것임을 즉시 깨달았습니다.
java.lang.System을 사용하는 코드를 테스트하기 위한 JUnit 규칙 모음입니다.
그럼, 라이브러리를 다운로드해 봅시다 . 시스템 규칙이 작동하는 데 필요한 Commons IO 라이브러리를 다운로드합니다 . 두 라이브러리를 프로젝트에 연결하고(파일 -> 프로젝트 구조 -> 라이브러리 -> + -> Java) 조각을 시작합니다. 시작 후 작업은 콘솔에서 N+1 숫자를 입력하라는 메시지를 표시합니다. 여기서 첫 번째 숫자는 다음과 같습니다. 그를 따라갈 숫자는 얼마나 될까요? 시스템 규칙에서는 TextFromStandardInputStream 클래스가 이러한 목적으로 사용됩니다. 처음에는 이 유형의 필드를 테스트 클래스에 추가하고 @Rule 주석으로 표시해야 합니다. @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); 그런 다음 테스트 메서드에서 직접 필요한 데이터를 나타냅니다. systemInMock.provideText("4\n2\n6\n1\n3\n"); 보시다시피 숫자는 텍스트 형식으로 전송되며 하이픈 문자열 "\n"으로 구분됩니다. 이를 바탕으로 N은 4와 같을 것이며 숫자 {2, 6, 1, 3}에서 최대값을 찾을 것입니다. 다음으로 테스트 중인 클래스의 인스턴스를 만들고 main() 메서드를 호출해야 합니다. 우리 프로그램은 systemInMock에서 데이터를 읽고, 처리하고, 결과를 인쇄하며, 우리가 해야 할 일은 그것을 읽고 표준과 비교하는 것뿐입니다. 이를 위해 시스템 규칙은 StandardOutputStreamLog 클래스를 제공합니다. 지정된 유형의 필드를 추가합니다. @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); .getLog() 메서드를 사용하여 인쇄된 데이터를 읽을 수 있으며 개행 문자의 존재를 고려해야 하며 최종 옵션은 다음과 같습니다 assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); // or assertEquals("{2, 6, 1, 3}, max = 6", "6\r\n", log.getLog()); . 데이터 계층화를 피하려면 로그를 지워야 합니다. log.clear(); 내 테스트 클래스의 전체 텍스트: import org.junit.Rule; import org.junit.Test; import org.junit.contrib.java.lang.system.StandardOutputStreamLog; import org.junit.contrib.java.lang.system.TextFromStandardInputStream; import static org.junit.Assert.*; import static org.junit.contrib.java.lang.system.TextFromStandardInputStream.emptyStandardInputStream; public class UtilAppTest { @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); @Test public void testAddition() throws Exception { systemInMock.provideText("4\n2\n6\n1\n3\n"); UtilApp utilApp = new UtilApp(); utilApp.main(new String[]{}); assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); systemInMock.provideText("5\n-100\n-6\n-15\n-183\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{-100, -6, -15, -183, -1}, max = -1", "-1", log.getLog().trim()); systemInMock.provideText("3\n2\n0\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{2, 0, -1}, max = 2", "2", log.getLog().trim()); } } 우리는 시작하고 즐길 수 있습니다. -=!!! 중요!!!=- 이 자료는 정보 제공의 목적으로만 제공됩니다. 작업과 함께 패키지에 관련 없는 클래스가 있는 경우 서버에서 작업의 성공적인 테스트를 보장하지 않습니다. 확인 작업을 서버에 보내기 전에 불필요한 파일, 불필요한 클래스, 주석 처리된 코드 등 불필요한 모든 것을 제거하십시오. 생성한 테스트가 성공적으로 완료되었다고 해서 서버에서의 테스트가 성공적으로 완료된다는 보장은 없습니다. 나는 의도적으로 이론적 자료(단위 테스트 이론, JUnit 주석, 주장 등)를 씹지 않았습니다. 모든 자료는 텍스트에 제공된 링크에 있습니다. 아마도 여러분은 작업을 테스트하는 자신만의 방법이 있을 것입니다. 의견을 통해 이에 대해 기꺼이 논의하겠습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION