0

私は netbeans で作成された Java プロジェクトを持っています。プロジェクトには、プロジェクトのテスト パッケージにいくつかのテストがあります。

Project->Menu->Test を介してプロジェクトをテストし、すべてのクラス Test ファイルを使用して junit4Suite を作成してテストすると、動作が異なります。

たとえば、1 つの違いは速度です。

  • スイートによるテスト: 58 テスト (すべて) には 2.7 秒かかります
  • Project->Menu->Test によるテスト: 58 テスト (すべて) は 14.9 秒かかります

Project->Menu->Test を介して netbeans がプロジェクトをテストしているときに、バックグラウンドで何が起こるのですか?

編集

プロジェクトは非常に小さいため、netbeans がテストを実行するまでにかかる時間は約 1 秒です。

別の違い:

一度しか実行できないメソッドを使用して、別のダミー プロジェクトを作成しました。

public class ScriptThreadWorker {

    private static ScriptThreadWorker worker;
    private Thread thread;

    public static ScriptThreadWorker getWorker() {
        if (worker == null) {
            worker = new ScriptThreadWorker();
        }
        return worker;
    }

    public void runOnScriptThread(Runnable task) {
        if (thread != null) {
            throw new RuntimeException("you can run once");
        }

        thread = new Thread(task);
        thread.setName("ui-thread");
        thread.start();
    }
}

そして、junit スイートを使用して 2 つの同一の 2 つのテスト クラスを作成しました。

ScriptThreadWorker1Test.java

public class ScriptThreadWorker1Test {

    @Test
    public void testRun1() {
        ScriptThreadWorker.getWorker().runOnScriptThread(new Runnable() {
            @Override
            public void run() {
                // do nothing
            }
        });
    }
}

ScriptThreadWorker2Test.java

public class ScriptThreadWorker2Test {

    @Test
    public void testRun1() {
        ScriptThreadWorker.getWorker().runOnScriptThread(new Runnable() {
            @Override
            public void run() {
                // do nothing
            }
        });
    }
}

NewTestSuite.java

@RunWith(Suite.class)
@Suite.SuiteClasses({
    javaapplication3.ScriptThreadWorker2Test.class,
    javaapplication3.ScriptThreadWorker1Test.class})
public class NewTestSuite {
}

Project->Menu->Test からテストを実行すると、「両方のテストに合格しました」

しかし、NewTestSuite.java->メニュー->テストファイルからテストを実行すると、「1つのテストに合格し、1つのテストでエラーが発生しました。1回実行できます」。

4

2 に答える 2

0

私自身の質問に答える:

Netbeans は ant を介してコマンドを実行するため、${project_name}private/build-impl.xml には、プロジェクト IDE コマンドに関するすべてのロジックがあります。

単体テストを実行するために、IDE は junit ant のタスクを使用します。

<macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
            <attribute default="${includes}" name="includes"/>
            <attribute default="${excludes}" name="excludes"/>
            <attribute default="**" name="testincludes"/>
            <attribute default="" name="testmethods"/>
            <element name="customize" optional="true"/>
            <sequential>
                <property name="junit.forkmode" value="perTest"/>
                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
                    <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
                    <syspropertyset>
                        <propertyref prefix="test-sys-prop."/>
                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
                    </syspropertyset>
                    <formatter type="brief" usefile="false"/>
                    <formatter type="xml"/>
                    <jvmarg value="-ea"/>
                    <customize/>
                </junit>
            </sequential>
        </macrodef>

興味深い行は次のとおりです。

<property name="junit.forkmode" value="perTest"/>

Junit タスクのドキュメント junit.forkmode から:

一部のテストをフォークする場合に作成される Java 仮想マシンの数を制御します。可能な値は、"perTest" (デフォルト)、"perBatch"、および "once" です。「once」はすべてのテストに対して単一の Java VM のみを作成しますが、「perTest」は各 TestCase クラスに対して新しい VM を作成します。「perBatch」は、ネストされたそれぞれの VM と、ネストされたすべての を収集する VM を作成します。VM を共有できるのは、filtertrace、haltonerror、haltonfailure、errorproperty、failureproperty の設定が同じテストのみであるため、forkmode を「once」に設定した場合でも、Ant は複数の Java VM を作成する必要がある場合があることに注意してください。この属性は、新しい Java VM にフォークされないテストでは無視されます。Ant 1.6.2 以降

結論: Netbeans は forkMode=perTest で junit テストを実行するため、TestCase クラスごとに新しい VM を作成します。それ以外の場合、NewTestSuite は 1 つの VM のみを使用します。

forkMode=perTest の詳細について は、junit: テストの正確性に対する forkMode="once" の影響

于 2013-10-21T20:39:27.243 に答える