问题描述
假设我在下面定义了两个类 BaseClass 和 DerivedClass。 base 的 waitPeriod 为 1 分钟,而衍生的 waitPeriod 为 5 分钟。
class BaseClass {
protected String getDatasetType() {
return "BaseClass";
}
@BeforeClass
public void initialize() {
//some initialize
}
@Test
public void waitPeriod() {
long a = 1000*300; //wait 5 minutes
if (getDatasetType().equals("BaseClass")) {
a = 1000*60; // wait 1 minutes
}
try {
Thread.sleep(a);
} catch (InterruptedException e) {
e.printstacktrace();
}
log.info("waitPeriod " + getDatasetType());
}
@Test(dependsOnMethods = {"waitPeriod"})
public void test() {
log.info("test " + getDatasetType());
}
}
public class DerivedClass extends BaseClass {
@Override
protected String getDatasetType() { return "DerivedClass"; }
}
如果在 TestNG 中运行这两个类,最好在 1 分钟后运行一次,它只会触发 BaseClass 的“测试”功能,5 分钟后,它会触发 DerivedClass 的“测试”功能。但是在我的测试运行过程中,它在 1 分钟后触发了两个测试功能。
解决方法
根据您的代码,您在 BaseClass
中添加了 test() 方法。因此,当使用@Test 注解调用方法时,getDatasetType()
将仅通过 BaseClass
调用。
如果你想达到预期的结果,我建议你在其他调用中分离测试,称为测试类并保持在BaseClass
和DerivedClass
中实现
代码看起来像这样
class BaseClass {
protected String getDatasetType() {
return "BaseClass";
}
public void initialize() {
//some initialize
}
public void waitPeriod() {
long a = 1000*300; //wait 5 minutes
if (getDatasetType().equals("BaseClass")) {
a = 1000*60; // wait 1 minutes
}
try {
Thread.sleep(a);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("waitPeriod " + getDatasetType());
}
}
public class DerivedClass extends BaseClass {
@Override
protected String getDatasetType() { return "DerivedClass"; }
}
public class TestClass {
BaseClass baseClass = new BaseClass();
DerivedClass derivedClass = new DerivedClass();
@BeforeTest
public void initialize() {
baseClass.initialize();
}
@Test
public void test_waitPeriod() {
baseClass.waitPeriod();
}
@Test(dependsOnMethods = {"waitPeriod"})
public void test_baseclass() {
baseClass.test();
}
@Test(dependsOnMethods = {"waitPeriod"})
public void test_derivedclass() {
derivedClass.test();
}
}
// other way can be
public class TestClass {
BaseClass baseClass = new BaseClass();
DerivedClass derivedClass = new DerivedClass();
@BeforeTest
public void initialize() {
baseClass.initialize();
}
@Test
public void test_baseclass() {
baseClass.waitPeriod();
baseClass.test();
}
@Test
public void test_derivedclass() {
derivedClass.waitPeriod();
derivedClass.test();
}
}
这是伪代码。您可以根据您的要求改进它,但尝试将测试与主要实现分开。