온라인 자바 테스트 입문 수준. 프로그램 테스트, JUnit. Java 테스트 전제조건

저는 소프트웨어 개발이 직업 그 이상이라고 믿습니다. 나는 나 자신을 매일 더 나아지기 위해 노력하는 장인이라고 생각합니다. 이를 수행하는 "가장 쉬운" 방법은 좋은 도구를 찾고 다음 질문에 답하는 것입니다.

  • 언제 Tool X를 사용해야 합니까?
  • 도구 X를 어떻게 사용해야 합니까?

자동화된 테스트는 소프트웨어 개발에서 매우 중요한 부분이지만 프로그래머 블로그에는 사용된 도구에 대한 게시물이 거의 없습니다. 이 동일한 기사를 통해 내 "도구 상자"를 살펴볼 수 있습니다. 단위 및 통합 테스트를 작성하는 데 사용하는 12개의 라이브러리와 프레임워크를 다루고, 이를 사용하는 방법을 이해하는 데 도움이 되는 페이지 링크를 제공하겠습니다.

내 도구 상자를 살펴보자

아래 설명된 도구를 사용하려면 먼저 통합 및 단위 테스트를 자동으로 실행하는 빌드를 설정해야 합니다. 이 주제에 관해 2개의 메모가 있습니다.

  • Maven을 사용한 통합 테스트는 다양한 디렉터리에서 통합 및 단위 테스트를 사용하여 Maven 빌드를 설정하는 방법을 설명합니다.
  • Gradle 시작하기: TestSets 플러그인을 사용한 통합 테스트는 Gradle에도 동일하게 적용됩니다.

이제 내 도구를 자세히 살펴볼 준비가 되었습니다. 더 쉽게 탐색할 수 있도록 카테고리로 나누었습니다.

통합 및 단위 테스트에 사용하는 12가지 도구는 다음과 같습니다.

테스트 실행

AssertJ는 유용한 오류 메시지가 포함된 주장을 작성하기 위한 유연한 API를 제공하고, 테스트 코드의 가독성을 향상시키며, 테스트를 원하는 도메인별 언어를 준수하는 실행 가능한 사양으로 전환할 수 있도록 해줍니다.

추가로:

  • 테스트에 Hamcrest 사용하기 Hamcrest를 사용하여 테스트를 작성하는 방법과 사용자 정의 모듈을 사용하여 기능을 확장하는 방법을 다룹니다.
  • 어설션을 도메인별 언어로 전환에서는 AssertJ에서 사용자 정의 어설션을 만드는 방법을 설명합니다.
  • 깔끔한 테스트 작성: 어설션을 도메인별 언어로 대체. JUnit의 표준 주장을 적절한 도메인별 언어를 사용하는 자체 주장으로 대체해야 하는 이유를 설명합니다.

데이터 액세스 코드 테스트

빠른 데이터베이스, 실행되는 통합 테스트 작성에 유용 로컬 머신개발자.

각 통합 테스트를 실행하기 전에 데이터베이스를 알려진 상태로 초기화하고 필요한 데이터로 데이터베이스를 채우는 데 사용할 수 있는 JUnit의 확장입니다. DbUnit에는 단점이 있지만 매우 유용한 도구, 테스트 데이터와 테스트 코드를 분리할 수 있습니다.

추가로:

  • DbUnit을 사용하여 테스트를 작성하기 위해 알아야 할 DbUnit의 주요 구성 요소에 대해 설명합니다.
  • 데이터 액세스 코드에 대한 최상의 테스트를 작성하기 위한 5가지 규칙을 제공합니다.

Java 프로그래머를 위한 테스트 작업을 찾는 동안 저는 흥미로운 사이트(Avast 사용자는 가지 말아야 합니다. 스크립트 트로이 목마가 감지되었으며 다른 사이트는 괜찮은 것으로 보입니다) - http://www.betterprogrammer.com을 발견했습니다. 가장 간단한 방법으로 Java 프로그래머의 자격을 테스트하지만 자동으로: 복잡성이 증가하는 여러 기능(메소드)을 작성하고 코드를 TextArea에 복사하는 기능을 제공합니다. 다음으로, 사이트 엔진은 작업에 대한 작업(단위 테스트 이상)을 수행하고 "속도-품질" 기준에 따라 특정 자격 지수를 계산하고 다음 형식으로 최종 점수를 제공합니다.

그런 다음 질문이 시작됩니다. 나는 내 인생에서 두 번째로 Java로 프로그래밍했으므로(따라서 복잡한 작업은 건너뛰었습니다), 이 테스트의 82%가 해당 레벨에 해당합니다. 자바가 아닌 프로그래머. 그렇다면 자바주니어, 자바프로그래머, 그리고 자바시니어는 얼마나 채용해야 할까요?! 어떤 결과를 기대할 수 있나요? 현재의자바 프로그래머 - 90, 95, 99? 그리고 마지막으로, "프로그래머"의 점수가 82점 미만이지만 그럼에도 불구하고 어떤 종류의 직업에 지원한다면 어떨까요?!

테스트가 항상 즐겁고 흥미로운 것은 아닙니다. 이 프로세스는 일반적으로 꽤 길며 때로는 단조로운 작업으로 가득 차 있습니다. 최근 프로그래머들은 표준 출력이나 디버거를 사용하여 Java 클래스를 테스트한 것 같습니다.

이 기사에서는 테스트 작성 프로세스를 크게 단순화하고 자동화하는 JUnit 4 라이브러리에 대해 설명합니다.

