Может ли один статический метод вызвать сбой теста при параллельном выполнении - селен - PullRequest
0 голосов
/ 10 сентября 2018

Я использую Selenium для автоматизации тестовых случаев. Я выполняю тестовый пример в параллельном режиме, используя TestNG, где он вызывает случайный сбой теста. Если я выполню то же самое в непараллельном режиме, тогда все тесты пройдут успешно.

Я узнал здесь от здесь , что статический ресурс в вашем коде может вызвать проблему.

У меня есть один общий класс, в котором я создал какой-то общий метод, и все методы являются статическими. например,

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

Итак, мой вопрос: нужно ли сделать все эти методы нестатичными или они не влияют на параллельное выполнение?

1 Ответ

0 голосов
/ 10 сентября 2018

Это может определенно вызвать случайные сбои. В вашем процессе будет только один экземпляр статического ресурса. Это означает, что каждый поток, который пытается получить доступ к этим статическим ресурсам, может оказаться в ситуации, когда другой поток пытается получить доступ к тем же статическим ресурсам.

Давайте рассмотрим пример вашей функции :: assertResult. Эта функция может быть доступна двум потокам одновременно с разными значениями «фактических» и «ожидаемых» параметров. Поскольку assertTrue не является атомарной операцией, значения данных (фактические и ожидаемые) могут смешиваться между двумя потоками. Это может привести к неожиданным результатам для вас. Я бы порекомендовал вам лучший дизайн с поддержкой многопоточности, но чтобы быстро решить эту проблему, вы можете использовать синхронизированное ключевое слово в определении функций всех методов, к которым могут обращаться несколько потоков одновременно.

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

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

Хотя есть и лучшие решения, чем добавление синхронизированного ключевого слова, которое должно появиться в вашем упражнении по редизайну. В этом случае одной из видимых проблем добавления синхронизированного ключевого слова будет увеличение времени выполнения на незначительный фактор. Это связано с тем, что несколько потоков начнут ожидать других потоков при попытке доступа к синхронизированному методу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...