在junit4中的最后一次测试后执行全局拆解方法

时间:2011-09-10 10:41:57

标签: junit selenium-webdriver junit4

我想知道在执行测试后是否有办法执行某些方法。 我正在使用eclipse,我希望能够运行部分或全部测试,然后执行一些代码, 所以junit总是会在最后一次测试之后执行我的撕裂。

具体问题是我使用的是selenium webdriver,我希望在完成所有测试后执行webdriver的quit方法。首先,我有静态类管理webdriver引用,现在我转移到单例模式。我相信可以有更好的解决方案,但是现在我不想使用任何IoC容器,因为我是java初学者。

到目前为止,我尝试了很少的方法但没有一个成功。

套装方法仅在我执行所有测试时有效:

@RunWith(Suite.class)
@SuiteClasses({SomeTest.class, OtherTest.class, AnotherTest.class})
    public class TestSuit {

    @BeforeClass
    public static void setUp() {
        System.out.println("setting up");
    }

    @AfterClass
    public static void tearDown() {
        System.out.println("tearing down");
    }
}

但如果我只想运行一个测试类或来自一个特定命名空间的所有测试呢?

课后方法只有在我的所有测试都归为一类时才有效。

我相信NUnit已经实现了SetUpFixtureAttribute,这正在做我想要获得的东西,jUnit中有没有对应的东西?

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用TestNG?您可以使用@ BeforeTest / @ AfterTest或@ BeforeSuite / @ AfterSuite在一组测试或测试套件之前/之后运行浏览器打开/关闭方法。 (http://testng.org/doc/documentation-main.html)

<套件><试验><类> ...< /类>< / test> ...< /套件>

就个人而言,我使用@ BeforeMethod / @ AfterMethod来加载和关闭我的浏览器,所以在每次新测试之前我都会得到一个干净的浏览器实例。当然这需要更长的时间,但这只是我根据我正在运行的测试/软件的类型做出的选择。这也允许我在并行线程中运行我的测试,而不必担心我的测试类中的测试分组,如果我使用@ BeforeClass / @ Afterclass。

答案 1 :(得分:0)

如果您想在这种情况下使用JUnit,您可以做的是提供所使用的测试运行器的替代或更改版本。只需在测试用例中设置一个调试标志,然后调试之后发生的事情。迟早你会在正确的位置点击测试运行器实现。

现在是你的时间。只需将该类复制到您的src文件夹中(您可以使用其他src文件夹或在src / test / java中,以免弄乱您的代码库)。现在以你喜欢的各种方式改变类(必须在原始包中并使用原始类名)。

有趣的是,类路径是由(通过eclipse /和其他方式)构建的,您的类首先由引导加载程序加载。这样就可以在原始junit版本有机会加载之前先提取您提供的版本。

现在,您可以调用类似于测试运行器扩展(或任何您想要调用的内容)的内容,并完全控制所有内容,因为您与原始类位于同一个包中。

我自己只是将它扩展为按照在类文件中声明它们的方式对方法进行排序(使用asm来读取类文件以获得正确的方法排序)。

此外,我添加了扫描包和子包以进行其他测试的行为,因此我不必使用套件,甚至不需要为它构建一些类。子套件现在通过发现其他测试用例即时构建。我的套房也是如此。有时候我需要在特定的子包中进行所有测试,所以我放入了一个用套件注释的类。

这就是跑步者通过组合套件来完成的。甚至可以为游戏添加注释。因此,我对@Fast等测试进行了注释,并在我的测试运行器中仅运行快速测试,因为该套件也注释为@Fast。你懂了......