Wtyczka Sonaru Gradle ma właściwość sonar.junit.reportPaths, która musi być lista oddzielna przecinka lista katalogów zawierających pliki wyników testów Junit.

W naszym przypadku katalogi pasują do wzoru "^.*/build/test-results/(test|(component|integration)Test)/.*$".

Chcieliśmy wygenerować tę listę za pomocą Fitereree, obejmuje / dopasowywanie.

Ale wydaje się, że fileTree:

  1. Zwraca tylko pliki, a nie katalogów.
  2. Jest ograniczony do globulacji plików w stylu mrówki, a nie pełne wyrażenia regularne.

Po wymachianiu na drodze dłużej niż powinniśmy spędzić na niej, w końcu zrezygnowaliśmy i napisaliśmy go w Javie:

def junitResults() {
    Set<String> testDirs = new LinkedHashSet<>()
    for (File file : files(fileTree(dir: rootDir, include: "**/build/test-results/**"))) {
        testDirs.add(file.getAbsolutePath().replaceAll("/build/test-results/(test|(component|integration)Test)/.*", "/build/test-results/\$1"))
    }
    return testDirs.toArray(new String[testDirs.size()]);
}

To ma tę zaletę, że działa, ale wygląda na idiosynkratyczne.

Czy ktoś wie, jak zastąpić, że z normalnym wyglądem Groovy / Gradle DSL?

2
Jim Showalter 17 marzec 2020, 02:38

2 odpowiedzi

Najlepsza odpowiedź

Może coś z eachDirMatch() w ten sposób

file('path/build/test-results/.').eachDirMatch(/(test|(component|integration)Test)/) { dir ->
    println dir.getPath()
}
1
wp78de 17 marzec 2020, 16:39

WP78DE, Twoja odpowiedź wskazała mnie we właściwym kierunku (użyj pliku, a nie fileTree):

def junitResultsDirs() {
def dirs = []
rootDir.eachDirRecurse { dir ->
    if (dir.absolutePath.matches("^.*/build/test-results/(test|(component|integration)Test)\$")) {
        dirs << dir
    }
}
return dirs;

}

1
Jim Showalter 17 marzec 2020, 18:00