[java] 모든 테스트가 최신 상태 일 때 Gradle 테스트를 실행하는 방법은 무엇입니까?

성적 스크립트를 설정했습니다. Gradle 빌드를 실행하면 모든 것이 작동하고 jUnit 테스트가 실행됩니다.

그 후 Gradle 테스트를 실행할 때 다음을 얻습니다.

C:\Users\..\..\Project>gradle test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE

수행 할 때 gradle clean물론 Gradle 빌드가 작동합니다 … 전체 프로젝트를 빌드하지 않고 테스트 만 재설정 할 수 있기를 원합니다. 어떻게해야합니까?



답변

하나의 옵션은 명령 행--rerun-tasks 에서 플래그를 사용하는 것 입니다. 이렇게하면 모든 테스트 작업과 테스트 작업이 종속 된 모든 작업이 다시 실행됩니다.

테스트를 다시 실행하는 데 관심이 있다면 테스트를 실행하기 전에 테스트 결과를 gradle로 정리하는 다른 옵션이 있습니다. 이 작업을 사용하여 수행 할 수 있습니다 cleanTest.

일부 배경-Java 플러그인은 다른 작업 각각에 대한 정리 작업을 정의합니다. 설명서 에 따르면 :

cleanTaskName- 지정된 작업으로 생성 된 파일을 삭제합니다. cleanJar는 jar 태스크로 작성된 JAR 파일을 삭제하고 cleanTest는 테스트 태스크로 작성된 테스트 결과를 삭제합니다.

따라서 테스트를 다시 실행하기 위해 필요한 cleanTest작업 은 다음과 같습니다.
gradle cleanTest test


답변

다른 옵션은 build.gradle에 다음을 추가하는 것입니다.

test.outputs.upToDateWhen {false}


답변

gradle test --rerun-tasks

작업 최적화가 무시되도록 지정합니다.

출처 : https://gradle.org/docs/current/userguide/gradle_command_line.html


답변

이것은 최근 Gradle의 블로그 게시물 테스트 재실행 중지 주제입니다 . 저자는 사용 예를 보여줍니다 outputs.upToDateWhen { false }그것이 잘못된 이유를 설명 :

이것은 실제로 재실행을 강요하지 않습니다

이 스 니펫의 저자가 말하고 싶었던 것은 “항상 내 테스트를 다시 실행하는 것”입니다. 그것은이 스 니펫이하는 것이 아닙니다. Gradle 이 출력 을 다시 만들 도록 강제로 작업을 오래된 것으로 표시합니다 . 그러나 빌드 캐시가 활성화 된 경우 Gradle은 출력을 다시 만들기 위해 작업을 실행할 필요가 없습니다. 캐시에서 항목을 찾고 결과를 테스트의 출력 디렉토리에 압축 해제합니다.

이 스 니펫도 마찬가지입니다.

test.dependsOn cleanTest

Gradle은 출력이 정리 된 후 빌드 캐시에서 테스트 결과의 압축을 풀므로 아무것도 다시 실행되지 않습니다. 요컨대,이 스 니펫은 비용이 많이 드는 no-op를 생성합니다.

“알겠습니다. 캐시도 비활성화하겠습니다”라고 생각하면 왜 안되는지 알려 드리겠습니다.

그런 다음 저자는 왜 일부 테스트를 다시 실행하는 것이 시간 낭비인지 설명합니다.

대부분의 테스트는 결정 론적이어야합니다. 즉, 동일한 입력이 주어지면 동일한 결과를 가져와야합니다.

코드가 변경되지 않은 테스트를 다시 실행하려는 경우 입력으로 모델링해야합니다. 다음은 블로그 게시물에서 입력을 추가하여 작업을 최신 확인 중에 사용하도록 표시하는 예제입니다.

task randomizedTest(type: Test) {
  systemProperty "random.testing.seed", new Random().nextInt()
}

task systemIntegrationTest(type: Test) {
  inputs.property "integration.date", LocalDate.now()
}

전체 블로그 게시물을 읽는 것이 좋습니다.


답변

명령 행을 수정하지 않으려는 경우 “build.gradle”파일을 사용하는 솔루션이 있습니다.

test {
    dependsOn 'cleanTest'
    //Your previous task details (if any)
}

출력은 다음과 같습니다. 이전 출력에서 ​​변경된 사항 2 개 :

1) 새로운 ‘cleanTest’작업이 출력에 나타납니다.

2) ‘test’는 항상 정리되므로 (즉, ‘UP-TO-DATE’는 절대로 사용하지 마십시오) 매번 실행됩니다.

$ gradle build
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:findMainClass
:jar
:bootRepackage
:assemble
:cleanTest
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
:check
:build


답변

--rerun-tasks 작동하지만 모든 작업을 다시 실행하므로 비효율적입니다.

cleanTest 캐시 자체로 인해 자체로는 충분하지 않을 수 있습니다.

따라서이를 수행하는 가장 좋은 방법은 다음과 같습니다.

./gradlew --no-build-cache cleanTest test


답변

또한 추가해야하는 --rerun-tasks것은 실제로 중복됩니다. 절대 일어나지 않습니다. 다음 --no-rerun-tasks을 만들 --rerun-tasks때 기본값을 지정하십시오.cleanTask