在 TestNG 中,dependonfunction 如何用于继承

问题描述

假设我在下面定义了两个类 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 调用。

如果你想达到预期的结果,我建议你在其他调用中分离测试,称为测试类并保持在BaseClassDerivedClass中实现

代码看起来像这样

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

这是伪代码。您可以根据您的要求改进它,但尝试将测试与主要实现分开。