[java] 단위 테스트를 작성하는 방법?

Java 클래스가 있습니다. 단위 테스트 는 어떻게 합니까?


제 경우에는 클래스가 이진 합계를 수행합니다. 두 개의 byte[]배열을 가져와 합한 다음 새로운 이진 배열을 반환합니다.



답변

  1. 올바른 입력으로 정상적인 경우에 필요한 예상 출력을 정의하십시오.

  2. 이제 클래스를 선언하여 테스트를 구현하고 이름을 지정하고 (보통 TestAddingModule과 같은) testAdd 메소드를 추가하십시오 (예 : 아래 중 하나).

    • 메소드를 작성하고 그 위에 @Test 주석을 추가하십시오.
    • 이 방법에서 이진 합계 및을 실행하십시오 assertEquals(expectedVal,calculatedVal).
    • 메소드를 실행하여 테스트하십시오 (Eclipse에서 마우스 오른쪽 단추를 클릭하고 실행 도구 → JUnit 테스트를 선택하십시오).

      //for normal addition 
      @Test
      public void testAdd1Plus1()
      {
          int x  = 1 ; int y = 1;
          assertEquals(2, myClass.add(x,y));
      }
  3. 원하는 경우 다른 사례를 추가하십시오.

    • 정수 오버플로가있는 경우 이진 합계에서 예기치 않은 예외가 발생하지 않는지 테스트하십시오.
    • 메소드가 널 입력을 정상적으로 처리하는지 테스트하십시오 (아래 예).

      //if you are using 0 as default for null, make sure your class works in that case.
      @Test
      public void testAdd1Plus1()
      {
          int y = 1;
          assertEquals(0, myClass.add(null,y));
      }

답변

이 게시물을 IntelliJEclipse 모두에 제공합니다. .

식:

프로젝트의 단위 테스트를 수행하려면 다음 단계를 따르십시오 (이 테스트를 작성하기 위해 Eclipse를 사용하고 있습니다).

1- 새로 작성-> Java 프로젝트를 클릭하십시오.

프로젝트 작성

2- 프로젝트 이름을 적고 완료를 클릭하십시오.

프로젝트 작성

3- 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오. 그런 다음 새로 작성-> 클래스를 클릭하십시오.

수업 만들기

4- 수업 이름을 적고 완료를 클릭하십시오.

수업 만들기

그런 다음 다음과 같이 수업을 완료하십시오.

public class Math {
    int a, b;
    Math(int a, int b) {
        this.a = a;
        this.b = b;
    }
    public int add() {
        return a + b;
    }
}

5- 파일-> 새로 작성-> JUnit 테스트 케이스를 클릭하십시오.

JUnite 테스트 작성

6- setUp ()을 확인하고 완료를 클릭하십시오. SetUp ()은 테스트를 초기화하는 장소입니다.

설정 확인 ()

7- 확인을 클릭하십시오.

JUnit 추가

8- 여기에 간단히 7과 10을 추가합니다. 따라서 답은 17이 될 것으로 예상합니다. 다음과 같이 테스트 클래스를 완료하십시오.

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class MathTest {
    Math math;
    @Before
    public void setUp() throws Exception {
        math = new Math(7, 10);
    }
    @Test
    public void testAdd() {
        Assert.assertEquals(17, math.add());
    }
}

9- 패키지 탐색기에서 테스트 클래스를 클릭하고 Run as-> JUnit Test를 클릭하십시오.

JUnit 테스트 실행

10- 테스트 결과입니다.

시험 결과

IntelliJ :
스크린 샷에 IntelliJ IDEA 커뮤니티 2020.1을 사용했습니다. 또한이 단계 전에 jre를 설정해야합니다. JDK 11.0.4를 사용하고 있습니다.

1- 프로젝트의 주 폴더-> 새-> 디렉토리를 마우스 오른쪽 버튼으로 클릭하십시오. 이것을 ‘테스트’라고해야합니다.
여기에 이미지 설명을 입력하십시오
2- 테스트 폴더를 마우스 오른쪽 버튼으로 클릭하고 적절한 패키지를 만듭니다. 원래 클래스와 동일한 패키징 이름을 만드는 것이 좋습니다. 그런 다음 테스트 디렉토리를 마우스 오른쪽 단추로 클릭하고-> 디렉토리를-> 테스트 소스 루트로 표시하십시오.
여기에 이미지 설명을 입력하십시오
3- 테스트 디렉토리의 올바른 패키지에서 Java 클래스를 작성해야합니다 (Test.java를 사용하는 것이 좋습니다).
여기에 이미지 설명을 입력하십시오
4- 생성 된 클래스에서 ‘@Test’를 입력하십시오. 그런 다음 IntelliJ가 제공하는 옵션 중에서 클래스 경로에 ‘JUnitx’추가를 선택하십시오.

