【问题标题】:Does single static method can cause the test failure in parallel execution - selenium单个静态方法是否会导致并行执行中的测试失败 - selenium
【发布时间】:2018-09-10 05:04:02
【问题描述】:

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

我从here 了解到代码中的静态资源可能会导致问题。

我有一个通用类,我在其中创建了一些通用方法,并且所有方法都是静态的。例如

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);
    }

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

【问题讨论】:

    标签: java selenium parallel-processing


    【解决方案1】:

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

    让我们以 ::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);
    }
    

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

    【讨论】:

    • 感谢您的回答。让我试着得出结论
    猜你喜欢
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    相关资源
    最近更新 更多