Selenium junit测试 - 我如何按顺序在测试中运行测试?

问题描述:

我使用junit和eclipse编写函数测试。Selenium junit测试 - 我如何按顺序在测试中运行测试?

运行单个测试时,它按照我在课堂上设置的顺序运行。

例如,

testCreateUser 
testJoinUserToRoom 
testVerify 
testDeleteUser 

然而,当我运行该测试作为套件的一部分,(因此在一个包中)的顺序是随机的。

它将例如进行验证,然后删除用户,然后加入userToRoom,然后删除用户。

我在套件中的测试不相互依赖。然而,测试中的每个单独测试都依赖于它们以正确的顺序运行。

有什么办法可以实现这个目标吗?

谢谢。

你补充不能保证在JUnit中执行测试方法的顺序。

测试的执行的一套保证(如果你使用Suite)内的顺序,但执行的顺序,如果测试类是通过反射发现不是(举例来说,如果你在Eclipse中运行一个包,或者从maven或ant运行一组测试)。这可以由ant或maven来定义,但它并不是由JUnit定义的。

一般而言,JUnit的执行顺序的测试方法在它们被在源文件中所定义,但不是所有的JVM保证这一点(格外与JVM 7)。如果某些方法是从抽象基础测试类继承的,那么这可能不适用。 (这听起来像你的情况,但我不能从你的描述中知道)。

欲了解更多信息,请参阅我的回答Has JUnit4 begun supporting ordering of test? Is it intentional?

那么你能做些什么来解决你的问题?有两种解决方案。在你原来的例子中,你实际上只有一个测试(验证),但你有4个方法,两个设置(createUser,joinUserToRoom)和一个拆卸(deleteUser)。所以你的第一个选择是更好地定义你的测试用例,使用TestRule,特别是ExternalResourceExternalResource允许您定义测试的前/后行为,类似于@Before/@After。但是,ExternalResource的优势在于,您可以将这个因素排除在测试之外。

所以,你需要创建/删除用户在外部资源:

public class UsesExternalResource { 
    @Rule 
    public ExternalResource resource= new ExternalResource() { 
     @Override 
     protected void before() throws Throwable { 
      // create user 
     }; 

     @Override 
     protected void after() { 
      // destroy user 
     }; 
    }; 

    @Test 
    public void testJoinUserToRoom() { 
     // join user to room 
     // verify all ok 
    } 
} 

对于我来说,这是更简单,更容易理解,你会得到独立的测试,这是一件好事。这是我会做的,但是你需要重构你的测试。您也可以使用RuleChain来堆叠这些规则。

如果您真的想介绍测试方法之间的依赖关系,您的第二个选择是查看TestNG,您可以在其中定义从一个测试到另一个测试的依赖关系。

如果他们有一个“正确”的顺序,那么他们是不是多重考验,但一个测试,你错误地标注为是多个独立测试。

最佳做法是重写他们的junit批准风格(设置 - 行为 - 验证),由@Before或做任何需要的常用设置@BeforeClass方法支持。

快速解决方法是按顺序调用其他测试方法的单个@ Test-annotated方法。如果您使用Junit不是进行严格的单元测试,而是更像情景驱动的系统测试,那么这将成为首选替代方案。这不一定是这种使用的最佳工具,但在某些情况下它确实工作得很好。

那么,你就必须到目前为止是有一个单一的测试:

@Test public void testUserNominalLifeCycle(... 

可能的话,如果你感觉贤惠,可以通过额外的新的测试,如

@Test public void testUserWhoNeverJoinsARoom(... 
+0

感谢Soru,包内的测试可以按任意顺序运行。但是这些测试中的测试需要按正确的顺序运行。所以它必须以admin身份登录创建一个用户并将该用户加入到一个房间。然后以该用户身份登录并运行测试。我不确定如何在没有任何依赖的情况下运行这种测试......? – 2011-12-15 10:41:07

+0

对于单元式测试,您可以拥有创建所需用户的@Before(或@BeforeClass)以及用于清理它们的相应注释后的函数。 – soru 2011-12-15 12:09:37