12

基本的に、JUnit の static suite() メソッドを使用して、IntelliJ IDEA プロジェクト (JUnit 統合テストを除く) ですべての JUnit 単体テスト実行したいと考えています。static suite() メソッドを使用する理由 その後、IntelliJ IDEA の JUnit テスト ランナーを使用して、アプリケーション内のすべての単体テストを実行できます (命名規則によってすべての統合テストを簡単に除外できます)。これまでのコードは次のようになります。

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<? extends TestCase>) i.next());
        }
        return suite;
    }

}

メソッド getUnitTestClasses() を書き直して、クラス名が「IntegrationTest」で終わる場合を除き、TestCase を拡張するすべてのプロジェクト クラスを追加する必要があります。

たとえば、Maven でこれを簡単に実行できることはわかっていますが、統合テスト ランナーを使用できるように IntelliJ IDEA で実行する必要があります。緑色のバーが気に入っています :)

4

5 に答える 5

8

junit テストの各主要グループを独自のルート パッケージに入れるのはどうでしょうか。プロジェクトでこのパッケージ構造を使用します。

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

コーディングを一切行わずに、IntelliJ をセットアップして、すべてのテスト (高速なテストのみ、または低速なテストのみ) を実行できます。

于 2008-10-07T18:15:46.210 に答える
7

ほとんどの作業を行うためのコードをいくつか書きました。ファイルが JAR ではなくローカル ディスクにある場合にのみ機能します。必要なのは、パッケージ内の 1 つのクラスだけです。この目的のために、パッケージを検索できるようにするためだけに Locator.java クラスを作成できます。

public class ClassEnumerator {
    public static void main(String[] args) throws ClassNotFoundException {
        List<Class<?>> list = listClassesInSamePackage(Locator.class, true);

        System.out.println(list);
    }

    private static List<Class<?>> 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<Class<?>> toClassList(String packageName, String[] classNames)
                                                             throws ClassNotFoundException {

        List<Class<?>> result = new ArrayList<Class<?>>(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;
    }
}
于 2008-10-07T11:30:57.493 に答える
5

JUnit4とSuite-Runnerの使用はどうですか?

例:

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

すべての単体テストを見つけるために小さなシェルスクリプトを作成し、統合テストを見つけるために別のシェルスクリプトを作成しました。私のブログエントリを見てください:http: //blog.timomeinen.de/2010/02/find-all-junit-tests-in-a-project/

Spring TestContextを使用する場合は、@IfProfileアノテーションを使用してさまざまなテストを宣言できます。

よろしくお願いいたします。TimoMeinen

于 2010-02-28T16:06:40.523 に答える
0

解決策: https://github.com/MichaelTamm/junit-toolbox
次の機能を使用します

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

統合テストが ...IntegrationTest で終わり、ファイルを最上位のパッケージに配置する命名パターンに従っていると仮定します (したがって、 **/*.class 検索ですべてのテストを取得する機会があります)。

于 2016-06-16T00:41:01.167 に答える
0

Spring は、PathMatchingResourcePatternResolver に優れたクラスパス検索機能を実装しました。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

于 2010-09-03T14:33:24.440 に答える