2011-12-06 50 views
1

我需要做的是为我们的应用程序创建UI测试用例,并且我们决定使用Selenium和TestNG(如果有相当多的优点,我们仍然对其他选项开放)。如何使用TestNG创建多用户测试场景?

我们试图创建的测试是测试,其中多个用户使用应用程序相互交互。基本上我们需要有多个用户并行登录到我们的应用程序并执行不同的操作。用户的行为之间存在关联,所以他们需要在某些点上同步他们的交互(例如,用户需要等待不同的用户执行某个动作之后才能执行他的动作)。这意味着用户之间还需要有某种共享信息(我只是在考虑共享一个可以处理同步点的对象)。

我该如何构建我需要描述将使用TestNG并行运行的不同用户的操作的场景?

有没有更好的框架或有没有解决这个问题的模式?任何suggestios都欢迎!谢谢。

编辑:
我可以迄今的事情,最好是创建一个测试,其中每个@Test方法有每个用户的操作,然后创建一个套房,我定义的测试方法应并行运行。例如:

public class MultiUserTest { 
    @Test 
    public void user1Interaction() { 
     User user1 = new User(); 
     // user1 performs actions 
    } 

    @Test 
    public void user2Interaction() { 
     User user2 = new User(); 
     // user2 performs actions 
    } 
} 

然后创建一个测试套件,我指定的MultiUserTest的方法应该并行运行。

但是我不太喜欢这个解决方案。我不喜欢这样一个事实,即我依靠XML配置(测试套件)来描述测试的正确行为(通过查看java代码,这不会很明显)。我也不喜欢这样一个事实,即我无法通过在Eclipse上使用TestNG插件通过“Run As - TestNG Test”运行测试。再次,任何建议是非常受欢迎的。谢谢!

回答

0

我认为你可以使用任何你喜欢的测试框架。

问题是,您必须在一个测试方法中异步执行用户操作,并在某个时刻同步它们。

我推荐你的方法是使用包装的ExecutorService框架。

所以首先你必须创建执行人

ExecutorService executorService = Executors.newFixedThreadPool(2); 

下一页使用执行人使用get方法异步运行使用submit方法的任务和同步操作。

见代码示例如下

@Test 
public void test() throws Exception { 

    final User firstUser = new User(); 

    Future<?> firstUserAction = executorService.submit(new Runnable() { 
     @Override 
     public void run() { 
      firstUser.doSomething(); 
      firstUser.doSomethingElse(); 
     } 
    }); 

    final User secondUser = new User(); 
    Future<?> secondUserAction = executorService.submit(new Runnable() { 
     @Override 
     public void run() { 
      secondUser.doSomething(); 
     } 
    }); 


    // synchronization 
    firstUserAction.get(); 
    secondUserAction.get(); 
    // synchronized now 

    secondUserAction = executorService.submit(new Runnable() { 
     @Override 
     public void run() { 
      secondUser.doSomethingElse(); 
     } 
    }); 




} 
+0

感谢您的建议,但是,我一直在寻找一个解决方案,我可以利用一些TestNG的功能,这将帮助我在一个更简单和更清洁的方式编写这些测试。 –