为了清楚起见,我已将问题从所有不必要的复杂性中删除并附加了两个文件。实际上,我想从数据库加载所需的输入以进行测试。在示例中,我在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;
}
}
答案 0 :(得分:0)
我认为不可能达到你想要的效果。据我所知(并且经验丰富),只有“真正的”junit方法(现有类中的实际方法)可以从junit窗口执行(这在使用参数化测试时很容易重现。特定的测试无法运行在这里再次)。
也许你应该尝试为测试生成java代码(并编译它)。
答案 1 :(得分:0)
如果您覆盖runTest()
并从TestSuite
班级创建TestCase
,则会容易得多。
以下是一个有效的示例: http://mrlalonde.blogspot.ca/2012/08/data-driven-tests-with-junit.html