TestNG 测试外部对象的同步

TestNG tests synchronization on outer object

我的情况简而言之:我想执行并行测试。假设我有 4 个凭证对和 32 个测试,它们将在 8 个并行线程(在并行方法级别)中 运行。所以我有标准的生产者-消费者情况,但在并行测试之间。

我的想法是拥有凭证对象列表(我将在 "beforeMethod" 阶段同步测试线程)。前 4 个线程将获取其凭据并将其从列表中删除。所有其他线程将看到空列表并等待它。

第一个测试将完成其执行并将使用的凭据添加回 "afterMethod" 阶段的列表并在此列表上调用通知,等等。但问题是我没有任何合适的地方可以找到这个凭据列表 + 我想使用简单的 "mvn test" 来启动这个过程。任何想法如何添加这种同步?如果 TestNG 中有类似的功能 - 请告诉。

已解决。主要问题是覆盖 TestNG 生命周期 + 保存 maven 测试管理。所以我开始挖掘 TestNG 源代码并得出下一个解决方案:

  1. 扩展 IExecutionListener,它将需要的数据(队列)存储为 public 静态最终成员。
  2. 相同的接口 IExecutionListener 参与 TestNG 生命周期:它有生命周期回调 onExecutionStart 和 onExecutionFinish。第一个用于使用文件中的凭据填充队列,第二个用于简化 GC 工作 - 清理此队列。
  3. 在带有@BeforeMethod 注释的init 方法内部使用了填充队列。注意:不要将队列中的值存储为普通成员,因为您将面临从执行来自相同 class 但不同测试的测试的不同线程覆盖此成员。使用 ThreadLocal 提供此变量的线程隔离。
  4. 适合我的情况的特殊数据结构是 BlockingQueue(在 LinkedBlockingQueue 实现中),take 和 put 为 getter/setter。
  5. 另外不要忘记将您的自定义侦听器添加到您的 xml