JUnit Framework의 주요 기능을 보여주기 위해 Java로 기본 클래스를 작성하고 이를 모의해 보겠습니다. 이 클래스에는 음수가 아닌 숫자의 계승과 두 숫자의 합을 찾는 두 가지 방법이 있습니다. 또한 클래스 인스턴스에는 메서드 호출 카운터가 포함됩니다.

공용 클래스 MathFunc ( int 호출; public int getCalls() ( 반환 호출; ) public long 계승(int 숫자) ( 호출++; if (숫자 1) ( for (int i = 1; i

이제 단위 테스트를 작성해 보겠습니다. 이를 위해 다양한 테스트 메서드가 포함된 클래스를 만듭니다. 당연히 클래스에는 일반 보조 메서드도 포함될 수 있습니다. 테스트 실행기가 누가 누구인지 확인하려면 테스트 메서드에 @Test라는 주석을 달아야 합니다.

주석에는 다음 매개변수가 있을 수 있습니다.

  • 예상 - 메소드에 의해 생성될 예외를 나타냅니다(아래 예 참조).
  • timeout - 몇 밀리초 후에 테스트 실행이 중지되고 실패한 것으로 간주됩니다.

특정 테스트를 건너뛰어야 함을 나타내려면 @Ignore 주석을 사용하여 표시하세요. @Test 주석을 간단히 제거할 수도 있습니다.

각 테스트 사례를 실행하기 위해 미리 생성된 클래스 인스턴스와 같은 일부 컨텍스트가 필요한 경우가 있을 수 있습니다. 그리고 실행 후에는 예약된 리소스를 해제해야 합니다. 이 경우 @Before 및 @After 주석이 필요합니다. @Before로 표시된 메소드는 각 테스트 케이스 이전에 실행되고, @After로 표시된 메소드는 각 테스트 케이스 후에 실행됩니다.

리소스의 초기화 및 릴리스를 모든 테스트 전후에 각각 한 번만 수행해야 하는 경우 @BeforeClass 및 @AfterClass 주석 쌍을 사용합니다.

다음은 여러 테스트 스크립트가 포함된 테스트 클래스 자체입니다.

공용 클래스 MathFuncTest ( private MathFunc math; @Before public void init() ( math = new MathFunc(); ) @After public void teeDown() ( math = null; ) @Test public void call() ( 주장Equals(0, math .getCalls()); math.factorial(1); 주장Equals(1, math.getCalls()); math.factorial(1); 주장Equals(2, math.getCalls()); ) @Test public void Factorial() ( 주장True(math.factorial(0) == 1); 주장True(math.factorial(1) == 1); 주장True(math.factorial(5) == 120); ) @Test(expected = IllegalArgumentException.class) public voidfactorialNegative() ( math.factorial(-1); ) @Ignore @Test public void todo() (asserTrue(math.plus(1, 1) == 3); ) )

호출 메소드는 호출 카운터의 유효성을 테스트합니다. 계승 방법은 일부 표준 값에 대해 계승이 올바르게 계산되었는지 확인합니다. FactorialNegative 메소드는 음수 계승 값에 대해 IllegalArgumentException이 발생하는지 확인합니다. todo 메서드는 무시됩니다. 코드를 실험할 때 @Ignore 주석을 제거해 보세요.

AssertTrue 메소드는 표현식의 결과가 true인지 확인합니다. 유용할 수 있는 다른 방법:

  • AssertEquals - 예상 결과와 수신된 결과가 일치합니다.
  • AssertNull - 표현식의 결과는 널입니다.
  • AssertNotNull - 표현식의 결과가 null과 다릅니다.
  • AssertSame - 예상 객체와 수신 객체가 동일한 객체입니다.
  • 실패 - 메서드가 AssertionError 예외를 생성합니다. 프로그램 실행이 진행되어서는 안 되는 곳에 추가합니다.

우리의 현대 세계 IDE는 프로젝트에서 테스트를 찾아 간단히 실행할 수 있습니다. 하지만 프로그램 코드를 사용하여 수동으로 실행하려면 어떻게 해야 할까요? Runner를 사용하면 텍스트 버전(junit.textui.TestRunner), 그래픽 버전(junit.swingui.TestRunner, junit.awtui.TestRunner)이 있습니다.

하지만 조금 더 현대적인 방법 JUnitCore 클래스를 사용합니다. MathFuncTest 클래스에 다음 기본 메서드를 추가합니다.

Public static void main(String args)에서 예외가 발생합니다( JUnitCore 러너 = new JUnitCore(); 결과 결과 = 러너.run(MathFuncTest.class); System.out.println("테스트 실행: " + result.getRunCount()); System.out.println("실패한 테스트: " + result.getFailureCount()); System.out.println("무시된 테스트: " + result.getIgnoreCount()); System.out.println("성공: " + result .성공적이었다()); )

그리고 실행 결과는 다음과 같습니다.

테스트 실행: 3개의 실패한 테스트: 0개의 무시된 테스트: 1개의 성공: true

더 많은 이전 버전 JUnit 테스트 클래스를 작성하려면 junit.framework.TestCase의 자손을 생성해야 했습니다. 그런 다음 문자열을 매개변수(메서드 이름)로 사용하고 이를 상위 클래스에 전달하는 생성자를 정의해야 했습니다. 각 테스트 방법은 접두사 테스트로 시작해야 했습니다. 리소스를 초기화하고 해제하는 데에는 setUp 및 TearDown 메서드가 사용되었습니다. 한마디로 공포. 글쎄, 이제 모든 것이 간단합니다.

오늘은 그게 다야. JUnit Framework가 여러분에게 많은 도움이 될 것이라고 확신합니다. 기사에 대한 의견과 질문을 환영합니다.




맨 위