除了使用集成测试运行器在IntelliJ IDEA项目中以“IntegrationTest”结尾的所有JUnitunit testing之外,我该如何运行?

我基本上想要在我的IntelliJ IDEA项目中运行所有JUnit 单元测试(不包括JUnit集成测试),使用JUnit的static suite()方法。 为什么要使用static suite()方法? 因为我可以使用IntelliJ IDEA的JUnit测试运行器在我的应用程序中运行所有unit testing(并通过命名约定轻松排除所有集成测试)。 到目前为止,代码如下所示:

package com.acme; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class AllUnitTests extends TestCase { public static Test suite() { List classes = getUnitTestClasses(); return createTestSuite(classes); } private static List getUnitTestClasses() { List classes = new ArrayList(); classes.add(CalculatorTest.class); return classes; } private static TestSuite createTestSuite(List allClasses) { TestSuite suite = new TestSuite("All Unit Tests"); for (Iterator i = allClasses.iterator(); i.hasNext();) { suite.addTestSuite((Class) i.next()); } return suite; } } 

应该重写方法getUnitTestClasses()以添加扩展TestCase的所有项目类,除非类名以“IntegrationTest”结尾。

我知道我可以在Maven中轻松地做到这一点,但是我需要在IntelliJ IDEA中这样做,所以我可以使用集成测试运行器 – 我喜欢绿色条:)

我写了一些代码来完成大部分工作。 仅当您的文件位于本地磁盘而不是JAR中时,它才有效。 你需要的只是包中的一个类。 为此,您可以创建一个Locator.java类,以便能够找到该包。

 public class ClassEnumerator { public static void main(String[] args) throws ClassNotFoundException { List> list = listClassesInSamePackage(Locator.class, true); System.out.println(list); } private static List> listClassesInSamePackage(Class locator, boolean includeLocator) throws ClassNotFoundException { File packageFile = getPackageFile(locator); String ignore = includeLocator ? null : locator.getSimpleName() + ".class"; return toClassList(locator.getPackage().getName(), listClassNames(packageFile, ignore)); } private static File getPackageFile(Class locator) { URL url = locator.getClassLoader().getResource(locator.getName().replace(".", "/") + ".class"); if (url == null) { throw new RuntimeException("Cannot locate " + Locator.class.getName()); } try { return new File(url.toURI()).getParentFile(); } catch (URISyntaxException e) { throw new RuntimeException(e); } } private static String[] listClassNames(File packageFile, final String ignore) { return packageFile.list(new FilenameFilter(){ @Override public boolean accept(File dir, String name) { if (name.equals(ignore)) { return false; } return name.endsWith(".class"); } }); } private static List> toClassList(String packageName, String[] classNames) throws ClassNotFoundException { List> result = new ArrayList>(classNames.length); for (String className : classNames) { // Strip the .class String simpleName = className.substring(0, className.length() - 6); result.add(Class.forName(packageName + "." + simpleName)); } return result; } } 

如何将每个主要的junit测试组放入他们自己的root包中。 我在我的项目中使用这个包结构:

 test. quick. com.acme slow. com.acme 

在没有任何编码的情况下,您可以设置IntelliJ来运行所有测试,只需快速测试或慢速测试。

那么使用JUnit4和Suite-Runner呢?

例:

 @RunWith(Suite.class) @Suite.SuiteClasses({ UserUnitTest.class, AnotherUnitTest.class }) public class UnitTestSuite {} 

我做了一个小的Shell脚本来查找所有unit testing,另一个用于查找我的集成测试。 看看我的博客文章: http : //blog.timomeinen.de/2010/02/find-all-junit-tests-in-a-project/

如果使用Spring TestContext,则可以使用@IfProfile Annotation声明不同的测试。

亲切的问候,Timo Meinen

Spring在PathMatchingResourcePatternResolver中实现了一个出色的类路径搜索function。 如果使用classpath *:前缀,则可以找到所有资源,包括给定层次结构中的类,甚至可以根据需要过滤它们。 然后,您可以使用AbstractTypeHierarchyTraversingFilter,AnnotationTypeFilter和AssignableTypeFilter的子项在类级别注释或它们实现的接口上过滤这些资源。

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/core/io/support/PathMatchingResourcePatternResolver.html

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.html

解决方案: https : //github.com/MichaelTamm/junit-toolbox
使用以下function

 @RunWith(WildcardPatternSuite.class) @SuiteClasses({"**/*.class", "!**/*IntegrationTest.class"}) public class AllTestsExceptionIntegrationSuit { } 

假设您遵循命名模式,其中集成测试结束于… IntegrationTest并将文件放在最顶层的包中(因此** / * .class搜索将有机会获取所有测试)