我可以看到这样做的几个原因,特别是在利用Junnit进行功能测试或测试持久性物体时。 例如,审议一个物体代码<>第,该编码一直保留到某种持久性储存中。 如果我要根据单位测试原则测试<代码>第<条/代码>物体的“所有测试都应重新排序,只测试功能的具体部分”,我将进行三项测试:
testInsertArticle()
testUpdateArticle()
testDeleteArticle()
然而,为了能够测试更新功能,我首先需要插入这一条。 为了测试删除的功能,我还需要插入一条。 因此,在实践中,插入功能已在<编码>测试最新条款()和testDeleteArticle(
>上测试。 然后,它只是想建立一种测试方法(, 测试所有功能性(
),但最终会产生巨大的方法(它们赢得了>第
目标功能的只试部分)。
运行功能测试,例如针对有余的抗体反应器。 如果对测试的定论定得不定,那么日本特尼特对这些案例也是很大的。
尽管如此,我延长了Michael D s OrderedRunner
,以使用说明确定测试次序,我应当赞同。 还可以进一步扩大,例如,具体指明每个测试取决于哪些测试,但这是我现在使用的。
这就是如何使用。 它避免了诸如<代码>A_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
}
}
无论这些测试如何放入档案,都永远作为<条码>{>>>>>第1条,<条码>第2条代码>第2条,第2条>第二和最后一条<条码>,无论你是在Eclipse,使用Ant,还是以任何其他方式从中操作。
执行如下。 首先,说明<编码>。
@Retention(RetentionPolicy.RUNTIME)
public @interface Order {
public int order();
}
随后,修改后的<代码>OrderedRunner。
public class OrderedRunner extends BlockJUnit4ClassRunner {
public OrderedRunner(Class<?> klass) throws InitializationError {
super(klass);
}
@Override
protected List<FrameworkMethod> computeTestMethods() {
List<FrameworkMethod> copy = new ArrayList<>(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 0;
if (o1 == null) return 1;
if (o2 == null) return -1;
return o1.order() - o2.order();
}
});
return list;
}
}