我使用TestNG是为了使用Appium并行运行自动移动测试。
我在一个类中有一个初始化AppiumDriver对象的方法。
我从我的TestNG类中调用这个方法,以便每个线程创建它自己的驱动程序实例。问题是,因为它是一个静态变量,当每个线程试图通过静态方法从另一个类访问驱动程序时:
始终存在冲突,因为每个线程只能访问AppiumDriver对象的单个实现。
我知道我可以绕过这一点,把所有这些代码放在TestNG XML文件通信的一个类中,但是这很混乱,我更喜欢为不同的功能部分有单独的类。
例如,我有一个定制的TestNG监听器,我想在每个测试方法运行后打印每个线程使用的驱动程序详细信息。使用以下方法:
然而,这总是打印最后一个运行线程的驱动程序。
如何确保从方法返回的驱动程序与在
方法中创建的驱动程序一致?
匿名用户
如果您并行运行测试,那么我们需要使用非静态方法来避免冲突。以上所有方法都需要更改为非静态。
您需要按如下所示修改侦听器类,它将正确提供驱动程序详细信息。我们需要从ITestResult
监听器代码:
public class ResultsListener implements ISuiteListener, IInvokedMethodListener {
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
Object currentClass=testResult.getInstance();
WebDriver driver = ((AppiumSetUp) currentClass).getDriver();
System.out.println("Driver details: " + driver);
}
}
编辑:
您可以在所有必需的类中(至少在@BeforeTest方法类中)扩展AppiumSetUp类。因此,您可以直接访问下面的设置方法。出于示例目的,我将类名添加为BeforeTestSetup
public class BeforeTestSetup extends AppiumSetUp{
@BeforeTest(alwaysRun = true)
@Parameters({"platform", "udid", "chromeDriverPort", "chromeDriverPath", "deviceName"})
public void setUp(String platform, String udid, String chromeDriverPort, @Optional String chromeDriverPath, String deviceName) throws Exception {
driver = setUp(platform, udid, chromeDriverPort, deviceName);
}
}
问题内容: 在 多线程中 。我认为这是因为。这是唯一原因吗? 我知道。但为什么? 问题答案: 在多线程中,static没有意义。 恐怕你在做相反的陈述 。静态变量是一种共享资源,可用于在不同线程之间交换某些信息。而且,在访问这种共享资源时我们需要小心。因此,我们需要确保在多线程环境中对静态变量的访问是同步的。 每个线程都有自己的堆栈 这是正确的说法。堆栈仅保存局部变量,而不保存堆中的变量。静态变量
问题内容: 类的静态成员是否在每个进程或线程中仅作为单个实例存在?意思是每个线程都具有自己的类的静态成员变量副本吗? 我的猜测是每个过程,对吗? 问题答案: 静态 字段 为每个类加载器提供一个值。 如果需要每个线程的值,请设置static 。
如何从多个线程同时访问静态变量。 如果我有这样的课 我需要访问线程1的值,比如 从线程2中,我需要设置如下值 这会导致内存冲突吗?。如果是,建议使用什么方法来处理这种情况?。
我一直在读java中的同步,我有一个问题。我看到的例子是,一个类在一个本地对象上创建一个同步块。或者一个同步的方法。这两个都不适合我的情况。所以我有一个类的静态实例,它保存了整个应用程序的所有数据。该类上的变量被创建为“private”,我创建了getter来检索这些值。其中一些值一次只需要一个线程从应用程序中的不同类访问。由于它们被创建为private,所以我使用同步块,如下所示。。。 我可以通
问题内容: 我知道在方法带来同步到该对象之前使用关键字。也就是说,运行对象的同一实例的2个线程将被同步。 但是,由于同步是在对象级别进行的,因此运行对象的不同实例的2个线程将不会同步。如果我们在Java类中有一个由该方法调用的静态变量,则希望它在该类的实例之间同步。这两个实例在2个不同的线程中运行。 我们可以通过以下方式实现同步吗? 确实是因为我们定义了一个静态对象,并且正在使用该锁的关键字,