5- 테스트 클래스에 테스트 방법을 작성하십시오. 메소드 서명은 다음과 같습니다.여기에 이미지 설명을 입력하십시오
여기에 이미지 설명을 입력하십시오

@Test
public void test<name of original method>(){
...
}

아래와 같이 어설 션을 수행 할 수 있습니다.

Assertions.assertTrue(f.flipEquiv(node1_1, node2_1));

다음은 내가 추가 한 수입품입니다.

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

여기에 이미지 설명을 입력하십시오

이것은 내가 쓴 테스트입니다.
여기에 이미지 설명을 입력하십시오

다음과 같이 방법을 확인할 수 있습니다.

Assertions.assertEquals(<Expected>,<actual>);
Assertions.assertTrue(<actual>);
...

단위 테스트를 실행하려면 테스트를 마우스 오른쪽 단추로 클릭하고 실행을 클릭하십시오.
여기에 이미지 설명을 입력하십시오

시험에 합격하면 결과는 다음과 같습니다.
여기에 이미지 설명을 입력하십시오

도움이 되길 바랍니다. GitHub https://github.com/m-vahidalizadeh/problem_solving_project 에서 프로젝트 구조를 볼 수 있습니다 .


답변

이것은 매우 일반적인 질문이며 답변 할 수있는 방법이 많이 있습니다.

JUnit을 사용하여 테스트를 작성하려면 테스트 케이스 클래스를 작성하고 테스트중인 클래스 / 모듈의 특정 기능을 테스트하는 개별 테스트 메소드를 작성하십시오 (단일 테스트 케이스 클래스는 일반적으로 단일 “프로덕션”클래스와 연관 됨) 이 방법 내에서 다양한 작업을 실행하고 결과를 올바른 것과 비교합니다. 가능한 많은 코너 케이스를 시도하고 다루는 것이 특히 중요합니다.

특정 예에서 예를 들어 다음을 테스트 할 수 있습니다.

  1. 두 양수 사이에 간단한 추가. 그것들을 추가 한 다음, 결과가 예상 한 것인지 확인하십시오.
  2. 양수와 음수 사이의 추가 (첫 번째 인수의 부호가있는 결과를 리턴 함).
  3. 양수와 음수 사이의 추가 (두 번째 인수의 부호가있는 결과를 리턴 함).
  4. 두 음수 사이에 추가.
  5. 오버플로로 인한 추가.

결과를 확인하기 위해 org.junit.Assert 클래스에서 다양한 assertXXX 메소드를 사용할 수 있습니다 (편의를 위해 ‘import static org.junit.Assert. *’를 수행 할 수 있음). 이러한 메소드는 특정 조건을 테스트하고 유효성이 검증되지 않으면 (선택적으로 특정 메시지와 함께) 테스트에 실패합니다.

사례의 테스트 케이스 클래스 예제 (메소드 내용이 정의되지 않은 경우) :

import static org.junit.Assert.*;

public class AdditionTests {
    @Test
    public void testSimpleAddition() { ... }


    @Test
    public void testPositiveNegativeAddition() { ... }


    @Test
    public void testNegativePositiveAddition() { ... }


    @Test
    public void testNegativeAddition() { ... }


    @Test
    public void testOverflow() { ... }
}

단위 테스트 작성에 익숙하지 않고 대신 “시각적으로”검증하는 임시 테스트를 작성하여 코드를 테스트하는 경우 (예를 들어, 키보드를 사용하여 입력 한 인수를 승인 한 다음 결과를 인쇄하는 간단한 기본 메소드를 작성 함) -그런 다음 값을 계속 입력하고 결과가 올바른 경우 자신을 확인)) 그런 다음 위의 형식으로 이러한 테스트를 작성하고 수동으로 수행하는 대신 올바른 assertXXX 방법으로 결과를 검증하여 시작할 수 있습니다. 이런 식으로 수동 테스트를 수행 한 경우 테스트를 훨씬 쉽게 다시 실행할 수 있습니다.


