对于某种类型的测试,我有一个抽象的超类和扩展这个超类的子类。在超类中,我有一个名为 test0IfDirectoryCopied
的测试,它总是在测试子类时执行。它检查子类中设置的资源是否正确设置。
虽然这非常好,但不幸的是,只有在子类中的所有测试都运行完毕后,才会执行此test0IfDirectoryCopied
。由于它作为一种前提条件,如果在任何子类测试之前执行它将是最有帮助的。
附加信息:子类和超类都用 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
注释,test0IfDirectoryCopied
在字典上是最小的条目
JUnit 的最新版本Assume
. 基本上,如果假设失败,则忽略测试。
如果将其放在@Before
中并且失败,则将忽略测试类中的每个测试。
import static org.junit.Assume.*;
public class TestMySubClass extends TestSuperClass{
@Before
public void makesureDirectoryCopied(){
assumeTrue( directoryCopied());
}
...
其中directoryCopied()
类似于您的test0ifDirectoryCopied
,但它返回true
或false
,而不是引发异常。
由于这是纯 JUnit,因此不需要其他依赖项。
有关详细信息,请参阅假设教程
如果是前提条件 您可以尝试使用@before注释来注释前提条件。但仍然:
你可以试试Junit.contrib来做这件事。https://github.com/junit-team/junit.contrib/tree/master/assumes
您可以尝试定义一个测试套件并一个接一个地运行它
您可以尝试使用 testng 和@dependson注释
在不知道test0IfDirectoryCopied
的细节的情况下,我认为实现可以添加到每个测试类的规则将是最好的解决方案。这也允许您摆脱测试类层次结构。
我找到了一个开箱即用的JUnit解决方案。我真正想要的是整个测试类层次结构中的字典测试执行顺序(尽管也可以定义其他策略,例如始终首先在基类中执行测试)。我发现实现这一目标的最简单方法是实现我自己的TestClassRunner:
public class LexicographicalTestOrderRunner extends BlockJUnit4ClassRunner {
public LexicographicalTestOrderRunner(Class<?> klass) throws InitializationError {
super(klass);
}
@Override
protected List<FrameworkMethod> getChildren() {
List<FrameworkMethod> children = super.getChildren();
Collections.sort(children, new Comparator<FrameworkMethod>() {
@Override
public int compare(FrameworkMethod o1, FrameworkMethod o2) {
return o1.getName().compareTo(o2.getName());
}
});
return children;
}
}
在我的基类中指定这个运行器就足够了,使用:
@RunWith(LexicographicalTestOrderRunner.class)
作为这样做的另一个好处,我现在可以删除子类中的所有@FixMethodOrder
注释。