我正在使用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);
}
所以我的问题是我是否需要使所有这些方法都变为非静态,否则对并行执行没有任何影响?
答案 0 :(得分:2)
这肯定会导致随机故障。您的流程中将只有一个静态资源实例。这意味着每个试图访问此静态资源的线程都可能遇到另一个线程试图访问相同的静态资源的情况。
让我们以您的:: assertResult函数为例。两个线程可以同时使用“ actual”和“ expected”参数的不同值来访问此函数。由于assertTrue不是原子操作,因此可以在两个线程之间混合数据值(实际值和期望值)。这可能会给您带来意想不到的结果。我会为您推荐一个更好的多线程功能设计,但是要快速解决此问题,您可以在多个线程可以同时访问的所有方法的函数定义中使用synced关键字。
sql bulk load
尽管有比添加同步关键字更好的解决方案,这应该在您的重新设计练习中出现。在这种情况下,添加同步关键字的一个明显问题是执行时间会增加一小部分。这是因为当多个线程尝试访问同步方法时,它们将开始等待其他线程。