0

我在 netbeans 上创建了一个 java 项目,该项目在项目的测试包中有一些测试。

当我通过 Project->Menu->Test 测试项目并通过使用所有类测试文件创建 junit4Suite 进行测试时,我有不同的行为。

例如,一个区别是速度:

  • 通过套件进行测试:58 次测试(全部)需要 2.7 秒
  • 通过 Project->Menu->Test 进行测试:58 test(all) 需要 14.9 秒

当 netbeans 通过 Project->Menu->Test 测试项目时,后台会发生什么?

编辑

该项目非常小,因此 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
            }
        });
    }
}

新测试套件.java

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

当我通过 Project->Menu->Test 执行测试时:“两个测试都通过了”

但是当我通过 NewTestSuite.java->Menu->Test 文件执行测试时:“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,并为收集所有嵌套的 s 创建一个 VM。请注意,只有具有相同 filtertrace、haltonerror、haltonfailure、errorproperty 和 failureproperty 设置的测试才能共享一个 VM,因此即使您将 forkmode 设置为“once”,Ant 也可能需要创建多个 Java VM。对于未派生到新 Java VM 中的测试,此属性将被忽略。自蚂蚁 1.6.2

结论:Netbeans 在 forkMode=perTest 中运行 junit 测试,所以它为每个 TestCase 类创建一个新的 VM,否则 NewTestSuite 只使用一个 VM。

有关 forkMode=perTest 的更多详细信息: junit:forkMode="once" 对测试正确性的影响

于 2013-10-21T20:39:27.243 回答
0

Netbeans 像其他 IDE 一样在运行之前制作项目。用于同步资源和检查文件状态的时间,必要时编译由 IDE 花费。如有必要,它可以配置为执行其他任务,如 ant run、maven build 等。

于 2013-10-21T18:58:55.880 回答