Spock 테스트 프레임워크(+groovy) 정리

박두팔이·2023년 5월 5일
0

Groovy?

Groovy는 Java 가상 머신 상에서 동작하는 객체 지향적인 스크립트 언어로, Java와의 호환성이 뛰어나며 간결한 구문과 유연한 기능을 제공한다.

Groovy 사용하기

  • Groovy는 java가상머신(jvm)에서 실행된다. 따라서 java코드와 함께 사용할 수 있다.

Groovy 사용하는 이유?

  • Java와의 호환성: Groovy는 Java 가상 머신에서 실행되므로 Java와 완벽하게 호환된다. Java 코드와 Groovy 코드를 혼용하여 사용할 수 있으며, Java 라이브러리와 같이 사용할 수 있다.

  • 간결한 문법: Groovy는 Java보다 간결한 문법을 가지고 있다. Java에서 반복문을 작성할 때는 많은 코드를 작성해야 하지만, Groovy에서는 클로저와 메소드 참조 등의 기능을 사용하여 코드를 간결하게 작성할 수 있다.

  • 메타프로그래밍: Groovy는 메타프로그래밍 기능을 제공한다. 이를 사용하면 코드 생성, 동적 메소드 호출 등의 기능을 구현할 수 있으며, 코드의 재사용성과 유연성을 높일 수 있다.

  • 테스트 용이성: Groovy는 단위 테스트, 통합 테스트 등을 쉽게 작성할 수 있도록 다양한 테스트 프레임워크를 제공한다. 특히 Spock 프레임워크는 Groovy 기반으로 만들어졌으며, 테스트 코드를 작성하기 쉽고 가독성이 좋다.

  • 스크립팅 언어: Groovy는 스크립팅 언어로 사용할 수 있다. Groovy 스크립트를 사용하면 빠르게 프로토타입을 만들고, 작은 프로그램을 실행할 수 있다.

따라서 groovy를 사용할 경우 동적환경에서 개발할 때 매우 유용하다.


Spock 테스트 프레임워크

Spock 테스트 프레임워크의 주요장점

  • 가독성: Spock은 BDD 스타일의 테스트를 지원하므로, 테스트 코드를 읽고 이해하기 쉽다. 특히, given-when-then 구문을 사용하면 테스트 코드가 자연스러워져 가독성이 향상된다.

  • 간결성: Spock은 Groovy 언어를 기반으로 하기 때문에 Java 코드보다 간결하고 읽기 쉽다. 예를 들어, Spock에서는 JUnit에서 사용하는 @Before나 @After와 같은 메소드 대신 setup()과 cleanup() 메소드를 사용한다.

  • 유연성: Spock은 JUnit과 마찬가지로 매우 유연한 프레임워크이다. Mockito, PowerMock, Geb 등의 다른 라이브러리를 쉽게 통합하여 사용할 수 있다.

  • 효율성: Spock은 테스트 코드 작성을 더 빠르고 쉽게 만들어주는 다양한 기능을 제공한다. 예를 들어, 데이터 드리븐 테스트, Mock 객체 생성, Mock 객체의 메소드 호출 검증 등을 지원한다.

  • 문서화: Spock은 테스트 코드를 문서화하기 쉽다. 테스트 코드의 given-when-then 구문을 사용하면 코드가 자동으로 문서화된다. 또한, 테스트 실행 결과도 보기 쉽게 표시되어 문제를 빠르게 찾을 수 있다.

Spock 테스트 프레임워크를 사용하기 위해서는 Groovy언어로 작성해야 하는가?

  • 일단은 그렇다. Spock는 groovy언어의 기능을 활용하여 테스트 코드를 작성하기 때문에 Groovy에서 사용할 때 더욱 편리하다. 인텔리제이와 같은 Idea등에서도 spock 라이브러리를 사용할 수 있다. 이 때, java언어를 단독으로 사용할 경우 groovy에서 제공하는 기능들을 활용할 수 없기 때문에 Spock의 장점을 충분히 활용하지 못할 수 있다. 따라서 java언어와 groovy언어를 함께 사용하여 테스트코드를 작성하는 것이 좋다.

Spock 프레임워크 인텔리제이에서 사용하기

  • 프로젝트에 Spock 라이브러리를 추가한다. 이를 위해서는 프로젝트의 build.gradle 또는 pom.xml 파일에 Spock 라이브러리의 의존성을 추가해야 한다. 의존성은 다음과 같이 작성할 수 있다.
// Gradle: groovy
dependencies {
    testImplementation 'org.spockframework:spock-core:2.0-M4-groovy-3.0' //(1)

	testImplementation 'org.spockframework:spock-spring:2.0-M4-groovy-3.0' //(2)

}

Spock을 사용하기 위해서는 spock-core 라이브러리뿐만 아니라 spock-spring 라이브러리도 함께 추가해야한다.

spock-core는 Spock 프레임워크의 핵심 라이브러리이며, spock-spring은 Spring 프레임워크와 통합하기 위한 Spock 확장 라이브러리이다.

// Maven: xml
<dependency>
    <groupId>org.spockframework</groupId>
    <artifactId>spock-core</artifactId>
    <version>2.0-groovy-3.0</version>
    <scope>test</scope>
</dependency>
  1. Spock 테스트 클래스를 작성한다. 이때, 클래스 이름은 "Spec"으로 끝나야 한다. 예를 들어, "MyServiceSpec"과 같은 이름으로 작성할 수 있다.
    Spock 테스트는 Groovy 언어로 작성되며, Spock에서 제공하는 기능을 활용하여 테스트를 작성할 수 있다.

  2. Spock 테스트를 실행한다. 이를 위해 IntelliJ IDEA의 테스트 실행 기능을 사용할 수 있다. Spock 테스트 프레임워크는 JUnit과 마찬가지로 테스트 실행을 위한 메커니즘을 제공한다. 이 말은 즉, IntelliJ IDEA와 같은 통합 개발 환경에서 Spock 테스트를 실행할 때, JUnit과 유사한 방식으로 실행할 수 있다는 것을 의미한다.
    Spock 테스트는 JUnit Runner를 상속받아 작성된 Groovy 클래스로 구현되어 있으며, JUnit과 마찬가지로 각각의 테스트 메서드는 @Test 어노테이션으로 표시된다. 이러한 이유로, Spock 테스트를 실행하는 방법은 JUnit과 거의 동일하다.
    따라서, IntelliJ IDEA와 같은 통합 개발 환경에서 Spock 테스트를 실행할 때는 JUnit과 같은 실행 메커니즘을 사용하여 Spock 테스트를 실행할 수 있다. 이를 통해, Spock 테스트를 더욱 효율적으로 실행하고 관리할 수 있다.
    실행 결과는 IntelliJ IDEA의 테스트 결과 창에서 확인할 수 있다.

테스트 코드 작성예시

라이브러리에 의존성이 추가되었다면 이제는 Spock테스트 코드를 작성할 수 있다.

class MySpec extends spock.lang.Specification {
    def "addition test"() {
        expect:
        (1 + 2) == 3
    }

    def "division test"() {
        when:
        def result = 10 / 2

        then:
        result == 5
    }
}
profile
기억을 위한 기록 :>

0개의 댓글