【问题标题】:How to use TestNG to create multi-user tests scenarios?如何使用 TestNG 创建多用户测试场景?
【发布时间】:2011-12-06 23:30:45
【问题描述】:

我需要做的是为我们的应用程序创建 UI 测试用例,我们决定将 Selenium 与 TestNG 一起使用(如果有相当大的优势,我们仍然愿意接受其他选择)。

我们正在尝试创建的测试是多个用户使用应用程序相互交互的测试。基本上,我们需要让多个用户并行登录到我们的应用程序并执行不同的操作。用户的操作之间存在关系,因此他们需要在某些点上同步他们的交互(例如,用户需要等待不同的用户执行操作,然后才能执行他的操作)。这意味着用户之间还需要有某种共享信息(我只是在考虑共享一个负责同步点的对象)。

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

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

编辑:
到目前为止,我能做的最好的事情是创建一个测试,其中每个 @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 代码不会很明显)。我也不喜欢这样一个事实,即我将无法通过执行“运行方式 - TestNG 测试”在 eclipse 上使用 TestNG 插件来简单地运行测试。同样,非常欢迎任何建议。谢谢!

【问题讨论】:

    标签: java design-patterns testing selenium testng


    【解决方案1】:

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

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

    我推荐你的方法是使用来自java.util.concurrent 包的ExecutorService 框架。

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

    ExecutorService executorService = Executors.newFixedThreadPool(2);
    

    接下来使用 executor 使用 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();
            }
        });
    
    
    
    
    }
    

    【讨论】:

    • 感谢您的建议,但是,我正在寻找一种解决方案,我可以利用一些 TestNG 功能来帮助我以更简单、更简洁的方式编写这些测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多