답변

@CoolBeans 언급처럼, 한 번 봐 걸릴 의 JUnit을 . 여기 짧은 튜토리얼이 있습니다 jUnit 4.x를 시작

마지막으로, 테스팅 및 TDD ( Test-Driven Development )에 대해 더 배우고 싶다면 Kent Beck의 다음 책을 살펴 보는 것이 좋습니다 : Test-Driven Development By Example .


답변

다른 답변에서는 JUnit을 사용하여 테스트 클래스를 설정하는 방법을 보여주었습니다. JUnit만이 유일한 Java 테스트 프레임 워크는 아닙니다. 그러나 프레임 워크 사용에 대한 기술적 세부 사항에 집중하면 작업을 안내 해야하는 가장 중요한 개념이 손상되므로 이에 대해 이야기하겠습니다.

  • 테스트 (모든 종류의 것들 중에서)는 실제 동작 (테스트 대상 시스템, SUT)을 예상되는 동작 과 비교합니다 .

  • 컴퓨터 프로그램을 사용하여 자동 테스트를 수행 할 수 있습니다. 이러한 비교는 융통성이없고 비 지능적인 컴퓨터 프로그램에 의해 수행되기 때문에, 예상되는 행동은 정확하고 명확하게 알려 져야합니다.

  • 프로그램이나 프로그램의 일부 (클래스 또는 메소드)가 수행해야 할 것은 사양 입니다. 따라서 소프트웨어를 테스트하려면 SUT에 대한 사양이 있어야합니다. 이것은 명백한 설명이거나 예상되는 것에 대한 암시 적 사양 일 수 있습니다.

  • 따라서 자동화 된 단위 테스트에는 테스트중인 클래스 또는 방법에 대한 정확하고 명확한 사양이 필요합니다.

  • 그러나 해당 코드를 작성하려고 할 때 해당 사양이 필요했습니다. 따라서 테스트에 관한 부분 중 일부는 실제로 SUT의 한 줄조차 쓰기 전에 시작됩니다. TDD (Test Driven Development)의 테스트 기술은 이러한 아이디어를 극도로 끌어 올릴 것이며 테스트 할 코드를 작성하기 전에 단위 테스트 코드를 작성해야합니다.

  • 단위 테스트 프레임 워크는 어설 션을 사용하여 SUT를 테스트합니다 . 어설 션은 SUT가 올바르게 동작 하는 논리 표현식 ( boolean결과 유형이 있는 표현식 , 술어 )입니다 true. 그러므로 규격은 주장으로 표현 (또는 표현)되어야한다.

  • 명세를 표명으로 표현하기위한 유용한 기술은 계약에 의한 프로그래밍 이다. 이러한 사양은 사후 조건 에 관한 것입니다 . 사후 조건은 메소드 또는 생성자에서 리턴 한 후 공개적으로 볼 수있는 SUT의 상태에 대한 주장입니다. 일부 메소드에는 불변 인 사후 조건이 있으며 이는 메소드 실행 전후에 적용되는 술어입니다. 클래스 도한다 따라서 클래스의 모든 생성자 및 방법의 사후이며, 불변,이라고 할 수 항상 사실을. 사후 조건 (및 불변)은 공개 가시성 상태 publicprotected필드 로만 표시됩니다.publicprotected메소드 (예 : 게터) 및 공개적으로 볼 수있는 객체의 상태 (참조에 의해)가 메소드에 전달됩니다.


많은 초보자들이 여기에 코드를 제시하고 코드의 사양을 명시하지 않고 코드를 테스트하는 방법을 묻는 질문을 게시합니다. 이 논의에서 알 수 있듯이, 잠재적 인 답변자가 최선을 다해 사양을 추측 해야하기 때문에 누구나 그러한 질문에 대한 정답을 제시하는 것은 불가능 합니다 . 아스 커 질문은 분명 사양의 중요성을 이해하지 못하는, 따라서 내가 여기에 설명한 기본을 이해할 필요가 초보자입니다 전에 몇 가지 테스트 코드를 작성하려고합니다.


답변