先从 JUnit 基类运行测试,然后再从子类运行测试



对于某种类型的测试,我有一个抽象的超类和扩展这个超类的子类。在超类中,我有一个名为 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,但它返回truefalse,而不是引发异常。

由于这是纯 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注释。

最新更新