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

Pri*_*tel 2 eclipse testing junit selenium sequential

我正在使用junit和eclipse来编写函数测试.

运行单个测试时,它按照我在类中设置的顺序运行.

例如.

testCreateUser
testJoinUserToRoom
testVerify
testDeleteUser
Run Code Online (Sandbox Code Playgroud)

但是,当我将此测试作为套件的一部分运行时(因此在包中),顺序是随机的.

例如,它将执行验证,然后删除用户,然后joinuserToRoom,然后执行Createuser.

我在套件中的测试不依赖于彼此.但是,测试中的每个单独测试都依赖于它们以正确的顺序运行.

有什么办法可以实现吗?

谢谢.

Mat*_*ell 6

您无法保证JUnit 中测试方法的执行顺序.

测试的执行顺序类的一个套件中保证(如果你使用的套件),但执行的,如果测试类由反射出现的顺序是不是(例如,如果你在Eclipse中运行的程序包,或来自maven或ant的一组测试).这可以由ant或maven定义,但它不是由JUnit定义的.

通常,JUnit按照源文件中定义的顺序执行测试方法,但并非所有JVM都保证这一点(特别是JVM 7).如果某些方法是从抽象基础测试类继承的,那么这可能也不成立.(这听起来像你的情况,但我无法从你的描述中得知).

有关这方面的更多信息,请参阅我对JUnit4开始支持测试排序的答案这是故意的吗?.

那么你可以做些什么来解决你的问题呢?有两种解决方案.

在您的原始示例中,您实际上只有一个测试(验证),但您有4个方法,两个设置(createUser,joinUserToRoom)和一个拆卸(deleteUser).因此,您的第一个选择是使用TestRule,特别是ExternalResource更好地定义测试用例.ExternalResource允许您定义测试的前/后行为,类似于@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
     }
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这更简单,更容易理解,并且您可以获得独立测试,这是一件好事.这就是我要做的,但你需要稍微重构一下你的测试.您还可以使用RuleChain堆叠这些规则.

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