programing

모든 테스트가 최신 상태일 때 Gradle 테스트를 실행하는 방법

goodsources 2022. 8. 9. 23:00
반응형

모든 테스트가 최신 상태일 때 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그래들 조립은 물론...프로젝트 전체를 빌드하지 않고 테스트만 리셋할 수 있도록 하고 싶습니다.어떻게 하면 좋을까요?

한 가지 옵션은 다음과 같습니다.--rerun-tasks[작업 강제 실행]섹션의 플래그를 지정합니다.이렇게 하면 모든 테스트 작업과 관련된 작업이 재실행됩니다.

테스트 재실행에만 관심이 있는 경우 테스트를 실행하기 전에 그라들이 테스트 결과를 정리하도록 하는 것도 다른 방법입니다.이 조작은,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의 블로그 투고 Stop running your tests의 주제였다.작성자는 다음을 사용하여 예를 제시합니다.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()
}

블로그 투고 전체를 읽을 것을 권합니다.

--rerun-tasks는 동작하지만 모든 작업을 재실행하기 때문에 비효율적입니다.

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

이를 위한 최선의 방법은 다음과 같습니다.

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

다음은 명령줄을 수정하지 않는 경우의 "build.gradle" 파일을 사용하는 솔루션입니다.

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

그리고 여기 결과물이 있습니다.이전 출력에서2가지 변경에 주의해 주세요.

1) 새로운 '깨끗한'Test' 작업이 출력에 나타납니다.

2) '테스트'는 항상 청소되므로(즉, '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

,, 가, 가, 추, 추, 다, 다, 다, 다, 다, also, also, also, also, also,--rerun-tasks정말 장황합니다.그런 일은 없어. 작성하다--no-rerun-tasks 만들어 내다--rerun-tasks: " " " 의 경우cleanTask

TL;DR

test.dependsOn cleanTest

위의 방법 중 어느 것도 나에게 효과가 없었다.
가 있었던 은 캐시 하는 것 이었습니다./Users/<username>/.gradle/caches/build-cache-1/.

언급URL : https://stackoverflow.com/questions/29427020/how-to-run-gradle-test-when-all-tests-are-up-to-date

반응형