K P*_*ole 39 java unit-testing junit4 junit3
我知道这是不好的做法,但需要做,或者我需要切换到testng.是否有类似于JUnit 3的testSuite的方法来指定要在类中运行的测试的顺序?
Mic*_*l D 62
如果你确定你真的想要这样做:可能有更好的方法,但这就是我能想到的......
JUnit4有一个注释:@RunWith它允许你覆盖测试的默认Runner.
在您的情况下,您可能希望创建一个特殊的子类BlockJunit4ClassRunner,并覆盖computeTestMethods()以按照您希望它们执行的顺序返回测试.例如,假设我想以反向字母顺序执行我的测试:
public class OrderedRunner extends BlockJUnit4ClassRunner {
public OrderedRunner(Class klass) throws InitializationError {
super(klass);
}
@Override
protected List computeTestMethods() {
List list = super.computeTestMethods();
List copy = new ArrayList(list);
Collections.sort(copy, new Comparator() {
public int compare(FrameworkMethod o1, FrameworkMethod o2) {
return o2.getName().compareTo(o1.getName());
}
});
return copy;
}
}Run Code Online (Sandbox Code Playgroud)
@RunWith(OrderedRunner.class)
public class OrderOfTest {
@Test public void testA() { System.out.println("A"); }
@Test public void testC() { System.out.println("C"); }
@Test public void testB() { System.out.println("B"); }
}Run Code Online (Sandbox Code Playgroud)
运行此测试会产生:
C B A
对于您的特定情况,您需要一个比较器,它将按照您希望它们执行的顺序按名称对测试进行排序.(我建议使用类似Google Guava的类来定义比较器Ordering.explicit("methodName1","methodName2").onResultOf(...);,其中onResultOf提供了一个将FrameworkMethod转换为其名称的函数......但显然你可以随心所欲地实现它.
jos*_*son 62
我可以看到这样做的几个原因,特别是在使用JUnit运行功能测试或测试持久对象时.例如,考虑一个Article持久存储到某种持久存储的对象.如果我想Article按照单元测试原则测试对象的插入,更新和删除功能"所有测试都应该是可重新排序的,并且仅测试功能的特定部分",我将进行三项测试:
testInsertArticle()testUpdateArticle()testDeleteArticle()但是,为了能够测试更新功能,我首先需要插入文章.要测试删除功能,我还需要插入一篇文章.因此,在实践中,插入功能已经在testUpdateArticle()和中进行了测试testDeleteArticle().然后很容易创建一个testArticleFunctionality()完成所有操作的测试方法,但是这样的方法最终会变得很大(并且它们不会只测试Article对象的部分功能).
对于例如宁静的API运行功能测试也是如此.如果不是为了测试的不确定性排序,JUnit也适用于这些情况.
也就是说,我扩展迈克尔D OrderedRunner来使用注释来确定测试的顺序,只是认为我应该分享.它可以进一步扩展,例如通过准确指定每个测试所依赖的测试,但这就是我现在使用的.
这是它的使用方式.它避免了命名测试,如需要AA_testInsert(),AB_testUpdate(),AC_testDelete(),...,ZC_testFilter()等等.
@RunWith(OrderedRunner.class)
public class SomethingTest {
@Test
@Order(order=2)
public void testUpdateArticle() {
// test update
}
@Test
@Order(order=1)
public void testInsertArticle() {
// test insert
}
@Test
@Order(order=3)
public void testDeleteArticle() {
// test delete
}
}
Run Code Online (Sandbox Code Playgroud)
无论这些测试如何放在文件中,它们将始终作为order=1第一个,order=2第二个和最后一个order=3运行,无论您是从Eclipse内部,使用Ant还是以任何其他方式运行它们.
实施如下.一,注释Order.
@Retention(RetentionPolicy.RUNTIME)
public @interface Order {
public int order();
}
Run Code Online (Sandbox Code Playgroud)
然后,修改OrderedRunner.
public class OrderedRunner extends BlockJUnit4ClassRunner {
public OrderedRunner(Class<?> klass) throws InitializationError {
super(klass);
}
@Override
protected List<FrameworkMethod> computeTestMethods() {
List<FrameworkMethod> list = super.computeTestMethods();
Collections.sort(list, new Comparator<FrameworkMethod>() {
@Override
public int compare(FrameworkMethod f1, FrameworkMethod f2) {
Order o1 = f1.getAnnotation(Order.class);
Order o2 = f2.getAnnotation(Order.class);
if (o1 == null || o2 == null)
return -1;
return o1.order() - o2.order();
}
});
return list;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24506 次 |
| 最近记录: |