junit: search for tests by pattern from top to bottom

assuming traversal of default package is slow or both ways are fast
This commit is contained in:
Anna.Kozlova
2018-03-22 15:53:25 +01:00
parent 28b3a7727f
commit f7da2f2e73
2 changed files with 32 additions and 20 deletions
@@ -83,25 +83,7 @@ public class TestPackage extends TestObject {
instance.setAlternativeResolveEnabled(true);
final TestClassFilter classFilter = getClassFilter(data);
LOG.assertTrue(classFilter.getBase() != null);
long start = System.currentTimeMillis();
if (Registry.is("junit4.search.4.tests.all.in.scope", true)) {
Condition<PsiClass> acceptClassCondition = aClass -> ReadAction.compute(() -> aClass.isValid() && classFilter.isAccepted(aClass));
collectClassesRecursively(classFilter, acceptClassCondition, myClasses);
}
else if (Registry.is("junit4.search.4.tests.in.classpath", false)) {
String packageName = getPackageName(data);
String[] classNames = TestClassCollector.collectClassFQNames(packageName, getRootPath(), getConfiguration(), TestPackage::createPredicate);
PsiManager manager = PsiManager.getInstance(myProject);
Arrays.stream(classNames)
.filter(className -> acceptClassName(className)) //check patterns
.map(name -> ReadAction.compute(() -> ClassUtil.findPsiClass(manager, name, null, true, classFilter.getScope())))
.filter(aClass -> aClass != null)
.forEach(myClasses::add);
LOG.info("Found tests in " + (System.currentTimeMillis() - start));
}
else {
ConfigurationUtil.findAllTestClasses(classFilter, module, myClasses);
}
searchTests(module, classFilter, myClasses);
}
catch (CantRunException ignored) {}
finally {
@@ -122,6 +104,30 @@ public class TestPackage extends TestObject {
};
}
protected void searchTests(Module module, TestClassFilter classFilter, Set<PsiClass> classes) throws CantRunException {
long start = System.currentTimeMillis();
if (Registry.is("junit4.search.4.tests.all.in.scope", true)) {
Condition<PsiClass> acceptClassCondition = aClass -> ReadAction.compute(() -> aClass.isValid() && classFilter.isAccepted(aClass));
collectClassesRecursively(classFilter, acceptClassCondition, classes);
}
else if (Registry.is("junit4.search.4.tests.in.classpath", false)) {
String packageName = getPackageName(getConfiguration().getPersistentData());
String[] classNames =
TestClassCollector.collectClassFQNames(packageName, getRootPath(), getConfiguration(), TestPackage::createPredicate);
PsiManager manager = PsiManager.getInstance(getConfiguration().getProject());
Arrays.stream(classNames)
.filter(className -> acceptClassName(className)) //check patterns
.map(name -> ReadAction.compute(() -> ClassUtil.findPsiClass(manager, name, null, true, classFilter.getScope())))
.filter(aClass -> aClass != null)
.forEach(classes::add);
LOG.info("Found tests in " + (System.currentTimeMillis() - start));
}
else {
ConfigurationUtil.findAllTestClasses(classFilter, module, classes);
}
}
@Nullable
protected Path getRootPath() {
Module module = getConfiguration().getConfigurationModule().getModule();
@@ -17,6 +17,7 @@
package com.intellij.execution.junit;
import com.intellij.execution.CantRunException;
import com.intellij.execution.ConfigurationUtil;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.JavaExecutionUtil;
import com.intellij.execution.configurations.RuntimeConfigurationException;
@@ -74,7 +75,7 @@ public class TestsPattern extends TestPackage {
if (!hasPattern) {
return new SearchForTestsTask(project, myServerSocket) {
@Override
protected void search() throws ExecutionException { }
protected void search() { }
@Override
protected void onFound() throws ExecutionException {
@@ -87,6 +88,11 @@ public class TestsPattern extends TestPackage {
return super.createSearchingForTestsTask();
}
@Override
protected void searchTests(Module module, TestClassFilter classFilter, Set<PsiClass> classes) {
ConfigurationUtil.findAllTestClasses(classFilter, module, classes);
}
@Override
protected boolean acceptClassName(String className) {
String pattern = getConfiguration().getPersistentData().getPatternPresentation();