无法使用JUnit和Eclipse进行单一单元测试以进行数据驱动测试

时间:2011-03-28 13:22:55

标签: java eclipse junit4

为了清楚起见,我已将问题从所有不必要的复杂性中删除并附加了两个文件。实际上,我想从数据库加载所需的输入以进行测试。在示例中,我在Suites类中使用套件映射,而不是查询的结果。我还有一个相当复杂的比较,而不是TestOverride的run方法中的简单比较。基本上,这就是我如何通过动态方式从数据库(套件图)中解决创建测试套件的方法。另外,当我使用eclipse运行它时,能够看到测试名称非常重要。

如果你运行Suites(只需右键单击它并在eclipse上运行JUnit)就可以了。唯一通过的测试是test4。但是,我希望能够使用这种类型的构造运行单个测试(单个套件也会很好,但我会对单个测试感到满意)。换句话说,在运行所有套件之后,我想进入JUnit窗口,右键单击一个测试并运行它。如果我这样做它不起作用。我不知何故认为测试是在第一次运行之后存储在某个地方,以后我可以使用它们。

我正在使用eclipse 3.6和JUnit 4.0

有什么想法吗?我没有对参数化类使用注释,因为在编译时必须知道所有内容(并且我从数据库中获取输入)。我也在论坛中看到用这种方法重命名测试用例是一个很大的问题。

import java.util.HashMap;
import java.util.Map;

import junit.framework.Test;
import junit.framework.TestSuite;

public class Suites {

public static Test suite() {
    Map<String, String[]> suites = new HashMap<String, String[]>();
    suites.put("suite1", new String[]{"test1", "test2"});
    suites.put("suite2", new String[]{"test3", "test4"});

    TestSuite all = new TestSuite("All Suites");
    for(Map.Entry<String, String[]> entry : suites.entrySet()) {
        TestSuite suite = new TestSuite(entry.getKey());
        for(String testName : entry.getValue()) {
            suite.addTest(
                    new TestOverride(
                            testName
                    )
            );
        }
        all.addTest(suite);
    }
    return all;
}
}

import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import junit.framework.TestResult;

public class TestOverride extends TestCase {

private String name;

public TestOverride(
        String name)
{
    this.name = name;
}

@Override
public void run(TestResult result) {
    result.startTest(this);
    if (this.name.equals("test4")) {
        result.endTest(this);
    } else {
        result.addFailure(this, new AssertionFailedError("Not test4"));
    }  
}

@Override
public String getName() {
    return name;
}
}

2 个答案:

答案 0 :(得分:0)

我认为不可能达到你想要的效果。据我所知(并且经验丰富),只有“真正的”junit方法(现有类中的实际方法)可以从junit窗口执行(这在使用参数化测试时很容易重现。特定的测试无法运行在这里再次)。

也许你应该尝试为测试生成java代码(并编译它)。

答案 1 :(得分:0)

如果您覆盖runTest()并从TestSuite班级创建TestCase,则会容易得多。

以下是一个有效的示例: http://mrlalonde.blogspot.ca/2012/08/data-driven-tests-with-junit.html

相关问题