gpt4 book ai didi

java - 单个静态方法是否会导致并行执行时测试失败 - selenium

转载 作者:行者123 更新时间:2023-12-02 01:56:07 25 4
gpt4 key购买 nike

我正在使用 Selenium 来自动化测试用例。我正在使用 TestNG 以并行模式执行测试用例,这会导致一些随机测试失败。如果我在非并行模式下执行相同的操作,那么所有测试都会通过。

我是从here知道这件事的您代码中的静态资源可能会导致问题。

我有一个公共(public)类,我在其中创建了一些公共(public)方法,并且所有方法都是静态的。例如

public static String formatString(String loc, String val) {

return String.format(getBundle().getString(loc), getBundle().getString(val));
}

public static QAFWebElement getQAFExtendedWebElement(String loc, String str) {

return new QAFExtendedWebElement(
String.format(getBundle().getString(loc), getBundle().getString(str)));
}

public static void assertResult(String actual, String expected) {

assertTrue(actual.contains(expected),
"FAILED : Actual : " + actual + " Expected : " + expected,
"PASSED : Actual : " + actual + " Expected : " + expected);
}

所以我的问题是我是否需要使所有这些方法成为非静态或者它对并行执行没有任何影响?

最佳答案

这肯定会导致随机故障。您的进程中只有一个静态资源实例。这意味着尝试访问此静态资源的每个线程都可能遇到另一个线程尝试访问相同静态资源的情况。

让我们以::assertResult 函数为例。该函数可以由两个线程同时使用不同的“实际”和“预期”参数值访问。由于assertTrue 不是原子操作,因此数据(实际值和预期值)可以在两个线程之间混合。这可能会给您带来意想不到的结果。我会为您推荐一个更好的多线程设计,但为了快速解决这个问题,您可以在所有可以同时被多个线程访问的方法的函数定义中使用synchronized关键字。

public synchronized static void assertResult(String actual, String expected) {

assertTrue(actual.contains(expected),
"FAILED : Actual : " + actual + " Expected : " + expected,
"PASSED : Actual : " + actual + " Expected : " + expected);
}

尽管有比添加同步关键字更好的解决方案,但它应该在您的重新设计练习中出现。在这种情况下,添加同步关键字的一个明显问题是执行时间会增加一小部分。这是因为多个线程在尝试访问同步方法时将开始等待其他线程。

关于java - 单个静态方法是否会导致并行执行时测试失败 - selenium,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52251381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com