当前位置: 首页 > 知识库问答 >
问题:

在并行执行模式下只需要执行一次设置方法

蒋鹏鹍
2023-03-14

我已经使用testng并行测试用例执行设置,但我只需要执行一次设置方法。

BeforeClass和BeforeMethod也会针对单个线程执行。但我需要在所有线程之前执行一次方法。

如何通过TestNG设置实现这一点?

package com.howtodoinjava.parallelism;

import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class ParallelSuiteTest 
{
    String testName = "";

    @BeforeTest
    @Parameters({ "test-name" })
    public void beforeTest(String testName) {
        this.testName = testName;
        long id = Thread.currentThread().getId();
        System.out.println("Before test " + testName + ". Thread id is: " + id);
    }

    @BeforeClass
    public void beforeClass() {
        long id = Thread.currentThread().getId();
        System.out.println("Before test-class " + testName + ". Thread id is: "
                + id);
    }

    @Test
    public void testMethodOne() {
        long id = Thread.currentThread().getId();
        System.out.println("Sample test-method " + testName
                + ". Thread id is: " + id);
    }

    @AfterClass
    public void afterClass() {
        long id = Thread.currentThread().getId();
        System.out.println("After test-method  " + testName
                + ". Thread id is: " + id);
    }

    @AfterTest
    public void afterTest() {
        long id = Thread.currentThread().getId();
        System.out.println("After test  " + testName + ". Thread id is: " + id);
    }
}

测试NG。xml

<suite name="Test-class Suite" parallel="tests" thread-count="2">
    <test name="Test-class test 1">
        <parameter name="test-name" value="test-method One" />
        <classes>
            <class name="com.howtodoinjava.parallelism.ParallelSuiteTest" />
        </classes>
    </test>
    <test name="Test-class test 2">
        <parameter name="test-name" value="test-method One" />
        <classes>
            <class name="com.howtodoinjava.parallelism.ParallelSuiteTest" />
        </classes>
    </test>
</suite>

共有1个答案

段干浩荡
2023-03-14

下面的示例应该解释我的建议。

package com.rationaleemotions.stackoverflow.qn45371087;

import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class ParallelSuiteTest {
    private static final Object lock = new Object();
    private static boolean initialised = false;

    @BeforeClass
    public void beforeClass() {
        synchronized (lock) {
            if (!initialised) {
                init();
                initialised = true;
            }
        }
    }

    private void init() {
        System.err.println("Initialisation done");
    }

    @Test
    public void testMethodOne() {
        System.err.println("This is a test method running on [" + Thread.currentThread().getId() + "]");
    }

}

套件xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="45371087_Suite" verbose="2" parallel="tests" thread-count="10">
    <test name="45371087_Tests_1">
        <classes>
            <class name="com.rationaleemotions.stackoverflow.qn45371087.ParallelSuiteTest"/>
        </classes>
    </test>
    <test name="45371087_Tests_2">
        <classes>
            <class name="com.rationaleemotions.stackoverflow.qn45371087.ParallelSuiteTest"/>
        </classes>
    </test>
</suite>

以下是输出:

...
... TestNG 6.12 by Cédric Beust (cedric@beust.com)
...
Initialisation done
This is a test method running on [12]
This is a test method running on [11]

===============================================
45371087_Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
 类似资料:
  • 问题内容: 我正在尝试使用jaxb- maven插件使用JAXB将多个XSD转换为不同包中的POJO。我已将其设置为使用多个执行块,然后执行第一个执行块,然后出现一条消息:模式或绑定文件中未检测到更改 这是我pom.xml的摘录: 这是我收到的错误消息: 如果我交换执行块,则第一个总是执行,其余两个块得到相同的消息。 关于如何解决这个问题的任何想法? 问题答案: 通过升级到版本1.6进行了修复 和

  • 从流javadoc: 顺序流/并行流之间没有功能上的区别。输出从不受执行模式影响。 由于性能提高,在给定适当的核数和问题大小以证明开销合理的情况下,并行流始终是优选的。 我们希望编写一次代码并在任何地方运行,而不必关心硬件(毕竟这是Java) 假设这些假设是有效的(有一点元假设没有问题),那么在API中公开执行模式有什么价值呢? 看起来您应该能够声明一个,顺序/并行执行的选择应该在下面的一个层中自

  • 我有一个对我来说很奇怪的问题。我实现了,将使用执行。问题是,它只执行一次。。。 下面是有用的代码(是一个枚举): 有趣的是,如果我用一些if-else语句替换这个开关,它工作得很好,这意味着这个Runnable按照我的要求每50毫秒执行一次。。! 下面是调度设置: 为什么用if-else语句每50ms调用一次Runnable,为什么用switch只调用一次?? 编辑:因为你问,这里是MenuEve

  • 我正在开发一个带有Spring框架和MySQL数据库的J2EE应用程序。我想执行SQL脚本从java(可能与一个请求映射)只有一次。我将sql语句作为键值对存储在属性文件中,并循环遍历每个键并执行语句。 这是正确的做法吗?或者还有其他方法可以做到这一点吗?提前谢谢。 更新: 正如评论中提到的,我尝试了Spring jdbc intiize数据库,但它没有执行sql文件中的所有查询。只有第一个“创建

  • 当我们讨论使用Executors服务处理异步事件时,为什么创建一个新的固定线程池涉及到使用LinkedBlockingQueue?到达的事件完全不依赖,所以为什么要使用队列,因为使用者线程仍然会涉及take Lock的争用?为什么Executors类没有一些混合数据结构(例如并发映射实现),在大多数情况下不需要带锁?

  • 我正在学习angularjs,作为一个测试项目,我正在轮询一个返回活动进程列表(它们的pid)并显示这些进程的服务器。 客户端代码如下所示: 这适用于Firefox和Chrome,但不太适用于Internet Explorer 11。 所有浏览器每秒都执行ReloadData方法,但IE11实际上并不从服务器获取流程数据。Firefox和Chrome确实每秒都会获取数据。我也可以在服务器的输出中看