如何使用TestNG创建多用户测试场景?

时间:2011-12-06 23:30:45

标签: java design-patterns testing selenium testng

我需要做的是为我们的应用程序创建UI测试用例,我们决定将Selenium与 TestNG 一起使用(如果有相当大的优势,我们仍然可以使用其他选项)。< / p>

我们尝试创建的测试是测试,其中多个用户使用应用程序相互交互。基本上我们需要让几个用户并行登录到我们的应用程序中并执行不同的操作。用户的动作之间存在关联,因此他们需要在某些点同步他们的交互(例如,用户需要等待不同的用户在他可以执行他的动作之前执行动作)。这意味着用户之间也需要有某种共享信息(我只是想共享一个将负责同步点的对象)。

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

是否有更好的框架或是否有解决此问题的模式?欢迎任何建议!谢谢。

修改
到目前为止,我能做的最好的事情是创建一个测试,其中每个@Test方法都有每个用户的操作,然后创建一个Suite,我定义测试方法应该并行运行。例如:

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
    }
}

然后创建一个Test Suite,我指定MultiUserTest的方法应该并行运行。

但我真的不喜欢这个解决方案。我不喜欢这样一个事实:我依靠XML配置(Test Suite)来描述我测试的正确行为(仅通过查看java代码就不会明显)。我也不喜欢这样一个事实,即我不能通过“运行为 - TestNG测试”在eclipse上使用TestNG插件来简单地运行测试。同样,任何建议都是非常受欢迎的。谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

我建议您采用的方法是使用java.util.concurrent包中的ExecutorService框架。

首先,您必须创建执行程序

ExecutorService executorService = Executors.newFixedThreadPool(2);

接下来使用执行程序使用submit方法异步运行任务,并使用get方法同步操作。

请参阅下面的代码示例

@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();
        }
    });




}