Jak przeprowadzić testy JUnit w Gradle?

99

Obecnie mam następujący plik build.gradle :

apply plugin: 'java'

sourceSets {
    main {
        java {
            srcDir 'src/model'
        }
    }
}

dependencies {
    compile files('libs/mnist-tools.jar', 'libs/gson-2.2.4.jar')
    runtime fileTree(dir: 'libs', include: '*.jar')
}    


Ten plik build.gradle jest przeznaczony dla mojego repozytorium tutaj . Wszystkie moje główne pliki znajdują się w src / model /, a ich odpowiednie testy znajdują się w test / model .

Jak poprawnie dodać zależność JUnit 4, a następnie uruchomić te testy w folderach testy / model ?

Wang-Zhao-Liu Q
źródło

Odpowiedzi:

107

Jak poprawnie dodać zależność junit 4?

Zakładając, że rozstrzygasz w oparciu o standardowe repozytorium Maven (lub równoważne):

dependencies {
    ...
    testCompile "junit:junit:4.11"  // Or whatever version
}

Uruchomić te testy w folderach testy / model?

Definiujesz zestaw źródeł testowych w ten sam sposób:

sourceSets {
    ...

    test {
        java {
            srcDirs = ["test/model"]  // Note @Peter's comment below
        }
    }
}

Następnie wywołaj testy jako:

./gradlew test

EDYCJA: Jeśli zamiast tego używasz JUnit 5, musisz wykonać więcej kroków, postępuj zgodnie z tym samouczkiem .

Oliver Charlesworth
źródło
8
srcDirs = ["test/model"]jest nieco bardziej precyzyjny, ponieważ usuwa domyślny katalog źródeł testowych, podczas gdy srcDir "test/model"dodaje inny katalog. To samo dotyczy mainzestawu źródłowego.
Peter Niederwieser,
49

Jeśli skonfigurujesz swój projekt z domyślną strukturą pakietu Gradle, tj .:

src/main/java
src/main/resources
src/test/java
src/test/resources

wtedy nie będziesz musiał modyfikować sourceSets, aby uruchomić testy. Gradle zorientuje się, że klasy i zasoby testowe znajdują się w src / test. Możesz wtedy biec, jak mówi Oliver powyżej. Jedna uwaga: zachowaj ostrożność podczas ustawiania plików właściwości i uruchamiania klas testowych zarówno w gradle, jak i w IDE. Używam Eclipse, a gdy uruchamiam z niego JUnit, Eclipse wybiera jedną ścieżkę klas (katalog bin), podczas gdy gradle wybiera inną (katalog kompilacji). Może to prowadzić do nieporozumień, jeśli edytujesz plik zasobów i nie zobaczysz zmiany odzwierciedlonej w czasie wykonywania testu.

DivDiff
źródło
2
Aby skierować pliki kompilacji Eclipse do tego samego katalogu, co Gradle (może zapobiec kilku frustrującym błędom): Projekt -> Właściwości -> Ścieżka kompilacji Java -> Domyślny folder wyjściowy: zamień „bin” na „build”. Jednak… z mojego doświadczenia wynika, że ​​ma to niepokojący zwyczaj „wracania” do domyślnego „pojemnika” co jakiś czas nieoczekiwanie. Byłoby miło wiedzieć, czy istnieje sposób, aby Eclipse używał domyślnie opcji „build”.
mike gryzoń
2
@ mike-rodent, o ile wiem, wyraźnie odradza się udostępnianie tej samej ścieżki budowania dla zaćmienia i gradle (patrz np. discuss.gradle.org/t/ ... )
mtraut
OK, poprawione! ... i przypuszczam, że nie ma nic do zyskania dzięki kompilacji do tego samego reż. W większości przypadków funkcja kreatora eclipse staje się zwykłym narzędziem do weryfikacji: „ups, to się nie skompiluje z powodu x, y i z”.
mike gryzoń
1
@DivDiff moja struktura folderów src jest skonfigurowana w taki sam sposób, jak wspomniano powyżej, ale mimo to, kiedy wykonuję test gradle, nic nie robi. W ogóle nie uruchamia moich testów. Dowolny pomysł?
Gaurav
@Gaurav, zaprosiłem Cię na czat, abyśmy mogli porozmawiać o tym offline.
DivDiff
16

Jeśli stworzyłeś swój projekt za pomocą Spring Initializr , wszystko powinno być poprawnie skonfigurowane, a jedyne co musisz zrobić to uruchomić ...

./gradlew clean test --info
  • Upuść, --infojeśli nie chcesz widzieć wyników testu.
  • Porzuć, cleanjeśli nie chcesz ponownie uruchamiać testów, które przeszły już od ostatniej zmiany.

Zależności wymagane build.gradledo testowania w Spring Boot ...

dependencies {
    compile('org.springframework.boot:spring-boot-starter')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

Z jakiegoś powodu program uruchamiający testy nie informuje o tym, ale generuje raport HTML w formacie build/reports/tests/test/index.html.

Brent Bradburn
źródło
0

testCompile jest przestarzała. Zgodność z Gradle 7:

dependencies {
...
   testImplementation 'junit:junit:4.13'
}

a jeśli używasz domyślnej struktury folderów (src / test / java / ...), sekcja testowa wygląda po prostu:

test {
    useJUnit()
}

Wreszcie:

gradlew clean test

Zobacz też: https://docs.gradle.org/current/userguide/java_testing.html

rob2universe
źródło
0

Jeśli chcesz dodać zestaw sourceSet do testowania oprócz wszystkich istniejących, w module niezależnie od aktywnego smaku:

sourceSets {
    test {
        java.srcDirs += [
                'src/customDir/test/kotlin'
        ]
        print(java.srcDirs)   // Clean
    }
}

Zwróć uwagę na operatora +=i jeśli chcesz uruchomić testy integracyjne zmień testna androidTest.

GL

Braian Coronel
źródło